gpt4 book ai didi

java - Hadoop 1.2.1:将jars放在hdfs中的类路径中

转载 作者:行者123 更新时间:2023-12-02 20:59:52 25 4
gpt4 key购买 nike

我有一个Hadoop工作,需要几个第3方 jar 。我已经用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 放在本地文件系统上,并收到相同的错误。有谁知道如何解决这个问题?

最佳答案

我无法确切地说出您正在做什么工作,但是看着这些类,看来是一个Mapreduce2 maptask,它在遇到该异常时会尝试设置。

我认为您可能正在更新错误的类路径值。您正在更新Hadoop类路径,而不是mapreduce类路径。

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

第二种是 yarn ,如果 yarn 需要任何其他的 jar ,则更新yarn.application.classpath属性,因为 yarn 类路径指向有助于 yarn 运行的纱 jar 。您可以在集群管理器应用程序中轻松地更新它,或者手动编辑yarn-site.xml以添加该类路径。

唯一的其他选择是,如果您的客户端软件程序具有自己的专用mapred-site.xml文件,则该文件会读取以从您那里获取mapreduce.application.classpath。如果是这样,则可以在您的软件支持的情况下仅在客户端站点上修改mapreduce.application.classpath。一些客户端程序可能具有自己的类路径,或读取hadoop群集站点xml文件以连接到群集。

我很确定从异常显示的内容可以肯定,您需要在mapreduce.application.path中使用此jar,而不是hadoop类路径。

关于java - Hadoop 1.2.1:将jars放在hdfs中的类路径中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43527968/

25 4 0