hdfs块损坏导致hive执行查询、删除问题时报错。

问题1:hive中无法查询表中的数据信息,但是可以展示表结构等信息。
在hive中建立表,显示表信息均显示成功,部分信息如下:
展示表成功:

show tables;

HDFS hive 小文件 hdfs有文件hive读不出来_hive


展示表属性成功:

describe test;

HDFS hive 小文件 hdfs有文件hive读不出来_big data_02


插入表数据失败:

insert into test values("hello");

HDFS hive 小文件 hdfs有文件hive读不出来_HDFS hive 小文件_03


查询的时候也报错,报错信息如下所示:

select* from test;

HDFS hive 小文件 hdfs有文件hive读不出来_hive_04

这可是真的奇怪,冷静下来想想,查看了最开始插入语句的错误信息,发现了以下信息:

HDFS hive 小文件 hdfs有文件hive读不出来_HDFS hive 小文件_05

即发现在将数据移入hdfs块的时候执行错误,再结合查询结果的错误信息:

HDFS hive 小文件 hdfs有文件hive读不出来_hdfs_06


发现在查询结果的时候无法找到hdfs块来读取数据,因为我们知道hive的数据实际上最终是存储在hdfs上的。结合以上两点,我推测可能是hdfs上的某些块发生了损坏,基于此思路,我便执行了以下命令来检测hdfs块的具体情况:

hdfs fsck /

在执行的截图中,查找到以下信息:

HDFS hive 小文件 hdfs有文件hive读不出来_hive_07


果然,我们可以看到有五个块因为损坏而丢失了。至此,问题的原因找到了,现在我尝试删除这些损失的块,执行以下命令后,即可对根目录下的损失块进行清理。

hdfs fsck / -delete

查看执行结果:

HDFS hive 小文件 hdfs有文件hive读不出来_HDFS hive 小文件_08


清理结束后,损坏块就被清理干净了。然后我们再次进入hive执行查询命令:

select* from test ;

HDFS hive 小文件 hdfs有文件hive读不出来_hdfs_09


OK,查询结果成功返回!这说明了我们保存的数据实际上不位于损失块上,另外一方面,假如hdfs上存在损失的块,也将导致我们的查询和插入操作失败。至此,问题被顺利解决。

小总结:以后发生问题时,我们一定要能够准确定位问题,找到问题发生的本质原因,再根据线索逐步靠近问题,从而解决问题。而仔细查看报错的关键信息,并在此基础之上进行有逻辑性的理性思考,则可以加速我们定位问题,并最终找到解决问题的可行方案。