2012-12-08 22 views
6

में नहीं खोल सकता है मैं एक कार्यक्रम पर काम कर रहा हूं जो Xuggle के साथ हैडोप के MapReduce ढांचे को एकीकृत करता है। इसके लिए, मैं IURLProtocolHandlerFactory कक्षा लागू कर रहा हूं जो हडोप डेटा ऑब्जेक्ट्स से और इन-मेमोरी को पढ़ता है और लिखता है।Xuggle मेमोरी इनपुट

आप यहाँ प्रासंगिक कोड देख सकते हैं: https://gist.github.com/4191668

विचार एक UUID साथ IURLProtocolHandlerFactory कक्षा में प्रत्येक BytesWritable वस्तु रजिस्टर करने के लिए इतना है कि जब मैं बाद में उस नाम का उल्लेख करते हुए फ़ाइल यह रिटर्न एक IURLProtocolHandler खोलने है उदाहरण जो BytesWritable ऑब्जेक्ट से जुड़ा हुआ है और मैं स्मृति से और मेमोरी पढ़ और लिख सकता हूं।

समस्या

कि मैं इस तरह एक अपवाद मिलता है:

java.lang.RuntimeException: could not open: byteswritable:d68ce8fa-c56d-4ff5-bade-a4cfb3f666fe 
at com.xuggle.mediatool.MediaReader.open(MediaReader.java:637) 

(पोस्ट लिंक के तहत भी देखें) डीबगिंग मुझे लगता है कि वस्तुओं को सही ढंग से कारखाने में पाए जाते हैं, क्या और भी है , उन्हें प्रोटोकॉल हैंडलर में भी पढ़ा जा रहा है। अगर मैं श्रोताओं को आउटपुट फ़ाइल से/हटा देता हूं, तो ऐसा होता है, इसलिए समस्या पहले ही इनपुट के साथ है। Xuggle के कोड में गहराई से खोना मैं जेएनआई कोड तक पहुंचता हूं (जो फ़ाइल खोलने की कोशिश करता है) और मैं इससे आगे नहीं जा सकता। यह स्पष्ट रूप से एक त्रुटि कोड देता है।

XugglerJNI.IContainer_open__SWIG_0 

मैं वास्तव में कुछ संकेतों की सराहना करता हूं कि आगे जाने के लिए, मुझे डिबगिंग कैसे जारी रखना चाहिए। शायद मेरे कार्यान्वयन में एक दोष है, लेकिन मैं इसे नहीं देख सकता।

उत्तर

2

मुझे लगता है कि आप जिस समस्या का सामना कर रहे हैं वह यह है कि IContainer जेएनआई कोड में कई प्रकार के इनपुट/आउटपुट को मूल फ़ाइल डिस्क्रिप्टर में परिवर्तित कर दिया जाता है, लेकिन जो चीज आप पास कर रहे हैं उसे परिवर्तित नहीं किया जा सकता है। इस तरह से अपना खुद का IURLProtocolHandler बनाना संभव नहीं है, क्योंकि यह XuggleIO.map() के माध्यम से यात्रा के बाद, बस आईकॉन्टेनर को फिर से कॉल करना और फिर आईसीओन्टैनर जेएनआई कोड में समाप्त होना संभव होगा जो शायद मूल फ़ाइल डिस्क्रिप्टर प्राप्त करने का प्रयास करेगा और avio_open() पर कॉल करेगा ।

हालांकि, वहाँ चीजों की एक जोड़ी हो सकता है कि आप यह कर सकते हैं IContainer जो नहीं संचिका/कोई फ़ाइल वर्णनकर्ता है, और सही ढंग से हैंडल किया जाएगा, जिसमें खुला। जिन चीजों को आप खोल सकते हैं उन्हें IContainer कोड, java.io.DataOutput और java.io.DataOutputStream (और संबंधित इनपुट) में देखा जा सकता है। मैं आपके डेटा इनपुट/डेटाऑटपुट कार्यान्वयन को बनाने की अनुशंसा करता हूं जो बाइट्स रीडेबल/बाइट्स्राइटेबल के आसपास लपेटता है, और इसे आईकॉन्टेनर में खोलता है।

यदि वह काम नहीं करता है, तो एक अस्थायी फ़ाइल के लिए आपके इनपुट लिख सकते हैं और एक अस्थायी फ़ाइल :) से आउटपुट को पढ़ने के

+0

सभी को ठीक करने का प्रयास करें। यह पढ़ने और लिखने के लिए अपना खुद का IURLProtocolHandlerFactory लिखना इतना अच्छा और साफ विचार प्रतीत होता था। मैंने देखा कि मैं अपने इनपुट के लिए डेटा इनपुट लागू करूंगा और अभी भी हमारे इनपुट के लिए IURLProtocolHandlerFactory का उपयोग करूंगा, लेकिन मैं चुपचाप उम्मीद कर रहा था कि यह साफ और अच्छा रखना संभव है। तो फिर भी इस इंटरफेस का मुद्दा है?एक कार्य कार्यान्वयन कैसे दिखता है? – gphilip

0

आप स्थानीय पहले पर फ़ाइल की प्रतिलिपि कर सकते हैं और उसके बाद कंटेनर को खोलने का प्रयास करें:

filePath = split.getPath(); 
final FileSystem fileSystem = filePath.getFileSystem(job); 
Path localFile = new Path(filePath.getName()); 
fileSystem.createNewFile(localFile); 
fileSystem.copyToLocalFile(filePath, localFile); 
int result = container.open(filePath.getName(), IContainer.Type.READ, null); 

यह कोड मेरे लिए रिकॉर्डरडर कक्षा में काम करता है।

अपने मामले में आप फ़ाइल को स्थानीय में प्रतिलिपि बना सकते हैं और फिर MediaReader