Hadoop 1.2.1:将jar放在类路径的hdfs中

时间:2017-04-20 19:10:36

标签: java hadoop hdfs classpath gremlin

我有一个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放在本地文件系统上并收到相同的错误。有谁知道如何解决这个问题?

1 个答案:

答案 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类路径。