【问题标题】:Hive/Hadoop intermittent failure: Unable to move source to destinationHive/Hadoop 间歇性故障:无法将源移动到目标
【发布时间】:2018-02-02 23:31:24
【问题描述】:

有一些关于Hive/Hadoop“无法移动源”错误的SO文章。很多都指向权限问题。

但是,在我的网站中,我看到了同样的错误,但我很确定这与权限问题无关。这是因为问题是间歇性的——它在一天工作但在另一天失败。

因此,我更深入地查看了错误消息。它抱怨未能从

.../.hive-stating_hive.../-ext-10000/part-00000-${long-hash}

源路径到目标路径

.../part-00000-${long-hash}

文件夹。这个观察结果会引起某人的注意吗?

这个错误是由一个超级简单的测试查询触发的:只需在测试表中插入一行(见下文)

错误信息

org.apache.hadoop.hive.ql.metadata.HiveException: 
Unable to move source 
hdfs://namenodeHA/apps/hive/warehouse/some_db.db/testTable1/.hive-staging_hive_2018-02-02_23-02-13_065_2316479064583526151-5/-ext-10000/part-00000-832944cf-7db4-403b-b02e-55b6e61b1af1-c000 
to destination 
hdfs://namenodeHA/apps/hive/warehouse/some_db.db/testTable1/part-00000-832944cf-7db4-403b-b02e-55b6e61b1af1-c000;

触发此错误的查询(但只是间歇性的)

insert into testTable1
values (2);

【问题讨论】:

  • 我以前也遇到过这个问题,但它与镶木地板文件元数据有关。文件类型是否为 parquet。
  • @Manu — 是的,文件类型是 parquet。
  • 还有一个问题,你是在 spark 还是 map reduce 上使用 hive?
  • 请使用此属性并让我知道这是否有效。我会在回答部分回答:set spark.sql.hive.convertMetastoreParquet=false
  • 我正在阅读有关 spark 文档的 hive,此说明可能对我们有所帮助:请注意,您必须拥有一个不包含 Hive jar 的 Spark 版本。意思是不是使用 Hive 配置文件构建的。如果您将使用 Parquet 表,建议同时启用“parquet-provided”配置文件。否则 Parquet 依赖项可能会发生冲突。要从安装中删除 Hive jar,只需在 Spark 存储库下使用以下命令:

标签: hadoop hive apache-spark-sql


【解决方案1】:

感谢所有帮助。我找到了解决方案。我在这里提供我自己的答案。

问题在于“CTAS”create table as ... 操作在失败的insert 命令之前,因为文件系统关闭不当。明显的迹象是会显示一条IOException: Filesystem closed 消息以及失败的HiveException: Unable to move source ... to destination 操作。 (我发现来自 Spark Thrift 服务器的日志消息不是我的应用程序日志)

Caused by: java.io.IOException: Filesystem closed
  at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:808)
  at org.apache.hadoop.hdfs.DFSClient.getEZForPath(DFSClient.java:3288)
  at org.apache.hadoop.hdfs.DistributedFileSystem.getEZForPath(DistributedFileSystem.java:2093)
  at org.apache.hadoop.hdfs.client.HdfsAdmin.getEncryptionZoneForPath(HdfsAdmin.java:289)
  at org.apache.hadoop.hive.shims.Hadoop23Shims$HdfsEncryptionShim.isPathEncrypted(Hadoop23Shims.java:1221)
  at org.apache.hadoop.hive.ql.metadata.Hive.moveFile(Hive.java:2607)

解决方案实际上来自另一篇 SO 文章:https://stackoverflow.com/a/47067350/1168041

但在这里我提供一个摘录,以防文章消失:

将属性添加到 hdfs-site.xml

<property>
    <name>fs.hdfs.impl.disable.cache</name>
    <value>true</value>
</property> 

原因:spark 和 hdfs 使用相同的 api(在底部它们使用相同的实例)。

当直线关闭文件系统实例时。它关闭了 thriftserver 的 文件系统实例也是如此。第二条直线尝试获取实例,它将 总是报告“Caused by: java.io.IOException: Filesystem closed”

请在此处检查此问题:

https://issues.apache.org/jira/browse/SPARK-21725

我没有使用beeline,但CTAS 的问题是一样的。

我的测试序列:

insert into testTable1
values (11)

create table anotherTable as select 1

insert into testTable1
values (12)

在修复之前,create table as … 之后的任何插入都会失败 修复后,这个问题就消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多