2017-04-20 104 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