2012-05-26 48 views
2

這是一個未解決的問題,發佈在支持論壇here上,但由於我沒有得到任何答覆,我以爲我應該試着在這裏問。Mongo-Hadoop簡單測試與NPE失敗

我有一個現有的應用程序使用MongoDB作爲 數據層。目前我正在使用Mongo的Map減少機制,但是,我正面臨着一些性能問題。所以我想到了使用Hadoop來實現這個邏輯的 。

我已經成功運行了國庫產量示例,並且想到 創建了一個簡單的項目,以便了解mongo-hadoop驅動程序。 所以我創建了一個項目,在構建 路徑中插入相應的jar文件並運行它。

這是我的Java代碼:

final Configuration conf = new Configuration(); 
    MongoConfigUtil.setInputURI(conf, "mongodb:// 
          username:[email protected]/locations"); 
    MongoConfigUtil.setOutputURI(conf, "mongodb://localhost/ 
           test.out"); 
    System.out.println("Conf: " + conf); 
    final Job job = new Job(conf, "word count"); 
    job.setJarByClass(WordCount.class); 
    job.setMapperClass(TokenizerMapper.class); 
    job.setCombinerClass(IntSumReducer.class); 
    job.setReducerClass(IntSumReducer.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class); 
    job.setInputFormatClass(MongoInputFormat.class); 
    job.setOutputFormatClass(MongoOutputFormat.class); 
    System.exit(job.waitForCompletion(true) ? 0 : 1);" 

,但我收到此錯誤:

Conf: Configuration: core-default.xml, core-site.xml 
12/05/20 14:12:03 WARN util.NativeCodeLoader: Unable to load native- 
hadoop library for your platform... using builtin-java classes where 
applicable 
12/05/20 14:12:03 WARN mapred.JobClient: Use GenericOptionsParser for 
parsing the arguments. Applications should implement Tool for the 
same. 
12/05/20 14:12:03 WARN mapred.JobClient: No job jar file set. User 
classes may not be found. See JobConf(Class) or 
JobConf#setJar(String). 
12/05/20 14:12:03 INFO mapred.JobClient: Cleaning up the staging area 
file:/tmp/hadoop-maximos/mapred/staging/maximos1261801897/.staging/ 
job_local_0001 
Exception in thread "main" java.lang.NullPointerException 
     at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java: 
796) 
     at com.mongodb.DBApiLayer.doGetCollection(DBApiLayer.java:116) 
     at com.mongodb.DBApiLayer.doGetCollection(DBApiLayer.java:43) 
     at com.mongodb.DB.getCollection(DB.java:81) 
     at 
com.mongodb.hadoop.util.MongoSplitter.calculateSplits(MongoSplitter.java: 
51) 
     at 
com.mongodb.hadoop.MongoInputFormat.getSplits(MongoInputFormat.java: 
51) 
     at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java: 
962) 
     at org.apache.hadoop.mapred.JobClient.writeSplits(JobClient.java:979) 
     at org.apache.hadoop.mapred.JobClient.access$600(JobClient.java:174) 
     at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:897) 
     at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:850) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at javax.security.auth.Subject.doAs(Subject.java:416) 
     at 
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.j ava: 
1093) 
     at 
org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java: 
850) 
     at org.apache.hadoop.mapreduce.Job.submit(Job.java:500) 
     at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:530) 
     at 
com.mongodb.hadoop.examples.wordcount.WordCount.main(WordCount.java: 
100) 

我做錯了嗎?這是Mongo,Hadoop還是Mongo-Hadoop問題?

回答

0

它看起來像忘了指定您的集合的名稱(即您從中獲取數據)。

在這個例子行看起來是這樣的:

MongoConfigUtil.setInputURI(conf, "mongodb://localhost/test.in"); 

然而,在你的代碼中,我看到:

MongoConfigUtil.setInputURI(conf, "mongodb:// 
         username:[email protected]/locations"); 

我不知道,如果單元是該集合名稱或數據庫名稱,如果它是集合,那麼您可以嘗試在數據庫名稱前加前綴。如果是數據庫,請在其末尾添加.yourcollectionname。