Hive Hdfs数据损坏问题

Hive Hdfs数据损坏问题,hive,hdfs,hiveql,hortonworks-data-platform,Hive,Hdfs,Hiveql,Hortonworks Data Platform,我们的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 w

我们的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;

您必须手动删除分区,因为
msck repair table
只添加分区,而不删除现有分区

您必须遍历损坏的分区列表。对于内部表,必须是特定的,因为删除分区会删除底层物理文件

ALTER TABLE tkt_hist DROP(如果存在分区)(yr=2015,mn=01,dy=01)

您需要为每个分区执行此操作。您可以将它放在bash脚本中,并使用
hive-e
beeline-e
命令执行它,以使用带引号的查询字符串

若您使用的是外部表,那个么删除所有分区然后修复表就容易多了

ALTER TABLE tkt_hist DROP(如果存在分区(yr''、mn''、dy'')

确保将表修复为拥有配置单元数据库和HDFS路径的用户

MSCK修复表tkt_hist

这将添加表路径中当前可用的分区文件夹,而不添加无效分区


注意:如果您的用户不是目录的所有者,请确保您具有写入权限,并在
配置单元中执行您的工作,因为
beeline
需要绝对所有权才能工作。

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

例如:

set mapreduce.map.java.opts = -Xmx15360m

似乎物理分区不存在,但metastore中存在分区:使用以下命令修复表:msck repair table mytable;执行这个命令安全吗?它实际上是生产数据。导致此问题的原因是,我们意外地在创建受影响表的同一hdfs文件夹中创建了另一个托管表。此命令将为所有缺少的分区创建一个物理目录。换句话说,一些分区信息在metastore中可用,但实际的分区路径不存在。然后它将只创建分区文件路径。就这些。所以我认为它是安全的。你检查过hdfs了吗?对于您收到错误的文件?您使用的配置单元版本是什么?