Hive 无法从 EMR 上的分布式缓存中找到文件

Posted

技术标签:

【中文标题】Hive 无法从 EMR 上的分布式缓存中找到文件【英文标题】:Hive cannot find file from distributed cache on EMR 【发布时间】:2017-04-05 17:37:17 【问题描述】:

我正在尝试在 Hive 中运行 UDF,它基本上应该使用表中的值作为另一个参数来扫描外部 csv 文件。 我使用的查询:

add jar s3://bucket_name/udf/hiveudf.jar;
add FILE hdfs:///myfile/myfile.csv;
CREATE TEMPORARY FUNCTION MyFunc AS '....udf.myUDF';
SELECT mydate, record_id, value, MyFunc('myfile.csv',value) from my_table;

结果不稳定,在某些情况下完全相同的查询可以正常工作,但在大约 80% 的情况下它会返回异常:

java.io.FileNotFoundException: myfile.csv (No such file or directory)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:146)
    at java.io.FileInputStream.<init>(FileInputStream.java:101)
    at java.io.FileReader.<init>(FileReader.java:58)

...

文件似乎被添加到分布式缓存中:

hive> list files;
/mnt/tmp/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_resources/myfile.csv

我尝试了各种 EMR 版本以及各种实例类型,但找不到模式或触发此问题的原因。任何建议将不胜感激。

【问题讨论】:

我在 EMR 上也面临同样的问题。你能修好它吗?我尝试了两种方法 - MyUDF("./MyFile.txt") 和 MyUDF("MyFile.txt")。我添加了一些日志记录以从 UDF 打印文件路径,它试图在“/user/home”目录中查找文件。 嗯,有点。我通过将 Hive 脚本复制并粘贴到终端窗口来运行我的作业。我的解决方法是 - 从另一个终端窗口运行相同的工作,然后它神奇地工作,仍然不清楚为什么它可能很重要...... 【参考方案1】:

您可以启用调试以查找更多信息。但总的来说,当 EMR 集群上的调整大小(缩小)导致由于复制不足而导致从集群中删除某些预期的 HDFS 分布式缓存文件块时,我看到了类似的问题。

【讨论】:

谢谢,会试试的。到目前为止,AWS 技术支持建议在添加文件后立即运行语句,因为他们假设添加外部文件的会话可以关闭。在这种情况下将看不到文件。这听起来很合理,但在我的情况下不起作用

以上是关于Hive 无法从 EMR 上的分布式缓存中找到文件的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 pyspark EMR Notebook 上的错误 - AnalysisException:无法实例化 org.apache.hadoop.hive.ql.metadata.SessionH

如何将文件从 S3 复制到 Amazon EMR HDFS?

无法从 S3 存储桶(镶木地板文件)将数据加载到 EMR 上的猪中

有关 Amazon EMR 上的流式作业流程的问题

Dynamo 吞吐量未达到预置水平 - 使用 Hive 和 EMR 5.2

如何在使用 EMR/Hive 将数据从 S3 导入 DynamoDB 时处理包含在引号 (CSV) 中的字段