我是Hadoop的新手,我正嘗試使用其Python編寫的mapper和reducer的流式處理功能。問題是我的原始輸入文件將包含要由映射器標識的行序列。如果我讓Hadoop拆分輸入文件,它可能會在一個序列中間執行,因此,該序列將不會被檢測到。所以,我正在考慮手動分割文件。這也會破壞一些序列,因此,除此之外,我還會提供和替代分割,以創建與「第一個」分割重疊的文件。這樣我就不會丟失任何序列。Hadoop使用Python進行流式處理:手動分割輸入文件
我將運行在this article描述的以下命令:
[email protected]:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-*streaming*.jar \
-file /home/hduser/mapper.py -mapper /home/hduser/mapper.py \
-file /home/hduser/reducer.py -reducer /home/hduser/reducer.py \
-input /user/hduser/seq_files/* -output /user/hduser/output_files
我打算把(由手工分割生成即文件)我的輸入文件中/用戶/ hduser/seq_files/
的問題是:
如何配置Hadoop的取每個輸入文件並將其發送給一個映射器,因爲它是什麼?
如果輸入文件數大於節點數,是否所有文件都映射? 謝謝。
謝謝,這真是太棒了!事實上,照顧減速器的順序是一個更好的主意。這裏有一個問題:關於行順序的信息,如行號,或許應該可能仍然傳遞給映射器,否則,該信息將會丟失。我想知道是否應該手動添加該行號作爲文件中每行前的關鍵字(即手動預處理輸入文件),或者Hadoop的流式機制可以自動爲文件中的每一行分配一個「行號」鍵在傳遞給減速器之前?謝謝。 – jazzblue
@jazzblue,mappers唯一的工作就是改變輸入行,以便它適合您的排序,分區和減少需求。沒有任何從原始數據傳輸到reducer的自動方式,如果你需要它,你必須自己在你的映射器代碼中輸出它。 – firelynx
謝謝。還有一個想法:如果我仍然想控制如何分割輸入文件,例如,我可以在每行塊(分區)中創建JSON列表,並將每個列表放入一個新的輸入文件中作爲一行。這樣,整個塊將駐留在一行,並將被髮送到同一個映射器。我想知道,如果這種JSON操作是可以接受的做法,還是會有一些缺點?謝謝。 – jazzblue