2012-07-28 4 views
13

Hadoop ile çalışıyorum ve Hadoop dosya sistemimde ~ 100 dosyadan hangisinin belirli bir dizgi içerdiğini bulmam gerekiyor. Bu gibi çeşitli girişler verdiği ..whichHadoop Dosya Sistemi'nde birden çok dosya arasında Grep

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

:

ben böyle aramak istediğiniz dosyaları görebilirsiniz

-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 

nasıl dize içeren bunlardan hangisinin buluyorsunuz bcd4bc3e1380a56108f486a4fffbc8dc ? Bildiğim zaman, onları manuel olarak düzenleyebilirim.

+0

Grep mi, Sed mi? Hayır? – plast1K

+0

Sorun bununla birlikte, bu tür bash-3'ü yapmaya çalıştığımda onun bir UNIX dosya sistemi değil, bir Hadoop Dosya Sistemi.00 $ cd/uygulamalar/hdmi-technology/b_dps/gerçek zamanlı bash: cd:/apps/hdmi-technology/b_dps/real-time: Böyle bir dosya veya dizin yok “Böyle bir dosya veya dizin almıyorum. Bu yüzden bu sorunla uğraşmanın başka bir yoluna ihtiyacım var. – ferhan

cevap

28

Bu Hadoop "dosya sistemi" değil, bir POSIX biridir, bu nedenle bu deneyin:

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 

Bu çalışması gerekir, ancak seri ve çok yavaş olabilir. Küme ısı alabilir, biz parallelize edebilirsiniz:

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 ^" 

Bildirimi xargs için -P 10 seçenek: Biz indirmek ve paralel olarak arayacaktır kaç dosya budur. Konfigürasyonunuzla ilgili olan şey ne olursa olsun, düşük I/O ya da ağ bant genişliğini doldurana kadar düşük başlayın ve numarayı artırın.

DÜZENLEME: hadoop fs -cat kullanma

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

Sorun bununla birlikte, bir UNIX dosya sistemi değil, bir Hadoop Dosya Sistemi, bu tür bir bash-3.00 $ cd/apps/hdmi-technology/b_dps/real-time bash: cd:/uygulamalar/hdmi-technology/b_dps/real-time: Böyle bir dosya veya dizin yok “Böyle bir dosya veya dizin almıyorum. – ferhan

+0

Bu dizin var mı? Onu bir yere monte edip içine cd yerleştirebilir misin? – plast1K

+0

Bunu yapabildiğimden emin değilim, yoksa bu klasörde veri TB'si var. Ve bunu nasıl bir yere monte edebilirim? – ferhan

0

(veya daha genel hadoop fs -text) sadece iki varsa mümkün olabilir: Eğer (biraz beyin ölümü olan) SunOS konum göz önüne alındığında bu deneyin 1 GB dosya. 100 dosya için streaming-api kullanırdım, çünkü tam teşekküllü bir mapreduce işine başvurmadan adhoc sorguları için kullanılabilir. Örneğin. java.io.IOException: Stream closed durumlar almaya önlemek için, tüm giriş okumak zorunda

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

Not: sizin durumunuzda bir komut dosyası get_filename_for_pattern.sh oluşturun.

Sonra komutları yerine hadoop jar $HADOOP_HOME/hadoop-streaming.jar ait mapred streaming çalışması gerekir yeni dağıtımlarda

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

sorunu. İkinci durumda, kavanozu bulmak için $HADOOP_HOME'u doğru bir şekilde ayarlamanız gerekir (ya da doğrudan yolu tam olarak sağlayın).

Daha basit sorgular için komut dosyasına bile ihtiyacınız yoktur, ancak doğrudan -mapper parametresine komut sağlayabilirsiniz. Fakat biraz karmaşık olan bir şey için, bir betiğin kullanılması tercih edilir, çünkü kaçış hakkının elde edilmesi bir angarya olabilir.

Küçültme fazına ihtiyacınız yoksa, sembolik NONE parametresini ilgili -reduce seçeneğine verin (veya sadece -numReduceTasks 0 kullanın). Ancak sizin durumunuzda, çıktının tek bir dosyada birleştirilmesini sağlamak için bir azaltma aşamasına sahip olmak yararlıdır.