2014-08-27 22 views
-1

轉換一個JSON文件我的JSON文件,文件的每一行100GB看起來是這樣的:Hadoop中

{"field1":100, "field2":200, "field3":[{"in1":20, "in2":"abc"},{"in1":30, "in2":"xyz"}]} 

(它實際上要複雜得多,但對於這個會作爲一個小的演示做的。)

我想把它處理的東西,其每一行看起來是這樣的:

{"field1":100, "field2":200, "abc":20, "xyz":30} 

作爲非常新的Hadoop,我只是想知道如果我在正確的道路上:

指的是: http://www.glennklockwood.com/di/hadoop-streaming.php 對於傳統的應用我會在Python創造出一個映射,與減速機及使用類似執行:

hadoop \ 
    jar /opt/hadoop/contrib/streaming/hadoop-streaming-1.0.3.jar \ 
    -mapper "python $PWD/mapper.py" \ 
    -reducer "python $PWD/reducer.py" \ 
    -input "wordcount/mobydick.txt" \ 
    -output "wordcount/output" 

現在讓我知道如果我在正確的軌道上:

因爲我只需要大量的文件解析成另一種形式;我想我不需要任何減少步驟。我可以簡單地寫映射器,其中:

  1. 從stdin注意到輸入
  2. 逐行讀取
  3. std.in線將每個線根據我的規格
  4. 輸出到標準輸出

然後我可以用簡單的映射器和0個縮減器運行hadoop。

請問這種做法似乎正確嗎?我是否會正確使用羣集,或者這會和在單個主機上運行Python腳本一樣糟糕嗎?

回答

0

你是正確的,在這種情況下,你不需要任何減速,你映射器的輸出是直接將需要所以你應該減速機的數量設置爲0。當你告訴Hadoop的輸入路徑在您的JSON是什麼數據是,它會自動爲每個映射器提供隨機數的JSON行,您的映射器將處理這些行,並且需要將其發送到上下文,以便將值存儲在輸出路徑中。這種方法是正確的,並且這個任務是100%可並行化的,所以如果你的集羣中有多臺機器並且你的配置是正確的,它應該充分利用集羣,並且運行速度要比單個集羣上運行速度快得多主辦。

+0

太棒了!但是輸出將以什麼形式出現?如果我給它一個包含2000個文件的位置作爲輸入,那麼映射器通過stdout的輸出將自動保存爲2000個文件?我明天會嘗試一下,但我希望對這個過程中發生的事情有個體面的想法。 – user1265125 2014-08-27 18:36:23

+0

輸出文件的數量取決於減速器的數量,因爲它會爲每個減速器創建一個文件。但是,如果將其設置爲0減速器,則它將取決於映射器的數量。如果你想要所有的東西都在同一個文件中,那麼把1 reducer,IdentityReducer,在這種情況下,它只接受mapper輸出並將其作爲reducer輸出。 – Balduz 2014-08-27 18:38:11