我正在学习如何在hadoop中使用mongodb数据作为输入来编写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
我找了好几个小时都没有结果。任何人都可以帮我。
这意味着mongo-hadoop-core.jar
在编译时可用,但在运行时不可用。
尝试在类路径中添加依赖jar来运行应用程序
示例:java -cp mongo-hadoop-core.jar<++other dependencies> MainClass
编辑1
如果您使用hadoop
shell 运行
通过执行hadoop classpath
检查classpath
,它将打印类路径中的dir/jars。
如果依赖jar不在类路径中,则使用export
命令将它们添加到classpath
中,然后执行hadoop jar yourjar.jar mainClass
编辑2
利用libjars
选项
hadoop jar myjar.jar mainClass -libjars ${LIBJARS}
我可以看到这个链接示例文件夹结构是maven。我在那个链接中看不到pom.xml。
我们可以将maven范围从provided
设置为runtime
- 您需要编写assembly.xml(将您的应用程序库和相关依赖项打包到tar文件中),并需要将其从pom.xml引用到包mongo-hadoop-core.jar以及安装在集群中的其他依赖项
export HADOOP_CLASSPATH=`HADOOP类路径`:`hbase类路径`
hadoop jar .... -cp $HADOOP_CLASSPATH MainClass
如果解压缩上面提到的tar文件,则可以引用类路径,例如:hadoop jar/lib/*主类其中lib文件夹包含所有的依赖项,比如mongodb。
- 如果集群中安装了mongodb和相关组件,我们可以提到类路径,如下例所示
另请参阅他们如何使用libjars