【问题标题】:Hdfs data corruption issuehdfs数据损坏问题
【发布时间】:2018-05-14 09:36:26
【问题描述】:

我们的 hadoop 集群存在数据损坏问题。我们在 hive 上有一个托管表,其中包含按年份划分的三年数据。

以下两个查询运行良好,没有任何问题

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;

【问题讨论】:

  • 好像物理分区不存在,但metastore中存在分区:使用这些命令修复表:msck repair table mytable;
  • 执行这个命令安全吗?它的实际生产数据。导致这个问题的原因是我们不小心在创建受影响表的同一个 hdfs 文件夹中创建了另一个托管表。
  • 这个命令将为所有丢失的分区创建一个物理目录。换句话说,一些分区信息在 Metastore 中可用,但实际的分区路径不存在。然后它只会创建分区文件路径。就这样。所以我认为它是安全的。
  • 你检查了 hdfs 吗?对于您遇到错误的文件?
  • 你用的是什么hive版本?

标签: hive hdfs hiveql hortonworks-data-platform


【解决方案1】:

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

例如:

set mapreduce.map.java.opts = -Xmx15360m

【讨论】:

    【解决方案2】:

    您将不得不手动删除分区,因为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<>'');

    确保以拥有 Hive DB 和 HDFS 路径的用户身份修复表。

    MSCK REPAIR TABLE tkt_hist;

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-06
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 2023-04-03
      • 2018-04-26
      相关资源
      最近更新 更多