Hadoop外部罐子

Posted

技术标签:

【中文标题】Hadoop外部罐子【英文标题】:Hadoop external jars 【发布时间】:2015-01-16 23:57:27 【问题描述】:

我正在尝试在服务器上运行 hadoop 作业。版本是0.20.2

我有很多罐子,我正在运行:

hadoop jar GenData.jar -libjars /path/jar1,path/jar2,...

即使相应的类在罐子内,我也会收到以下错误:

线程“主”java.lang.NoClassDefFoundError 中的异常: org/apache/avro/mapreduce/AvroKeyInputFormat 在 GenerateTrainningData.main(GenerateTrainningData.java:256) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.apache.hadoop.util.RunJar.main(RunJar.java:197) 原因: java.lang.ClassNotFoundException: org.apache.avro.mapreduce.AvroKeyInputFormat 在 java.net.URLClassLoader$1.run(URLClassLoader.java:366) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:355) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:354) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:425) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:358)

【问题讨论】:

在此处查看我的答案,我已在此处解释了解决此问题的所有可用选项:***.com/a/36227260/1766402 【参考方案1】:

看起来您从 Hadoop 客户端收到此异常,Mapreduce 驱动程序代码执行发生在客户端 JVM 中。在 hadoop -libjars 中是一个通用选项,用于将依赖的 jars 添加到 mapper/reducer。在您将 Jars 添加到客户端集的情况下,您可以在执行 hadoop 命令之前设置以下环境变量。

export HADOOP_CLASSPATH=<PATH_to_jar>/Jar1:<PATH_to_jar>/Jar2;    

(冒号“:”可用于指定超过 1 个罐子,在您的情况下,您可以添加包含类 org.apache.avro.mapreduce.AvroKeyInputFormat 的罐子)。

新修改

首先您需要找到包含org.apache.avro.mapreduce.AvroKeyInputFormat 类的jar。您可以在 jar avro-mapred*.jar 中找到类(从 Internet 获取 avro-mapred-version.jar 的兼容版本)使用 above 命令在您的类路径中包含相同的类。

【讨论】:

有完全相同的问题,这并没有解决它:(【参考方案2】:

您缺少avro-mapred 依赖项。

【讨论】:

以上是关于Hadoop外部罐子的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse IDE - 添加 jar?添加外部罐子?添加图书馆?

使用外部 Java 库的猪 UDF

包装像 pyspark 的罐子

在捆绑包中包含第 3 方罐子

使用 maven 构建一个胖罐子

添加外部Jar时Hadoop NoClassDefFoundError