2017-04-05 58 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