当前位置: 首页 > 工具软件 > Google Spark > 使用案例 >

Kylin使用spark引擎构建cube报错:java.lang.VerifyError: class com.google.common.collect.EmptyImmutableList

吴均
2023-12-01

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这位热心同道中人的解答。

 类似资料: