2014-02-20 57 views

回答

7

的MapReduce是爲這個完美的。好東西,你有它在HDFS!

你說你認爲你可以sed解決您的問題。如果是這樣的case,那麼Hadoop Streaming將是一個不錯的選擇。

$ hadoop jar /path/to/hadoop/hadoop-streaming.jar \ 
    -D mapred.reduce.tasks=0 \ 
    -input MyLargeFiles \ 
    -output outputdir \ 
    -mapper "sed ..." 

這將啓動一個MapReduce作業,它將sed命令應用於整個文件中的每一行。由於有1000個文件,因此您將一次執行幾個映射器任務。數據也會直接返回到羣集中。

請注意,我在此將縮減器的數量設置爲0。那是因爲它不是真的需要。如果你希望你的輸出是一個文件,比使用一個reducer,但不指定-reducer。我認爲使用身份縮減器並有效地只用一個縮減器創建一個輸出文件。只有mapper的版本肯定會更快。


另一種選擇,我不認爲是好的,但不要求MapReduce的,並且仍然優於copyToLocal是通過該節點的流,並推回了沒有擊中磁盤。這裏有一個例子:

$ hadoop fs -cat MyLargeFile.txt | sed '...' | hadoop fs -put - outputfile.txt 

hadoop fs -put-告訴它從標準輸入而不是一個文件獲取數據。

+0

謝謝唐納德。它有助於。 :) 乾杯。 –

+1

嗨, 第二個選項工作正常,但沒有mapred方法。 我想對文件 應用多個sed操作,例如hadoop fs -cat file1 | sed'1d'| sed's/^ A // g'| sed's/| // g'| sed's /「// g'| sed's/\ + // g'| hadoop fs -put file2 如果我使用mapred,它不適用於^ A和空格。 錯誤 -/bin/sed:無法讀取s/\ + // g:沒有這樣的文件或目錄 我在嘗試: $ hadoop jar /path/to/hadoop/hadoop-streaming.jar \ - D mapred.reduce.tasks = 1 \ -input file1 -output file2 -mapper「sed's/| // g';'s/\ + // g';'s /」// g'; '其他sed操作'「 認爲我在mapper部分是錯誤的,請更正我 –