5
我試圖在Hadoop集羣上編輯一個大文件,並修剪空白和特殊字符,如|,*,@等等等等。使用sed的,因爲我有這樣的文件,1000年進行修改。在Hadoop集羣上編輯數百萬行文件
我試圖在Hadoop集羣上編輯一個大文件,並修剪空白和特殊字符,如|,*,@等等等等。使用sed的,因爲我有這樣的文件,1000年進行修改。在Hadoop集羣上編輯數百萬行文件
的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
的-
告訴它從標準輸入而不是一個文件獲取數據。
謝謝唐納德。它有助於。 :) 乾杯。 –
嗨, 第二個選項工作正常,但沒有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部分是錯誤的,請更正我 –