2016-04-15 42 views
2

我在S3中創建了一個外部Hive(EMR中爲1.0)表。我可以成功地使用Hive將記錄插入到此表中,並將它們查詢回來,然後直接從S3存儲桶中提取文件作爲驗證。到現在爲止還挺好。豬通過HCatStorer()向S3寫入「成功」,寫入0字節

我希望能夠使用Pig(v0.14,同樣在EMR上)來讀寫這個邏輯表。使用HCatLoader()加載工作正常,轉儲/解釋確認我的數據和模式符合預期。

但是,當我嘗試使用HCatStorer()編寫代碼時,我遇到了問題。豬報告成功,N記錄,,但0字節,寫。我在日誌中看不到任何與相關或指示問題相關的內容,並且沒有數據寫入表/桶。

a = load 'myfile' as (foo: int, bar: chararray); // Just assume that this works. 
dump a; // Records are there 
describe a; // Correct schema, as specified above 
store a into 'mytable' using org.apache.hive.hcatalog.pig.HCatStorer(); 

輸出(同樣包含的,我可以看到問題,並沒有其他指示)的結尾是:

Success! 

... 

Input(s): 
Successfully read 2 records (24235 bytes) from: "myfile" 

Output(s): 
Successfully stored 2 records in: "mytable" 

Counters: 
Total records written : 2 
Total bytes written : 0 
Spillable Memory Manager spill count : 0 
Total bags proactively spilled: 0 
Total records proactively spilled: 0 

值得注意的是:

  • 這工作在相同的環境,如果表格位置在HDFS而不是S3中 - 對於外部和內部表格,以及來自Hive或Pig。
  • 我可以直接成功地用S3存儲到S3。 store a into 's3n://mybucket/output' using PigStorage(',');
  • 通過Hive shell插入到相同的查詢工作正常。

所以這似乎是Pig/HCatalog/S3作爲堆棧的相互作用的問題;其中任何兩個似乎都很好。

鑑於我在豬日誌中沒有看到任何非常有用的東西,我還應該看些什麼來調試呢?我應該關注這些技術的任何特定配置參數嗎?

+0

哎...! 你已經提到,即使數據被「成功存儲」,你仍然無法將數據存儲在配置表格中,你能否檢查HDFS並找到「mytable」的路徑並查看是否有數據? – Pratik

+0

@Pratik在錯誤的情況下,「mytable」存在於S3中,而不是HDFS ......這就是挑戰的癥結所在!當我在HDFS中找到「mytable」的版本時,它工作正常,數據按預期顯示。 – Greg

+0

@Greg你有沒有找到一種解決方案,而不是在emr中進行升級?我需要使用豬來加載s3上的蜂巢表。考慮使用剛剛登陸文件夾中的數據的解決方法,並使用lambda函數將分區添加到配置單元中,但希望全豬解決方案 – TaylerJones

回答

2

我認爲在使用HCatalog從豬寫入S3時存在一個問題。 由於最終輸出數據正被寫入_temporary文件,並且永遠不會被複制/移動到原始位置。這種奇怪的行爲僅在S3上遇到。

在我的情況下輸出應寫入到S3:// X/Y /,但數據被寫入 S3:// X/Y/_temporary/attempt_1466700620679_0019_r_000000_0 /部分-R-00000

解決方法是將HCatalog的輸出寫入HDFS,然後寫入S3。

您可以參考張貼在AWS論壇下面的鏈接: https://forums.aws.amazon.com/thread.jspa?threadID=230544

+0

是的,謝謝... AWS論壇帖子和解決方法是我的! :-)仍爲鏈接+1 - 有助於追蹤此答案的不同線索。 – Greg