hdfs数据损坏问题

8ljdwjyq  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(445)

我们的hadoop集群存在数据损坏问题。我们在配置单元上有一个托管表,其中包含按年份划分的三年数据。
下面两个查询运行良好,没有任何问题

select count(*) from tkt_hist table where yr=2015

select count(*) from tkt_hist table where yr=2016

select count(*) from tkt_hist table where yr=2017

然而,当我们尝试每年分组时,下面显示了错误。

Error while compiling statement: FAILED: SemanticException java.io.FileNotFoundException: File hdfs://ASIACELLHDP/apps/hive/warehouse/gprod1t_base.db/toll_tkt_hist_old/yr=2015/mn=01/dy=01 does not exist. [ERROR_STATUS]

当我们指定2015年以外的年份时,即使选择也不起作用。

//this works fine
Select * from tkt_hist where yr=2015 limit 10;

// below throws same  error mentioned above.
Select * from tkt_hist where yr=2016;
tkqqtvp1

tkqqtvp11#

您必须手动删除分区,因为 msck repair table 只添加分区,不删除现有分区。
您必须遍历损坏的分区列表。对于内部表,必须是特定的,因为删除分区会删除底层物理文件。 ALTER TABLE tkt_hist DROP IF EXISTS PARTITION(yr=2015, mn=01, dy=01); 您需要为每个分区执行此操作。您可以将其放入bash脚本中,并使用 hive -e 或者 beeline -e 使用带引号的查询字符串的命令。
如果您使用的是外部表,那么删除所有分区然后修复表就容易多了。 ALTER TABLE tkt_hist DROP IF EXISTS PARTITION(yr<>'', mn<>'', dy<>''); 确保以拥有hivedb和hdfs路径的用户身份修复表。 MSCK REPAIR TABLE tkt_hist; 这将添加表路径中当前可用的分区文件夹,而不添加无效分区。
注意:如果您的用户不是目录的所有者,请确保您具有写入权限并在 hive 作为访问客户端 beeline 工作需要绝对所有权。

qgzx9mmu

qgzx9mmu2#

尝试增加java堆空间(如果不起作用,则增加reducer内存)。
例如:

set mapreduce.map.java.opts = -Xmx15360m

相关问题