使用hadoop fs -cat
(或更一般的hadoop fs -text
)可能是可行的,如果你只是有兩個1 GB文件。對於100個文件,儘管我會使用streaming-api,因爲它可以用於adhoc查詢,而無需訴諸完整的mapreduce作業。例如。在你的情況下創建一個腳本get_filename_for_pattern.sh
:
#!/bin/bash
grep -q $1 && echo $mapreduce_map_input_file
cat >/dev/null # ignore the rest
請注意,您必須閱讀整個輸入,爲了避免讓java.io.IOException: Stream closed
例外。
然後發出命令
hadoop jar $HADOOP_HOME/hadoop-streaming.jar\
-Dstream.non.zero.exit.is.failure=false\
-files get_filename_for_pattern.sh\
-numReduceTasks 1\
-mapper "get_filename_for_pattern.sh bcd4bc3e1380a56108f486a4fffbc8dc"\
-reducer "uniq"\
-input /apps/hdmi-technology/b_dps/real-time/*\
-output /tmp/files_matching_bcd4bc3e1380a56108f486a4fffbc8dc
hadoop fs -cat /tmp/files_matching_bcd4bc3e1380a56108f486a4fffbc8dc/*
在新的發行mapred streaming
,而不是hadoop jar $HADOOP_HOME/hadoop-streaming.jar
應該工作。在後一種情況下,您必須正確設置您的$HADOOP_HOME
才能找到jar(或直接提供完整路徑)。
對於更簡單的查詢,您甚至不需要腳本,但可以直接向-mapper
參數提供命令。但是對於任何稍微複雜的事情,最好使用腳本,因爲逃避權利可能是一件苦差事。
如果您不需要縮小階段,請爲相應的-reduce
選項(或僅使用-numReduceTasks 0
)提供符號NONE
參數。但在你的情況下,有一個減少階段是有用的,以便將輸出合併到一個文件中。
Grep或Sed? 不是? – plast1K 2012-07-28 02:41:43
問題在於,它不是UNIX文件系統,它是Hadoop文件系統,每當我嘗試像這樣的'bash-3。00 $ cd/apps/hdmi-technology/b_dps/real-time bash:cd:/ apps/hdmi-technology/b_dps/real-time:沒有這樣的文件或目錄我沒有這樣的文件或目錄。所以我需要一些其他方式來解決這個問題。 – ferhan 2012-07-28 02:50:51