2015-09-09 3 views
0

Я получаю ошибки при импорте данных из mongodb в hdfs. I, как с помощью:Получение ошибки при импорте данных из mongodb в hdfs

  • Ambari Sandbox [Hortonworks] Hadoop 2.7
  • MongoDB версии 3.0

Эти файлы банку я в том числе:

  • Монго-Java-драйвер -2.11.4.jar
  • mongo-hadoop-core-1.3.0.jar

Вот код, я использую:

package com.mongo.test; 
    import java.io.*; 
    import org.apache.commons.logging.*; 
    import org.apache.hadoop.conf.*; 
    import org.apache.hadoop.fs.Path; 
    import org.apache.hadoop.io.*; 
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
    import org.apache.hadoop.mapreduce.lib.output.*; 
    import org.apache.hadoop.mapreduce.*; 
    import org.bson.*; 
    import com.mongodb.MongoClient; 
    import com.mongodb.hadoop.*; 
    import com.mongodb.hadoop.util.*; 

    public class ImportFromMongoToHdfs { 
    private static final Log log = 
    LogFactory.getLog(ImportFromMongoToHdfs.class); 
    public static class ReadEmpDataFromMongo extends Mapper<Object,  
    BSONObject, Text, Text>{ 
    public void map(Object key, BSONObject value, Context context) throws 
    IOException, InterruptedException{ 
    System.out.println("Key: " + key); 
    System.out.println("Value: " + value); 
    String md5 = value.get("md5").toString(); 
    String name = value.get("name").toString(); 
    String dev = value.get("dev").toString(); 
    String salary = value.get("salary").toString(); 
    String location = value.get("location").toString(); 
    String output = "\t" + name + "\t" + dev + "\t" + salary + "\t" + 
    location; 
    context.write(new Text(md5), new Text(output)); 
    } 
    } 
    public static void main(String[] args)throws Exception { 
    final Configuration conf = new Configuration(); 
    MongoConfigUtil.setInputURI(conf,"mongodb://10.25.3.196:27017/admin.emp") 
    ; 
    MongoConfigUtil.setCreateInputSplits(conf, false); 
    System.out.println("Configuration: " + conf); 
    final Job job = new Job(conf, "ReadWeblogsFromMongo"); 
    Path out = new Path("/mongodb3"); 
    FileOutputFormat.setOutputPath(job, out); 
    job.setJarByClass(ImportFromMongoToHdfs.class); 
    job.setMapperClass(ReadEmpDataFromMongo.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(Text.class); 
    job.setInputFormatClass(com.mongodb.hadoop.MongoInputFormat.class); 
    job.setOutputFormatClass(TextOutputFormat.class); 
    job.setNumReduceTasks(0); 
    System.exit(job.waitForCompletion(true) ? 0 : 1); 
    } 
    } 

Это ошибка я получаю обратно:

[[email protected] ~]# hadoop jar /mongoinput/mongdbconnect.jar com.mongo.test.ImportFromMongoToHdfs 

WARNING: Use "yarn jar" to launch YARN applications. 
Configuration: Configuration: core-default.xml, core-site.xml 
15/09/09 09:22:51 INFO impl.TimelineClientImpl: Timeline service address: http://sandbox.hortonworks.com:8188/ws/v1/timeline/ 
15/09/09 09:22:53 INFO client.RMProxy: Connecting to ResourceManager at sandbox.hortonworks.com/10.25.3.209:8050 
15/09/09 09:22:53 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this. 
15/09/09 09:22:54 INFO splitter.SingleMongoSplitter: SingleMongoSplitter calculating splits for mongodb://10.25.3.196:27017/admin.emp 
15/09/09 09:22:54 INFO mapreduce.JobSubmitter: number of splits:1 
15/09/09 09:22:55 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1441784509780_0003 
15/09/09 09:22:55 INFO impl.YarnClientImpl: Submitted application application_1441784509780_0003 
15/09/09 09:22:55 INFO mapreduce.Job: The url to track the job: http://sandbox.hortonworks.com:8088/proxy/application_1441784509780_0003/ 
15/09/09 09:22:55 INFO mapreduce.Job: Running job: job_1441784509780_0003 
15/09/09 09:23:05 INFO mapreduce.Job: Job job_1441784509780_0003 running in uber mode : false 
15/09/09 09:23:05 INFO mapreduce.Job: map 0% reduce 0% 
15/09/09 09:23:12 INFO mapreduce.Job: Task Id : attempt_1441784509780_0003_m_000000_0, Status : FAILED 
Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.mongodb.hadoop.MongoInputFormat not found 
     at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2195) 
     at org.apache.hadoop.mapreduce.task.JobContextImpl.getInputFormatClass(JobContextImpl.java:174) 
     at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:749) 
     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) 
     at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at javax.security.auth.Subject.doAs(Subject.java:415) 
     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) 
     at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 
Caused by: java.lang.ClassNotFoundException: Class com.mongodb.hadoop.MongoInputFormat not found 
     at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2101) 
     at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2193) 
     ... 8 more 
15/09/09 09:23:18 INFO mapreduce.Job: Task Id : attempt_1441784509780_0003_m_000000_1, Status : FAILED 
Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.mongodb.hadoop.MongoInputFormat not found 
     at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2195) 
     at org.apache.hadoop.mapreduce.task.JobContextImpl.getInputFormatClass(JobContextImpl.java:174) 
     at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:749) 
     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) 
     at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at javax.security.auth.Subject.doAs(Subject.java:415) 
     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) 
     at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 
Caused by: java.lang.ClassNotFoundException: Class com.mongodb.hadoop.MongoInputFormat not found 
     at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2101) 
     at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2193) 
     ... 8 more 
15/09/09 09:23:24 INFO mapreduce.Job: Task Id : attempt_1441784509780_0003_m_000000_2, Status : FAILED 
Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.mongodb.hadoop.MongoInputFormat not found 
     at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2195) 
     at org.apache.hadoop.mapreduce.task.JobContextImpl.getInputFormatClass(JobContextImpl.java:174) 
     at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:749) 
     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) 
     at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at javax.security.auth.Subject.doAs(Subject.java:415) 
     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)  at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 
Caused by: java.lang.ClassNotFoundException: Class com.mongodb.hadoop.MongoInputFormat not found 
     at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2101) 
     at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2193) 
     ... 8 more 

15/09/09 09:23:32 INFO mapreduce.Job: map 100% reduce 0% 
15/09/09 09:23:32 INFO mapreduce.Job: Job job_1441784509780_0003 failed with state FAILED due to: Task failed task_1441784509780_0003_m_000000 
Job failed as tasks failed. failedMaps:1 failedReduces:0 
15/09/09 09:23:32 INFO mapreduce.Job: Counters: 9 
     Job Counters 
       Failed map tasks=4 
       Launched map tasks=4 
       Other local map tasks=3 
       Rack-local map tasks=1 
       Total time spent by all maps in occupied slots (ms)=16996 
       Total time spent by all reduces in occupied slots (ms)=0 
       Total time spent by all map tasks (ms)=16996 
       Total vcore-seconds taken by all map tasks=16996 
       Total megabyte-seconds taken by all map tasks=4249000 
[[email protected] ~]# 

Кто-нибудь знает, что это неправильно?

+0

Не могли бы вы использовать [markdown] (http://stackoverflow.com/editing-help) для форматирования вашего сообщения, потому что его очень трудно читать. – user1438038

ответ

0

убедитесь, что вы держите mongo-hadoop jar в пути класса Hadoop и перезапустите Hadoop. Ошибка java.lang.ClassNotFoundException: Class com.mongodb.hadoop.MongoInputFormat.

+0

** Спасибо sras за ваш ценный ответ ** Я уже вставляю mongo-hadoop-jar в папку hadoop/lib.and перезагрузите hadoop, пока он не будет работать –

0

Вы получаете ClassNotFoundException, потому что вы не можете добраться до jar «mongo-hadoop-core * .jar». Вы должны сделать «Монго-Hadoop-жильный * .jar» доступны для кода

Есть много способов решить эту ошибку -

  1. Создание Fat Jar для вашей программы. Жирная банка будет содержать все необходимые банки. Вы можете легко создать толстую банку, если используете какую-либо IDE.

  2. использование "-libjars" аргумент при подаче вашей пряжи работу

  3. Копирование Mongo банок в Hadoop_Classpath месте

+0

Спасибо за полезный ответ, я уже вставляю mongo-hadoop -jar в папку hadoop/lib.и перезапустите хаоп, но он не будет работать. Как найти хадоп-классовые башки-хаусы. –

0

Я просто решить проблему, как это. Фактически, это ошибка во время выполнения. Если мы установили Hadoop_ClassPath, указывающие на внешние необходимые файлы jar, этого пока недостаточно. Поскольку, я думаю, во время выполнения Hadoop будет искать файлы jar в папке, в которой установлен Hadoop. Я понимаю, что нам нужно скопировать все необходимые внешние файлы jar в папку, установленную Hadoop. Итак: Во-первых, вам нужно проверить HADOOP_CLASSPATH, набрав: - hasoop classpath Затем скопируйте необходимый внешний файл jar в один из HADOOP_CLASSPATH. Например, я скопирую mongo-hadoop-1.5.1.jar и некоторые другие файлы jar в папку /usr/local/hadoop/share/hadoop/mapreduce.

Тогда это работает для меня!