2012-01-06 15 views
13

मेरे पास स्थानीय फ़ाइल सिस्टम पर 10 एम + तस्वीरें सहेजी गई हैं। अब मैं तस्वीर के बाइनरी का विश्लेषण करने के लिए उनमें से प्रत्येक के माध्यम से जाना चाहता हूं यह देखने के लिए कि यह कुत्ता है या नहीं। मैं मूल रूप से क्लस्टर्ड हडूप पर्यावरण पर विश्लेषण करना चाहता हूं। समस्या यह है कि, मैप विधि के लिए इनपुट कैसे डिजाइन करना चाहिए? मान लें, मानचित्र विधि में, new FaceDetection(photoInputStream).isDog() विश्लेषण के लिए सभी अंतर्निहित तर्क है।हडोप: नक्शा/कम करके संसाधित होने के लिए (कई) फोटो छवियों को कैसे एक्सेस करें?

विशेष रूप से, क्या मुझे सभी तस्वीरें HDFS पर अपलोड करनी चाहिए? मान लें हाँ,

  1. मैं उन्हें map विधि में कैसे उपयोग कर सकता हूं?

  2. यह प्रत्येक एक लाइन के साथ (HDFS में) तस्वीर पथ के सभी युक्त पाठ फ़ाइल के रूप (map करने के लिए) इनपुट बनाने के लिए ठीक है, और नक्शे विधि में, जैसे द्विआधारी लोड: photoInputStream = getImageFromHDFS(photopath); (वास्तव में , क्या नक्शा विधि के निष्पादन के दौरान HDFS से फ़ाइल को लोड करने के लिए सही तरीका है?)

ऐसा लगता है मैं hadoop, map/reduce और hdfs के लिए बुनियादी सिद्धांत के बारे में कुछ मनोरोग की याद आती है, लेकिन आप कर सकते हैं तो कृपया उपरोक्त प्रश्न के संदर्भ में मुझे इंगित करें, धन्यवाद!

+0

क्या आप इसे प्राप्त करने में सक्षम थे? असल में मैं कुछ ऐसा करने की कोशिश कर रहा हूं लेकिन मुझे – user3527975

उत्तर

0

मैं थोड़ी देर पहले (2008?) प्रोजेक्ट पर था जहां हमने हडोप के साथ कुछ ऐसा ही किया था। मेरा मानना ​​है कि हमने चित्रों को स्टोर करने के लिए शुरुआत में एचडीएफएस का इस्तेमाल किया था, फिर हमने एक टेक्स्ट फाइल बनाई जिसने फाइलों को संसाधित करने के लिए सूचीबद्ध किया। अवधारणा यह है कि आप टेक्स्ट फ़ाइल को टुकड़ों में तोड़ने और क्लाउड में फैलाने के लिए नक्शा/कम करने का उपयोग कर रहे हैं, जिससे प्रत्येक नोड उन्हें प्राप्त सूची के हिस्से के आधार पर कुछ फाइलों को संसाधित करने दे। क्षमा करें मुझे अधिक स्पष्ट विवरण याद नहीं हैं, लेकिन यह सामान्य दृष्टिकोण था।

18

मैप विधि में उनका उपयोग कैसे कर सकता हूं?

बड़ी समस्या यह है कि प्रत्येक फ़ाइल एक फ़ाइल में होने वाली है। तो यदि आपके पास 10 एम फाइलें हैं, तो आपके पास 10 एम मैपर होंगे, जो बहुत उचित नहीं लगता है। आप SequenceFiles (एक प्रति प्रति-मूल्य जोड़ी) में फ़ाइलों को पूर्व-क्रमबद्ध करने पर विचार करना चाह सकते हैं। यह डेटा को MapReduce नौकरी मूल में लोड कर देगा, इसलिए आपको कोई मुश्किल कोड लिखना नहीं है। इसके अलावा, यदि आप चाहें तो आप अपने डेटा के सभी को अपने डेटा के एक सेक्वेंसफ़ाइल में स्टोर करने में सक्षम होंगे। Hadoop विभाजित SequenceFiles बहुत अच्छी तरह से संभालती है।

असल में, जिस तरह से यह काम करता है, आपके पास एक अलग जावा प्रक्रिया होगी जो कई छवि फ़ाइलों को लेती है, रे बाइट्स को मेमोरी में पढ़ती है, फिर डेटा को एक सीक्वेंसफाइल में एक कुंजी-मूल्य जोड़ी में संग्रहीत करता है। चलते रहें और एचडीएफएस में लिखते रहें। इसमें कुछ समय लग सकता है, लेकिन आपको केवल एक बार ऐसा करना होगा।


यह प्रत्येक एक लाइन के साथ तस्वीर पथ (HDFS में) के सभी युक्त पाठ फ़ाइल के रूप (मानचित्र के लिए) इनपुट बनाने के लिए ठीक है, और नक्शे विधि में, जैसे द्विआधारी लोड : photoInputStream = getImageFromHDFS (फोटोपाथ); (वास्तव में, मानचित्र विधि के निष्पादन के दौरान एचडीएफएस से फ़ाइल लोड करने का सही तरीका क्या है?)

यह ठीक नहीं है अगर आपके पास कोई उचित क्लस्टर है (यदि आपको इसके लिए हडोप पर विचार करना चाहिए) और आप वास्तव में हडोप की शक्ति का उपयोग करना चाहते हैं। आपकी MapReduce नौकरी बंद हो जाएगी, और फ़ाइलों को लोड करेगा, लेकिन मैपर टेक्स्ट फ़ाइलों के लिए डेटा-स्थानीय चल रहे होंगे, न कि छवियों! इसलिए, मूल रूप से, आप छवि फ़ाइलों को हर जगह घुमाएंगे क्योंकि जॉबट्रैकर उन कार्यों को नहीं रख रहा है जहां फाइलें हैं। यह नेटवर्क ओवरहेड की एक महत्वपूर्ण मात्रा में होगा। यदि आपके पास 1TB छवियां हैं, तो आप उम्मीद कर सकते हैं कि यदि आपके पास कुछ नोड्स से अधिक हैं तो उनमें से बहुत से नेटवर्क पर स्ट्रीम किए जाएंगे। यह आपकी स्थिति और क्लस्टर आकार (कुछ नोड्स से कम) के आधार पर इतना बुरा नहीं हो सकता है।

यदि आप ऐसा करना चाहते हैं, तो आप फ़ाइलों को बनाने के लिए FileSystem API का उपयोग कर सकते हैं (आप open विधि चाहते हैं)।

+0

अद्भुत कैसे आगे बढ़ना है इस बारे में ज्यादा जानकारी नहीं है! SequenceFile समाधान के लिए विशिष्ट, यह एक हैडऑप-ऑफ जावा प्रक्रिया प्रतीत होता है। मैं इसके बजाय कोशिश करूँगा, लेकिन क्या आप स्थानीय छवि लोड करके इसे एचडीएफएस पर लाने के लिए कोड उदाहरण बनाने पर ध्यान देते हैं? यह शायद दूसरों के लिए एक और अधिक पूरा समाधान है। अधिक रोचक लेकिन जरूरी नहीं, अनुक्रमफाइल पीढ़ी के लिए प्रक्रिया और इसे एचडीएफएस पर अपलोड करना एक और हूडूप नौकरी हो सकता है, है ना? एक बार फिर, यह एक बहुत ही समर्पित और पेशेवर उत्तर है! बहुत सराहना की! – leslie

+0

एक अलग प्रश्न यह आगे संबोधित करते हुए: [यहां] (http://stackoverflow.com/q/8754154/844068) – leslie

+0

मैं [Distcp] (http://goo.gl/k95cd) के लिए कोड के माध्यम से जा रहा था और यह इसमें कम से कम दो cmdline पैरामीटर हैं।एक स्रोत यूआरएल और एक गंतव्य यूआरएल। यह तब अनिवार्य रूप से स्रोत URL पर "ls -lR" करता है, और आउटपुट को सभी मानचित्र इनपुट फ़ाइलों के लिए राउंड-रॉबिन तरीके से लिखता है। Distcp में भी डेटा इलाके पर विचार नहीं किया जाता है। मैपर में डेटा स्रोत से पढ़ा जाता है (जो एक अलग नोड पर हो सकता है) और उसके बाद लक्ष्य (जो एक अलग क्लस्टर पर है) को लिखा जाता है। क्लस्टर में डेटा कॉपी करने के लिए बहुत सारे अंतर-नोड ट्रैफिक होंगे। सुनिश्चित नहीं है कि इसका सामना कैसे करें। –

7

I have 10M+ photos saved on the local file system.

यह मान लिया जाये कि अनुक्रम फ़ाइल में प्रत्येक फ़ाइल डाल करने के लिए एक सेकंड लेता है। अनुक्रम फ़ाइल में व्यक्तिगत फ़ाइलों के रूपांतरण के लिए ~ 115 दिन लगेंगे। समान मशीन पर समानांतर प्रसंस्करण के साथ, मुझे बहुत सुधार दिखाई नहीं देता क्योंकि डिस्क पढ़ने/लिखने से फोटो फाइलें पढ़ने और अनुक्रम फ़ाइल लिखने के साथ एक बोतल गर्दन होगी। small files problem पर इस क्लौडेरा आलेख को देखें। एक स्क्रिप्ट का एक संदर्भ भी है जो एक टैर फ़ाइल को अनुक्रम फ़ाइल में परिवर्तित करता है और रूपांतरण के लिए कितना समय लगता है।

मूल रूप से फ़ोटो को क्रम में परिवर्तित करने के लिए एक वितरित तरीके से संसाधित किया जाना चाहिए। Hadoop :)

वापस Hadoop - The Definitive Guide

एक सामान्य नियम के, प्रत्येक फाइल, निर्देशिका, और ब्लॉक के रूप में के अनुसार लगभग 150 बाइट्स लेता है। तो, उदाहरण के लिए, यदि आपके पास दस लाख फाइलें हैं, तो प्रत्येक एक ब्लॉक लेता है, आपको कम से कम 300 एमबी मेमोरी की आवश्यकता होगी।

तो, सीधे 10 एम फाइलों को लोड करने के लिए नाम नोड पर नामस्थान संग्रहीत करने के लिए लगभग 3,000 एमबी मेमोरी की आवश्यकता होगी। नौकरी के निष्पादन के दौरान नोड्स में फोटो स्ट्रीम करने के बारे में भूल जाओ।

इस समस्या को हल करने का एक बेहतर तरीका होना चाहिए।


एक और दृष्टिकोण फ़ाइलें लोड HDFS में के रूप में है और CombineFileInputFormat इनपुट विभाजन की गणना करते समय जो एक इनपुट विभाजन में छोटे फ़ाइलों को जोड़ती है और डेटा इलाके समझता है उपयोग करने के लिए है। इस दृष्टिकोण का लाभ यह है कि फ़ाइलों को एचडीएफएस में लोड किया जा सकता है-बिना किसी रूपांतरण के है और नोड्स में बहुत अधिक डेटा शफल नहीं होता है।

+0

बहुत अच्छा बिंदु! – leslie

+0

कुछ एमबी होने वाली छवि फ़ाइल को संसाधित करने के लिए इसे एक सेकंड से बहुत कम समय लेना चाहिए। फिर भी, अच्छा बिंदु। आप निश्चित रूप से एक एम/आर नौकरी लिख सकते हैं जिसने ऐसा किया था। आप एक समय में 1 मिलियन कर सकते हैं ताकि आप नाम नोड को उड़ा सकें। –

+0

इसके अलावा, 3000 एमबी इतना नहीं है (जाहिर है आपके हार्डवेयर के आधार पर)। 16 जीबी प्रति नोड बहुत आम है और यदि आप अपने नाम से अपना नामनोड चला रहे हैं, तो यह बहुत सारी फाइलें हैं! मैंने जिस क्लस्टर के साथ काम किया था वह 96 जीबी था .. यह अच्छा था :) –

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