歡迎您光臨本站 註冊首頁

這篇文章主要介紹了啟動Azkaban報錯:java.lang.NoSuchMethodError: com.google.common.collect.ImmutableMap.toImmutableMap,需要的朋友可以參考下
問題描述:
啟動Azkaban報錯:
java.lang.NoSuchMethodError:com.google.common.collect.ImmutableMap.toImmutableMap
解決方法:
從報錯信息來看,是找不到toImmutableMap這個方法。首先找到類ImmutableMap對應的Jar包為guava,然後在服務器查找這個Jar包:
find / -name "guava*.jar"
發現除了Azkaban安裝目錄,其他程序目錄下也有guava包。Azkaban裡面的guava包版本為guava-21.0.jar,其他程序的版本有11,14,17,18,19,21,25,懷疑是由於有多個guava包,而使用的是低版本的包,裡面沒有toImmutableMap方法。
接下來,看看azkaban運行時候的classpath是什麼樣的。查看Web Server啟動文件 start-web.sh :
more /u01/app/azkaban-3.50.0/azkaban-web-server-0.1.0-SNAPSHOT/bin/start-web.sh
內容為:
#!/bin/bash script_dir=$(dirname $0) ${script_dir}/internal/internal-start-web.sh >webServerLog_`date +%F+%T`.out 2>&1 &
調用的是internal-start-web.sh,於是再查看:
more /u01/app/azkaban-3.50.0/azkaban-web-server-0.1.0-SNAPSHOT/bin/internal/internal-start-web.sh
內容為:
#!/bin/bash azkaban_dir=$(dirname $0)/../.. # Specifies location of azkaban.properties, log4j.properties files # Change if necessary conf=$azkaban_dir/conf if [[ -z "$tmpdir" ]]; then tmpdir=/tmp fi for file in $azkaban_dir/lib/*.jar; do CLASSPATH=$CLASSPATH:$file done for file in $azkaban_dir/extlib/*.jar; do CLASSPATH=$CLASSPATH:$file done for file in $azkaban_dir/plugins/*/*.jar; do CLASSPATH=$CLASSPATH:$file done if [ "$HADOOP_HOME" != "" ]; then echo "Using Hadoop from $HADOOP_HOME" CLASSPATH=$CLASSPATH:$HADOOP_HOME/conf:$HADOOP_HOME/* JAVA_LIB_PATH="-Djava.library.path=$HADOOP_HOME/lib/native/Linux-amd64-64" else echo "Error: HADOOP_HOME is not set. Hadoop job types will not run properly." fi if [ "$HIVE_HOME" != "" ]; then echo "Using Hive from $HIVE_HOME" CLASSPATH=$CLASSPATH:$HIVE_HOME/conf:$HIVE_HOME/lib/* fi echo $azkaban_dir; echo $CLASSPATH; executorport=`cat $conf/azkaban.properties | grep executor.port | cut -d = -f 2` serverpath=`pwd` if [[ -z "$AZKABAN_OPTS" ]]; then AZKABAN_OPTS="-Xmx4G" fi # Set the log4j configuration file if [ -f $conf/log4j.properties ]; then AZKABAN_OPTS="$AZKABAN_OPTS -Dlog4j.configuration=file:$conf/log4j.properties -Dlog4j.log.dir=$azkaban_dir/logs" else echo "Exit with error: $conf/log4j.properties file doesn't exist." exit 1; fi AZKABAN_OPTS="$AZKABAN_OPTS -server -Dcom.sun.management.jmxremote -Djava.io.tmpdir=$tmpdir -Dexecutorport=$executorport -Dserverpat h=$serverpath" java $AZKABAN_OPTS $JAVA_LIB_PATH -cp $CLASSPATH azkaban.webapp.AzkabanWebServer -conf $conf $@ & echo $! > $azkaban_dir/currentpid
可以看到,Azkaban安裝目錄的jar包是在原$CLASSPATH之後的,如下:
for file in $azkaban_dir/lib/*.jar; do CLASSPATH=$CLASSPATH:$file done
這樣,其他目錄下的guava包就會被先找到使用。好了,問題原因找到了,解決方法就很簡單了,將 CLASSPATH=$CLASSPATH:$file 改為 CLASSPATH=$file:$CLASSPATH ,讓Azkaban安裝目錄下的guava包先被找到使用。另外,Executor Server的啟動文件/u01/app/azkaban-3.50.0/azkaban-exec-server-0.1.0-SNAPSHOT/bin/internal/internal-start-executor.sh也需要做同樣修改。
修改完成後,再啟動服務就正常了。(Executor Server和Web Server都需要重新啟動)
完畢。


[e36605 ] 解決啟動Azkaban報錯問題:java.lang.NoSuchMethodError: com.google.common.collect.ImmutableMap.toImmutableMap已經有241次圍觀

http://coctec.com/docs/java/show-post-232697.html