2011-01-18 13 views
5

मैं बना सकते हैं या HDFS में कुछ उत्पादन स्टोर करने के लिए एक फ़ाइल को खोलने की कोशिश कर रहा हूँ, लेकिन जब मैं नीचे दिए कोड स्निपेट की अंतिम पंक्ति के बाद दूसरे स्थान में exists विधि कॉल मैं एक NullPointerException हो रही है:क्यों जाँच है कि क्या एक फ़ाइल Hadoop में मौजूद है एक NullPointerException का कारण है?

DistributedFileSystem dfs = new DistributedFileSystem(); 
Path path = new Path("/user/hadoop-user/bar.txt"); 
if (!dfs.exists(path)) dfs.createNewFile(path); 
FSDataOutputStream dos = dfs.create(path); 

java.lang.NullPointerException 
     at org.apache.hadoop.dfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:390) 
     at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:667) 
     at ClickViewSessions$ClickViewSessionsMapper.map(ClickViewSessions.java:80) 
     at ClickViewSessions$ClickViewSessionsMapper.map(ClickViewSessions.java:65) 
     at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:47) 
     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:227) 
     at org.apache.hadoop.mapred.TaskTracker$Child.main(TaskTracker.java:2209) 

समस्या क्या हो सकता है:

यहाँ स्टैक ट्रेस है?

+0

आप पोस्ट कर सकते हैं अपवाद स्टैकट्रेस काम shoud? – OscarRyz

+0

मैंने स्टैक ट्रेस जोड़ा। – jonderry

+0

mhh कुछ भी नहीं http://hadoop.apache.org/common/docs/r0.17.2/api/org/apache/hadoop/dfs/DistributedFileSystem.html में दर्ज है: -/मुझे लगता है कि आप के लिए एक मुद्दा खोलने के लिए प्रयास करना चाहिए इस। मेलिंग सूची की जाँच करें: http://hadoop.apache.org/mailing_lists.html – OscarRyz

उत्तर

7

मुझे लगता है कि ऐसा करने का पसंदीदा तरीका है:।

Configuration conf = new Configuration(); 
conf.set("fs.default.name", "hdfs://mynamenodehost:9000"); 
FileSystem fs = FileSystem.get(conf); 
Path path = ... 

कि जिस तरह से आप FileSystem की एक विशेष कार्यान्वयन के लिए अपने कोड टाई नहीं; प्लस आप कैसे FileSystem में से प्रत्येक के कार्यान्वयन आरंभ नहीं हो जाता बारे में चिंता करने की जरूरत नहीं है

+0

'conf.set ("fs.default.name", "hdfs: // mynamenodehost: 9000") में स्ट्रिंग्स के लिए मैं क्या विकल्प दूं? – jonderry

+0

ओह, ठीक है मैं सिर्फ 'वी एम पर ifconfig' का परिणाम एवजी और यह काम किया। – jonderry

8

डिफ़ॉल्ट निर्माता DistributedFileSystem() प्रारंभ प्रदर्शन नहीं करता; आपको स्पष्ट रूप से dfs.initialize() को कॉल करने की आवश्यकता है।

कारण आप एक नल पॉइंटर एक्सेप्शन हो रही है कि DistributedFileSystem आंतरिक DFSClient का एक उदाहरण का उपयोग करता है। चूंकि आपने प्रारंभिक() को कॉल नहीं किया है, इसलिए DFSClient का उदाहरण शून्य है। getFileStatus() कॉल dfsClient.getFileInfo (getPathName (च) - जो, NullPointerException का कारण बनता है के बाद से dfsClient रिक्त है

देखें https://trac.declarativity.net/browser/src/hdfs/org/apache/hadoop/dfs/DistributedFileSystem.java?rev=3593

+0

dfs.initialize() दो तर्क, यूआरआई और एक विन्यास की आवश्यकता है। मुझे लगता है कि कॉन्फ़िगरेशन केवल जॉबकॉन्फ़ है जिसे क्लाइंट पर सेट किया गया है। यूआरआई के बारे में क्या? दस्तावेज़ीकरण के मुताबिक यूआरआई "एक यूरी है जिसका प्राधिकरण खंड इस फाइल सिस्टम के लिए मेजबान, बंदरगाह आदि का नाम है।" मैं इसे कैसे प्राप्त करूं? – jonderry

0

। यह

DistributedFileSystem dfs = new DistributedFileSystem(); 
dfs.initialize(new URI("URI to HDFS"), new Configuration()); 
Path path = new Path("/user/hadoop-user/bar.txt"); 
if (!dfs.exists(path)) dfs.createNewFile(path); 
FSDataOutputStream dos = dfs.create(path); 
संबंधित मुद्दे