2017-04-05 56 views
1

我试图在Hive中运行UDF,它基本上应该使用表中的值作为另一个参数来扫描外部csv文件。 查询我使用:Hive无法从EMR上的分布式缓存中找到文件

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 

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

+0

我在EMR上也面临同样的问题。你能解决它吗?我尝试了两种方式 - MyUDF(“./ MyFile.txt”)和MyUDF(“MyFile.txt”)。我添加了一些日志来从UDF打印文件路径,它试图在“/ user/home”目录中查找文件。 – Ajeet

+0

好吧,那种。我通过复制并将Hive脚本粘贴到终端窗口来运行我的作业。我的工作是 - 从另一个终端窗口运行同样的工作,然后它神奇地工作,仍然不清楚为什么它可能很重要... – Coppernick

回答

0

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

+0

谢谢,将尝试它。建议AWS技术支持在添加文件后立即运行语句,因为他们认为添加外部文件的会话可能会被关闭。在这种情况下文件不会被看到。这听起来很合理,但对我来说不起作用 – Coppernick