2012-07-28 11 views
13

मैं हैडोप के साथ काम कर रहा हूं और मुझे यह पता होना चाहिए कि मेरे हैडोप फाइल सिस्टम में कौन सी ~ 100 फाइलें एक निश्चित स्ट्रिंग हैं।हैडोप फाइल सिस्टम में कई फ़ाइलों में Grep

मैं फ़ाइलों को मैं इस तरह खोज करना चाहते हैं देख सकते हैं:

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

..which इस तरह कई प्रविष्टियों रिटर्न:

-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

इसके साथ समस्या यह है कि यह यूनिक्स फ़ाइल सिस्टम नहीं है, यह एक हैडोप फ़ाइल सिस्टम है, जब भी मैं इस 'बैश -3 की तरह करने की कोशिश करता हूं।00 $ सीडी/एप्स/एचडीएमआई-टेक्नोलॉजी/बी_डीपीएस/रीयल-टाइम बैश: सीडी:/एप्स/एचडीएमआई-टेक्नोलॉजी/बी_ डीपीएस/रीयल-टाइम: ऐसी कोई फ़ाइल या निर्देशिका नहीं, मुझे ऐसी कोई फ़ाइल या निर्देशिका नहीं मिलती है। तो मुझे इस समस्या से निपटने के लिए किसी अन्य तरीके की जरूरत है। – ferhan

उत्तर

28

यह एक Hadoop "फाइल सिस्टम", नहीं एक POSIX एक है, इसलिए इस प्रयास करें:

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 

यह काम करना चाहिए, लेकिन यह धारावाहिक है और इतनी धीमी गति से हो सकता है। अपने क्लस्टर गर्मी ले जा सकते हैं, तो हम parallelize कर सकते हैं:

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 या नेटवर्क बैंडविड्थ को संतृप्त न करें तब तक संख्या बढ़ाएं, जो भी आपके कॉन्फ़िगरेशन में प्रासंगिक है।

संपादित: यह देखते हुए कि आप पर SunOS रहे (जो थोड़ा मस्तिष्क मृत है) इस प्रयास करें:

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

इसके साथ समस्या यह है कि यह यूनिक्स फ़ाइल सिस्टम नहीं है, यह एक हैडोप फ़ाइल सिस्टम है, जब भी मैं इस 'बैश-3.00 $ सीडी/ऐप्स/एचडीएमआई-टेक्नोलॉजी/बी_डीपीएस/रीयल-टाइम बैश की तरह करने की कोशिश करता हूं: cd:/ऐप्स/hdmi-technology/b_dps/वास्तविक समय: ऐसी कोई फ़ाइल या निर्देशिका नहीं 'मुझे ऐसी कोई फ़ाइल या निर्देशिका नहीं मिलती है। – ferhan

+0

आप सकारात्मक हैं यह निर्देशिका मौजूद है? क्या आप इसे किसी स्थान पर आरोहित कर सकते हैं, और उसके बाद सीडी कर सकते हैं? – plast1K

+0

मुझे यकीन नहीं है कि मैं यह कर सकता हूं या नहीं क्योंकि उस फ़ोल्डर में डेटा के टीबी है। और मैं इसे किसी स्थान पर कैसे माउंट कर सकता हूं? – ferhan

0

hadoop fs -cat का उपयोग करना (या अधिक सामान्य hadoop fs -text) अगर आप सिर्फ दो है संभव हो सकता है 1 जीबी फाइलें 100 फाइलों के लिए हालांकि मैं streaming-api का उपयोग करूंगा क्योंकि इसका उपयोग पूरी तरह से मैप्रिडस नौकरी के बिना विज्ञापन-प्रश्नों के लिए किया जा सकता है। जैसे ,

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

नोट आप पूरे इनपुट को पढ़ने के लिए है कि आदेश java.io.IOException: Stream closed अपवाद हो रही से बचने के लिए: आपके मामले में एक स्क्रिप्ट get_filename_for_pattern.sh पैदा करते हैं।

तब आदेशों

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

नए वितरण hadoop jar $HADOOP_HOME/hadoop-streaming.jar के बजाय mapred streaming काम करना चाहिए में जारी करते हैं। बाद के मामले में आपको जार (या सीधे पूर्ण पथ प्रदान करने के लिए) को $HADOOP_HOME सही ढंग से सेट करना होगा।

सरल प्रश्नों के लिए आपको एक स्क्रिप्ट की भी आवश्यकता नहीं है, लेकिन केवल -mapper पैरामीटर पर आदेश प्रदान कर सकते हैं। लेकिन किसी भी जटिल के लिए यह एक स्क्रिप्ट का उपयोग करना बेहतर है, क्योंकि बचने का अधिकार प्राप्त करना एक कोर हो सकता है।

यदि आपको कम चरण की आवश्यकता नहीं है तो संबंधित NONE पैरामीटर संबंधित -reduce विकल्प (या केवल -numReduceTasks 0 का उपयोग करें) प्रदान करें। लेकिन आपके मामले में आउटपुट को एक फ़ाइल में समेकित करने के लिए चरण कम करना उपयोगी होता है।

संबंधित मुद्दे