Kylin使用spark引擎構建cube報錯:java.lang.VerifyError: class com.google.common.collect.EmptyImmutableList

1.問題

kylin版本:3.0.1

spark版本2.4.0(版本有很多修改,還有很多UDF)

yarn方式提交(local模式沒有問題)

在kylin中使用spark引擎構建cube的時候,一直會報如下錯誤:

INFO DAGScheduler: ShuffleMapStage 0 (mapToPair at SparkCubingByLayer.java:169) failed in 9.119 s due to Job aborted due to stage failure: Task 6 in stage 0.0 failed 4 times, most recent failure: Lost task 6.3 in stage 0.0 (TID 18, sd-hadoop-datanode-5
1-131.idc.vip.com, executor 2): java.lang.VerifyError: class com.google.common.collect.EmptyImmutableList overrides final method toArray.([Ljava/lang/Object

這裏有相關詳細問題:https://issues.apache.org/jira/browse/KYLIN-4102

這已經被認定不是一個bug,root cause:jar conflict.

2.解決歷程

1)根據報錯日誌,可以明確一點,spark在遇到action操作的時候會報錯。

我在源碼上對SparkCubingByLayer這個類加了幾行代碼如下(大概190行左右):

logger.info("SparkCubingByLayer jar real url is :{}", SparkCubingByLayer.class.getClassLoader().getResource("com/google/common/collect/EmptyImmutableList.class"));
allRDDs[0].take(5).forEach(item -> {
            logger.info("SparkCubingByLayer, item:{}, {}",item._1, item._2);
        });

打包,將apache-kylin-3.0.1-bin-hbase1x/lib/下的kylin-job-3.0.1.jar替換成源碼assembly下的kylin-assembly-3.0.1-job.jar(記得改名字,改爲kylin-job-3.0.1.jar)

重啓kylin

bin/kylin.sh stop

bin/kylin.sh start

構建cube,日誌如下:

SparkCubingByLayer real url is :jar:file:/xxx/xxx/xxx/xxx/xxx/xx-xx-xx/jars/guava-14.0.1.jar!/com/google/common/collect/EmptyImmutableList.class

20/04/06 21:04:12 WARN TaskSetManager: Lost task 11.0 in stage 0.0 (TID 10, jssz-bigdata-odatanode-359, executor 3): java.lang.VerifyError: class com.google.common.collect.EmptyImmutableList overrides final method toArray.([Ljava/lang/Object;)[Ljava/lang/Object;

可以看出加載的jar包是guava-14.0.1版本,看了jar的源碼,根本沒有啥問題。

經過分析kylin的源碼略微可以知道,kylin提交spark任務是以套娃的形式提交,任務裏面套了一層任務,此時我認爲問題出在spark集羣的執行節點。

(2)經過參考kylin文檔(中文看的真舒服),在kylin web頁面 System-> Server Config中添加配置:

kylin.engine.spark-conf.spark.yarn.archive=xxx

xxx爲local模式spark運行需要的jar,將其放到hdfs目錄,這樣spark運行就會讀取這個目錄的jar,而不是讀取每一個datanode上的jar。

重啓kylin,重啓之前可以刪除bin目錄下的cache開頭的文件,這是一些緩存配置。

然後就這樣解決了,問題是我們讀spark進行了修改,引入了其他版本的guava jar。

3.心得

也算是解決了kylin的spark運行的傷,這個問題卡了兩週,心痛,在此也感謝https://issues.apache.org/jira/browse/KYLIN-4102這位熱心同道中人的解答。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章