我的 Amazon EMR Hive 查询因间歇性 hive 暂存 FileNotFoundException 而失败

上次更新时间:2020 年 8 月 28 日

当我尝试使用 Amazon EMR 集群将数据写入位于 Amazon Simple Storage Service (Amazon S3) 存储桶中的 Apache Hive 表时,查询失败并出现以下错误之一:

java.io.FileNotFoundException File s3://awsdoc-example-bucket/.hive-staging_hive_xxx_xxxx 不存在。 java.io.IOException:重命名 src 路径错误

简短描述

当您运行 INSERT INTO、INSERT OVERWRITE 或其他 PARTITION 命令时,Hive 会在表所在的同一 S3 存储桶中创建暂存目录。为了将暂存查询数据写入该 S3 存储桶,Hive 会运行 RENAME 操作。

RENAME 操作包括低级 S3 API 调用,如 HEAD、GET 和 PUT。如果 Hive 在创建该文件之前对密钥名称发出 HEAD 或 GET 请求,则 Amazon S3 将提供“写入后读取”的最终一致性。发生这种情况时,Hive 无法将临时目录重命名为最终输出目录。这会导致一个错误,例如 java.io.IOExceptionjava.io.FileNotFoundException。有关更多信息,请参阅 Amazon S3 数据一致性模型。

解决方法

注意:以下步骤适用于 Amazon EMR 发行版本 3.2.1 及更高版本。如果您的集群使用 Amazon EMR 版本 5.7.0 或更早版本,我们建议升级到版本 5.8.0 或更高版本。版本 5.8.0 及更高版本包括 Hive 2.3.x。Hive 2.3.x 仍可能发生 java.io.IOExceptionjava.io.FileNotFoundException 错误,但仅限于存储在 Amazon S3 中的表。HDFS 表不会发生这些错误,因为 Hive 会在高度一致的 HDFS 位置创建暂存目录,而不是在与所查询的表相同的目录中创建。

1.使用 SSH 连接到主节点。

2.在 /mnt/var/log/hive/user/hadoop/hive.log 目录或 Amazon S3 日志 URI 下的 YARN 应用程序容器日志中找到 Hive 错误日志,如以下示例所示。有关更多信息,请参阅查看日志文件。

s3://awsdoc-example-bucket/elasticmapreduce/j-3ABCDEF2BALUG5/Containers/application_11234567890654_0001/

3. 查找如下错误消息:

2020-08-27T11:53:28,837 ERROR )]: ql.Driver (SessionState.java:printError(1097)) - FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask. Vertex failed, vertexName=Map 6, vertexId=vertex_1525862550243_0001_1_03, diagnostics= killed/failed due to:ROOT_INPUT_INIT_FAILURE, Vertex Input: r initializer failed, vertex=vertex_1525862550243_0001_1_03 , java.io.FileNotFoundException: File s3://awsdoc-example-bucket/folder/subfolder/subfolder/.hive-staging_hive_2020-08-25_09-36-30_835_6368934499747071892-1 does not exist. at com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem.listStatus(S3NativeFileSystem.java:972)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to rename output from: s3://awsdoc-example-bucket/demo.db/folder/ingestion_date=20200827/.hive-staging_hive_2020-08-27_13-52-51_942_3098569974412217069-5/_task_tmp.-ext-10000/_tmp.000000_2 to: s3://awsdoc-example-bucket/demo.db/folder/ingestion_date=20200827/.hive-staging_hive_2019-10-27_13-52-51_942_3098569974412217069-5/_tmp.-ext-10000/000000_2  at org.apache.hadoop.hive.ql.exec.FileSinkOperator$FSPaths.commit(FileSinkOperator.java:247)

4.如果日志中存在任一错误,则表示 Hive 在创建文件之前在 RENAME 操作期间发出了 HEAD 请求。要解决这些错误,请启用 EMRFS 一致视图。有关更多信息,请参阅一致视图。

如果日志中没有任何错误,请参阅如何使用日志来排除 Amazon EMR 中的 Hive 查询问题?

5.如果在启用一致视图后仍出现这些错误,请为一致视图配置其他设置。例如,如果 Amazon DynamoDB 对 EMRFS 表具有限制,请更改 emrfs-site.xml 中的以下参数以增加表的读写容量单位:

fs.s3.consistent.metadata.read.capacity

fs.s3.consistent.metadata.write.capacity

如果由于 java.io.FileNotFoundExceptionjava.io.IOException 而导致请求失败,则 EMRFS 将使用 emrfs-site.xml 中的默认值重试该请求。EMRFS 会继续重试请求,直到 Amazon S3 保持一致或达到 fs.s3.consistent.retryCount 中定义的值为止。如果 EMRFS 在操作成功之前达到重试计数,则您将收到 ConsistencyException。要解决此问题,请增加 fs.s3.consistent.retryCount