hadoop中的NoCLassDefFound错误

时间:2015-07-18 08:02:09

标签: java hadoop mapreduce protocol-buffers noclassdeffounderror

我正在使用hadoop 2.4.1版本。我正在尝试运行mapreduce作业,将数据从本地系统移动到hdfs集群(输出目录)。如果我将输出目录设置为本地系统路径,则程序运行正常。但是当我将输出目录设置为hdfs集群中的路径时,我收到以下错误

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/protobuf/ServiceException
    at org.apache.hadoop.ipc.ProtobufRpcEngine.<clinit>(ProtobufRpcEngine.java:69)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.hadoop.conf.Configuration.getClassByNameOrNull(Configuration.java:1834)
    at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1799)
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1893)
    at org.apache.hadoop.ipc.RPC.getProtocolEngine(RPC.java:203)
    at org.apache.hadoop.ipc.RPC.getProtocolProxy(RPC.java:537)
    at org.apache.hadoop.hdfs.NameNodeProxies.createNNProxyWithClientProtocol(NameNodeProxies.java:328)
    at org.apache.hadoop.hdfs.NameNodeProxies.createNonHAProxy(NameNodeProxies.java:235)
    at org.apache.hadoop.hdfs.NameNodeProxies.createProxy(NameNodeProxies.java:139)
    at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:510)
    at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:453)
    at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:136)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2397)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:89)
    at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2431)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2413)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:368)
    at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)
    at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.setOutputPath(FileOutputFormat.java:160)
    at s1.run(s1.java:66)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
    at s1.main(s1.java:75)
Caused by: java.lang.ClassNotFoundException: com.google.protobuf.ServiceException
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 25 more

我看到一些帖子表明这个问题可能与protobuf dependecy有关。 Hadoop 2.2.0 mapreduce job not running after upgrading from hadoop 1.0.4 我正在使用带有protobuf的hadoop commons jar 2.5.2。任何帮助解决这个问题将不胜感激。

3 个答案:

答案 0 :(得分:0)

让它正常工作!发现有一些2.2版本的罐子与当前版本不兼容。当我更新它们时,程序运行正常。

答案 1 :(得分:0)

如果您编译* .java,请使用默认的Java CLASSPATH是可以的。 编辑hadoop_env.sh 导出HADOOP_CLASSPATH = $ {CLASSPATH} 重新启动hadoop服务器

答案 2 :(得分:-1)

当类路径中没有类时,jvm会在运行时抛出

NoClassDefFoundError

检查你的课程路径。

也检查这个答案。如果您解决了NoClassDefFoundError link

,可能会有用