2017-04-20 66 views
0

我有一个需要多个第三方jar的hadoop作业。我已经把它们放在类路径conf/hadoop-env.shHadoop 1.2.1:将jar放入类路径中的hdfs中

export HADOOP_CLASSPATH=hdfs://name.node.private.ip:9000/home/ec2-user/hadoop-gremlin-libs/ 

当我运行$ bin/hadoop classpath包含了这条路,你可以看到here。然而,当我去运行一个作业时,它抛出初始化错误:

Error: java.lang.ClassNotFoundException: com.google.common.collect.Lists 
    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) 
    at org.apache.giraph.conf.AllOptions.<clinit>(AllOptions.java:37) 
    at org.apache.giraph.conf.ClassConfOption.<init>(ClassConfOption.java:47) 
    at org.apache.giraph.conf.ClassConfOption.create(ClassConfOption.java:60) 
    at org.apache.giraph.conf.GiraphConstants.<clinit>(GiraphConstants.java:62) 
    at org.apache.giraph.conf.GiraphClasses.readFromConf(GiraphClasses.java:152) 
    at org.apache.giraph.conf.GiraphClasses.<init (GiraphClasses.java:142) 
    at org.apache.giraph.conf.ImmutableClassesGiraphConfiguration.<init>(ImmutableClassesGiraphConfiguration.java:93) 
    at org.apache.giraph.bsp.BspOutputFormat.getOutputCommitter(BspOutputFormat.java:56) 
    at org.apache.hadoop.mapred.Task.initialize(Task.java:515) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:347) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:422) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190) 
    at org.apache.hadoop.mapred.Child.main(Child.java:249) 

这种特殊的类都应该打包番石榴,这是包含在类路径:

[ec2-user]$ bin/hadoop dfs -ls /home/ec2-user/hadoop-gremlin-libs | grep guava 
-rw-r--r-- 3 ec2-user supergroup   0 2017-04-20 17:57 /home/ec2-user/hadoop-gremlin-libs/guava-18.0.jar 

我提交这项工作从小鬼如下:

graph = GraphFactory.open('conf/hadoop.properties') 
result = graph.compute().program(MyVertexProgram.build().create()).submit().get() 

我也试图把罐子上的本地文件系统,并收到同样的错误。有谁知道如何解决这个问题?

+1

将它们添加到localFS .... – franklinsijo

+0

@franklinsijo如果jar在本地文件系统上,我会收到完全相同的错误。 – cscan

+0

hadoop库已经在其中有一个'guava.jar',这里的hadoop的版本比1.2.1更早。老年番石榴罐中没有'列表'类。不是类加载器的专家,我不完全确定JVM在这种情况下的行为。 – franklinsijo

回答

0

我无法确切知道你在做什么类型的工作,但是看着这些类似乎是它在尝试设置当你遇到该异常时要设置的Mapreduce2 maptask。

我想你可能正在更新错误的classpath值。您正在更新Hadoop类路径而不是mapreduce类路径。

很可能您需要更新群集管理器应用程序中的hadoop群集yarn/mapreduce2应用程序类路径值或群集正在使用的站点xml文件。你应该有一个mapred-site.xml文件,它具有名为mapreduce.application.classpath的属性,它具有自己的类路径以指向它自己的需要执行其作业的jar,并将你的路径添加到mapreduce值的classpath中。而不是application.classpath值。

第二种用于纱线,如果纱线需要其他罐子,则更新yarn.application.classpath属性,因为纱线类路径指向纱线罐,以帮助纱线运行。您可以在集群管理器应用程序中轻松更新(如果有),或手动编辑yarn-site.xml以添加此类路径。

唯一的另一种选择是,如果你的客户端软件程序有它自己专用的mapred-site.xml文件,它会读取你的mapreduce.application.classpath文件。如果是这样,您可以修改客户端网站上的mapreduce.application.classpath(如果您的软件支持它)。某些客户端程序可能有自己的类路径,或读取hadoop集群站点xml文件以连接到集群。

我非常确定它在异常情况下显示的内容,您在mapreduce.application.path而不是hadoop类路径中以某种方式需要此jar。

+0

该属性在hadoop 1.2.1中不存在。另外,在Hadoop 2中引入了纱线。在hadoop 1.2.1的映射配置中似乎没有与类路径相关的任何属性:https://hadoop.apache.org/docs/r1.2.1/mapred-default。 HTML – cscan