2015-05-10 136 views
0

我是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/

的問題是:

  1. 如何配置Hadoop的取每個輸入文件並將其發送給一個映射器,因爲它是什麼?

  2. 如果輸入文件數大於節點數,是否所有文件都映射? 謝謝。

回答

1

這裏有很多問題需要考慮。

  1. map/reduce的地圖部分要求您需要映射線的所有數據都駐留在線上。試圖繞過這是非常糟糕的做法,可能會被認爲是你做錯事的氣味。
  2. Hadoop僅拆分可拆分的輸入文件,如bz2或未壓縮的文件。 Gzip does not get split for instance
  3. 如果您正在分析序列或「需要特定順序的事情」,這通常是在減速器中完成的,因爲流向它的數據總是按the Hadoop sort key排序(這就是爲什麼您映射鍵入)。
  4. 的減速將從映射器接收拆分數據集的數據集已經被排序之後,以避免這一切需要去同一個減速器來解釋信息分離,使用the Hadoop partitioning key

注意,所有的鏈接指向相同的頁面,只是不同的章節。總的來說,我認爲從上到下閱讀該頁面會給你一個關於如何以流媒體方式使用Hadoop的更加堅定的概念。

特別提示: 如果你想要做的地圖/使用python減少,我可以推薦看Apache Spark for Python,它運行在Hadoop的,但A whole lot faster它也可以讓您使用IPython的控制檯開發您的map/reduce算法,極大地提高了開發速度。

+0

謝謝,這真是太棒了!事實上,照顧減速器的順序是一個更好的主意。這裏有一個問題:關於行順序的信息,如行號,或許應該可能仍然傳遞給映射器,否則,該信息將會丟失。我想知道是否應該手動添加該行號作爲文件中每行前的關鍵字(即手動預處理輸入文件),或者Hadoop的流式機制可以自動爲文件中的每一行分配一個「行號」鍵在傳遞給減速器之前?謝謝。 – jazzblue

+1

@jazzblue,mappers唯一的工作就是改變輸入行,以便它適合您的排序,分區和減少需求。沒有任何從原始數據傳輸到reducer的自動方式,如果你需要它,你必須自己在你的映射器代碼中輸出它。 – firelynx

+0

謝謝。還有一個想法:如果我仍然想控制如何分割輸入文件,例如,我可以在每行塊(分區)中創建JSON列表,並將每個列表放入一個新的輸入文件中作爲一行。這樣,整個塊將駐留在一行,並將被髮送到同一個映射器。我想知道,如果這種JSON操作是可以接受的做法,還是會有一些缺點?謝謝。 – jazzblue

相關問題