我有一个hadoop工作,需要几个第三方罐子。我已将它们放在带有conf/hadoop-env.sh
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)
这个特殊的类应该用guava打包,它包含在类路径中:
[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
我从gremlin提交的工作如下:
graph = GraphFactory.open('conf/hadoop.properties')
result = graph.compute().program(MyVertexProgram.build().create()).submit().get()
我也尝试将jar放在本地文件系统上并收到相同的错误。有谁知道如何解决这个问题?
答案 0 :(得分:0)
我无法确切地说出你在做什么样的工作,但是看看这些类似乎是Mapreduce2 maptask,它会在你遇到异常时尝试设置。
我认为您可能正在更新错误的类路径值。您正在更新Hadoop类路径而不是mapreduce类路径。
您很可能需要更新群集管理器应用程序中的hadoop群集yarn / mapreduce2应用程序类路径值,或群集正在使用的站点xml文件。您应该有一个mapred-site.xml文件,该文件具有名为mapreduce.application.classpath的属性,该文件具有自己的类路径,指向它自己执行其作业所需的jar,将路径添加到mapreduce值的类路径中。而应用application.classpath值。
第二种用于纱线,如果纱线需要任何其他罐子,则更新yarn.application.classpath属性,因为纱线类路径指向有助于纱线运行的纱线罐。如果有,可以在集群管理器应用程序中轻松更新,或手动编辑yarn-site.xml以添加此类路径。
唯一的另一个选择是,如果您的客户端软件程序有自己专用的mapred-site.xml文件,它会从中读取以获取mapreduce.application.classpath。如果是这样,如果您的软件支持,您可以在客户端站点上修改mapreduce.application.classpath。某些客户端程序可能有自己的类路径,或者读取hadoop cluster站点xml文件以连接到群集。
我非常确定它在异常中显示的内容你在mapreduce.application.path中需要这个jar而不是hadoop类路径。