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