2015-07-02 45 views
0

我有一個簡單的文本文件,其中包含某些FTP服務器上的文件夾列表。每一行都是一個單獨的文件夾。每個文件夾包含幾千幅圖像。我想連接到每個文件夾,將該文件夾中的所有文件存儲在SequenceFile中,然後從FTP服務器中刪除該文件夾。我爲此寫了一個簡單的豬UDF。這裏是:在Apache Pig中下載並行文件列表

dirs = LOAD '/var/location.txt' USING PigStorage(); 
results = FOREACH dirs GENERATE download_whole_folder_into_single_sequence_file($0); 
/* I don't need results bag. It is just a dummy bag */ 

問題是我不確定每個輸入行是否在單獨的映射器中處理。輸入文件不是隻有幾百行的龐大文件。如果它是純粹的Map/Reduce那麼我會使用NLineInputFormat並在單獨的Mapper中處理每一行。我怎樣才能在豬身上實現同樣的目標?

+0

只是好奇你爲什麼使用'豬'來完成這項任務? – gobrewers14

+0

@ GoBrewers14沒有。試圖學習... –

回答

1

Pig允許您編寫自己的load functions,它允許您指定要使用的InputFormat。所以你可以寫自己的。

也就是說,您所描述的工作聽起來像只涉及一個地圖縮小步驟。由於在這種情況下使用Pig並不會降低複雜性,並且您必須編寫自定義代碼才能使用Pig,所以我建議僅使用vanilla map-reduce來實現。如果文件總大小不超過千兆字節,我只需要在一臺主機上直接完成。如果不必使用map reduce,則更簡單。

我通常使用map-reduce首先將數據加載到HDFS中,然後使用Pig對所有數據進行處理。對於加載數據IMO,Pig並沒有真正增加任何優於vanilla hadoop的好處,它只是一個包含InputFormat/RecordReader的包裝,需要實現其他方法。再加上Pig在技術上可能會讓你的裝載器多次被調用。這是一個你不需要擔心直接使用Hadoop map-reduce的問題。