2012-05-12 46 views
1

我試圖使用Hadoop Streaming運行兩個命令,如gunzip | map_to_old_format.py,但它與gzip說「| .gz not found」或沿着這些行的東西(只有當通過Hadoop運行..如果我運行命令行,它工作正常)。如何在兩個命令行爲與標準管道類似的情況下創建一個linux shell命令?

由於我無法弄清楚如何在Python中進行gunzip,我想創建一個shell腳本來完成這個命令(例如gunzip_and_map_to_old.sh)。我想這與以下,但gzip的不喜歡(gzip的抱怨「壓縮程序:標準輸入:非gzip格式」):

#!/bin/bash 
while read data; do 
    echo $data | gunzip | map_to_old_format.py $2 
done 

關於蟒蛇gunzip解,我試過f = gzip.GzipFile("", "rb", fileobj=sys.stdin)以及一個包裝方法描述here

回答

2

我一無所知Hadoop的,但我要猜echo $data | gunzip不起作用,因爲$datadata線,並$data本身可能不是在gzip格式。而不是逐行傳遞數據,你不能在bash腳本文件中這樣做嗎?

#!/bin/bash 
gunzip | map_to_old_format.py 

然後,您可以通過傳遞gzip文件這樣稱呼它:

cat data.gz | gunzip_and_map_to_old.sh 
+0

嗯,這更簡單,我想它會!謝謝 :) –

1

這不回答我的確切問題,但我可以通過添加-jobconf stream.recordreader.compression=gzip我Hadoop的命令來繞過它(source where I learned this):

hadoop jar /usr/lib/hadoop/contrib/streaming/hadoop-streaming-*.jar \ 
    -jobconf stream.recordreader.compression=gzip \ 
    -D mapred.reduce.tasks=0 \ 
    -file map_to_old_format.py \ 
    -mapper map_to_old_format.py \ 
    -input /mydata/* -output output/newdata 

注:我還是老樣子好奇如何完成上面通過shell腳本,所以如果可能的話,請讓我知道。

+2

這樣做有什麼問題嗎?我想你也可以使用-D mapred.input.compression.codec ='org.apache.hadoop.io.compress.GzipCodec' –

+0

這種方式沒有錯,也沒有你的方式。我在發佈我的問題後才發現它,但很好奇如何使用shell腳本方法假設(哪個redcurry釘住他/他的答案)。感謝這個替代設置:) –

1

Hadoop的數據流通常讀取使用的TextInputFormat輸入文件,並通過STD逐行將其傳遞到你的Python映射器(使用製表符分隔鍵和值(大多數情況下是行號和行文本)

如果輸入文件的文件擴展名不以.gz結尾,那麼hadoops TextInputFormat將不會知道在傳遞給你的線路之前,將文件內容用gunzip壓縮一次一個。正如其他答案中所建議的那樣,您可以配置屬性以強制hadoop對該文件進行gunzip壓縮。

相關問題