2012-07-28 16 views
13

私はHadoopで作業しています。私のHadoopファイルシステムの中に〜100個のファイルの中に特定の文字列が含まれているものが必要です。このように複数のエントリを返します..whichHadoopファイルシステム内の複数のファイルにまたがるgrep

bash-3.00$ hadoop fs -ls /apps/mdhi-technology/b_dps/real-time 

私は、このように検索したいファイルを見ることができます

-rw-r--r-- 3 b_dps mdhi-technology 1073741824 2012-07-18 22:50 /apps/mdhi-technology/b_dps/HADOOP_consolidated_RT_v1x0_20120716_aa 
-rw-r--r-- 3 b_dps mdhi-technology 1073741824 2012-07-18 22:50 /apps/mdhi-technology/b_dps/HADOOP_consolidated_RT_v1x0_20120716_ab 

がどのように私は、文字列が含まれているこれらのどの見つけるのですかbcd4bc3e1380a56108f486a4fffbc8dc ?一度わかったら、私はそれらを手動で編集することができます。

+0

GrepまたはSed? いいえ? – plast1K

+0

これは、この 'bash-3のようにしようとすると、UNIXファイルシステムではなく、Hadoopファイルシステムであるという問題です。00 cd/apps/hdmi-technology/b_dps /リアルタイム bash:cd:/ apps/hdmi-technology/b_dps/real-time:このようなファイルやディレクトリはありません。ですから、私はこの問題に取り組むには他の方法が必要です。 – ferhan

答えて

28

これは、Hadoopの「ファイルシステム」ではありませんPOSIX 1ので、これを試してみてください。

hadoop fs -ls /apps/hdmi-technology/b_dps/real-time | awk '{print $8}' | \ 
while read f 
do 
    hadoop fs -cat $f | grep -q bcd4bc3e1380a56108f486a4fffbc8dc && echo $f 
done 

これは動作するはずですが、それはシリアルですので、遅くなることがあります。クラスタが熱を取ることができれば、我々は並列化することができます:

hadoop fs -ls /apps/hdmi-technology/b_dps/real-time | awk '{print $8}' | \ 
    xargs -n 1 -I^-P 10 bash -c \ 
    "hadoop fs -cat^| grep -q bcd4bc3e1380a56108f486a4fffbc8dc && echo ^" 

お知らせxargsから-P 10オプション:我々はダウンロードして、並列に検索されますどのように多くのファイルがこれです。ディスクI/Oまたはネットワーク帯域幅が飽和するまで、構成に関連するものが何であれ、低速から始めて数を増やしてください。

EDIThadoop fs -catを使用して

hadoop fs -ls /apps/hdmi-technology/b_dps/real-time | awk '{print $8}' | while read f; do hadoop fs -cat $f | grep bcd4bc3e1380a56108f486a4fffbc8dc >/dev/null && echo $f; done 
+0

これは 'bash-3.00 $ cd/apps/hdmi-technology/b_dps/real-time bashのようにしようとすると、UNIXファイルシステムではなく、Hadoopファイルシステムです。 apps/hdmi-technology/b_dps/real-time:そのようなファイルやディレクトリはありません。このようなファイルやディレクトリはありません。 – ferhan

+0

あなたはこのディレクトリが存在すると肯定的ですか?あなたはそれをある場所にマウントしてから、それにcdできますか? – plast1K

+0

私はこのフォルダにTBのデータがあるので、これを行うことができるかどうかはわかりません。そして、私はそれをどのようにして場所に取り付けることができますか? – ferhan

0

(またはより一般的なhadoop fs -text)あなたはちょうど2つを持っている場合は可能かもしれません:あなたは(少し脳死である)のSunOSにしていることを考えると、これを試してください1 GBファイル。 100ファイルについては、streaming-apiを使用します。なぜなら、本格的なmapreduceジョブに頼ることなく、アドホッククエリに使用できるからです。例えば。 java.io.IOException: Stream closed例外を避けるために、あなたが入力全体を読む必要が

#!/bin/bash 
grep -q $1 && echo $mapreduce_map_input_file 
cat >/dev/null # ignore the rest 

注:お使いの場合には、スクリプトget_filename_for_pattern.shを作成します。

その後のコマンドに新しいディストリビューションmapred streaming代わりのhadoop jar $HADOOP_HOME/hadoop-streaming.jar動作するはずで

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/* 

を発行します。後者の場合は、jarを見つけるために(または完全なパスを直接提供するために)$HADOOP_HOMEを正しく設定する必要があります。

クエリを簡単にするには、スクリプトは必要ありませんが、-mapperパラメータに直接コマンドを入力するだけです。しかし、何かやや複雑なものであれば、スクリプトを使うことをお勧めします。なぜなら、エスケープする権利を得ることは雑用になる可能性があるからです。

還元フェーズが不要な場合は、それぞれの-reduceオプションにシンボリックなNONEパラメータを指定してください(または-numReduceTasks 0を使用してください)。しかし、あなたのケースでは、アウトプットを単一のファイルに統合するためにフェーズを減らすと便利です。

関連する問題