【发布时间】:2015-07-18 08:02:08
【问题描述】:
我使用的是 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 依赖有关。 Hadoop 2.2.0 mapreduce job not running after upgrading from hadoop 1.0.4 我正在使用具有 protobuf 的 hadoop commons jar 2.5.2。任何解决此问题的帮助将不胜感激。
【问题讨论】:
-
你确定 2.5.2 包含 protobuf.ServiceException。它不会出现在 JARFinder 中。您可以尝试将 protobuf 作为另一个 jar 导入。
-
@TheJavatar:谢谢!会这样做!
-
@TheJavatar:我添加了 protobuf java -2.4.1 jar 并运行了程序。它给出了以下异常。线程“主”java.lang.VerifyError 中的异常:类 org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$CompleteRequestProto 覆盖最终方法 getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet;在 java.lang.ClassLoader.defineClass1(Native Method) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:760) 在 java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ..
-
看起来hadoop(不是protobuf)会干扰java.lang(试图覆盖final方法),这很奇怪。
-
@TheJavatar:我发现了一个类似的问题grepalex.com/2014/02/09/flume-and-hadoop-2.2。所以这个问题是关于 protobuf 版本变化的?
标签: java hadoop mapreduce protocol-buffers noclassdeffounderror