1

我正在学习如何使用 mongodb 数据作为输入在 hadoop 中编写 map/reduce 作业。所以我按照这个例子,但我得到了以下错误:

 Exception in thread "main" java.lang.NoClassDefFoundError: com/mongodb/hadoop/util/MongoConfigUtil
    at WordCount.main(WordCount.java:58)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: java.lang.ClassNotFoundException: com.mongodb.hadoop.util.MongoConfigUtil
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 7 more

我一直在寻找几个小时没有任何结果。任何人都可以帮助我。

4

2 回答 2

1

我可以看到这个链接示例文件夹结构是 maven。我在该链接中看不到 pom.xml。

我们可以将 maven 范围设置providedruntime

  1. 您需要编写assembly.xml(将您的应用程序库和相关依赖项打包到 tar 文件中),并且需要从 pom.xml 引用它来打包 mongo-hadoop-core.jar 以及其他未安装在集群中的依赖
导出 HADOOP_CLASSPATH=`hadoop 类路径`:`hbase 类路径`
hadoop jar .... -cp $HADOOP_CLASSPATH MainClass

如果您解压缩上面提到的 tar 文件,您可以参考类路径,例如:hadoop jar .... ../lib/* main classes where lib 文件夹包含您的所有依赖项,例如您的 mongodb。

  1. 如果集群中安装了 mongo db 和相关组件,我们可以提及类路径,如下例所示。

另请参阅此答案他们如何使用libjars

于 2016-05-18T05:45:24.983 回答
1

这意味着mongo-hadoop-core.jar在编译时可用,但在运行时不可用。

尝试在类路径中添加依赖 jar 来运行您的应用程序

例子 :java -cp mongo-hadoop-core.jar<++other dependencies> MainClass

编辑 1

如果您使用hadoopshell运行

检查classpath通过执行hadoop classpath它将打印类路径中的目录/罐子。

如果依赖的 jar 不在类路径中,则在classpathusingexport命令中添加它们,然后执行hadoop jar yourjar.jar mainClass

编辑 2

利用libjars选项

hadoop jar myjar.jar mainClass -libjars ${LIBJARS}

于 2016-05-18T03:47:47.460 回答