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

### Kylin 删除 Cube 出现 OutOfMemoryError 错误的解决方案 当在 Apache Kylin 中删除 Cube 时遇到 `OutOfMemoryError` 或者 `Java heap space` 类型的错误,通常是因为 JVM 堆内存不足或者某些配置未优化所致。以下是针对该问题的具体分析和解决方法: #### 调整 JVM 设置 可以通过修改 `$KYLIN_HOME/conf/setenv.sh` 文件中的 `KYLIN_JVM_SETTINGS` 参数来增加堆内存大小。默认情况下,Kylin 配置的堆内存较小,可能无法满足实际需求。 原始默认配置如下: ```bash export KYLIN_JVM_SETTINGS="-Xms1024M -Xmx4096M -Xss1024K -XX:MaxPermSize=512M" ``` 如果需要更多内存支持,则可以取消另一种高配设置前的注释符号,并调整其值以适应具体环境[^3]: ```bash export KYLIN_JVM_SETTINGS="-Xms16g -Xmx16g -XX:MaxPermSize=512m -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC" ``` 此更改会显著提升可用堆空间,减少因内存不足引发的异常风险。 #### 修改 Spark 相关参数 对于基于 Spark 引擎运行的任务,在 `kylin.properties` 文件里加入额外选项也可以缓解此类状况。例如通过设定 driver 和 executor 的最大永久代区域尺寸 (MaxPermSize),确保有足够的临时存储供程序使用[^1]: ```properties kylin.engine.spark-conf.spark.driver.extraJavaOptions=-Dhdp.version=current -XX:MaxPermSize=512M ``` #### MapReduce Job Heap Size 自定义化处理 另外一种常见场景涉及到了 Hadoop 平台上的 map/reduce job 执行失败情况下的调优措施。此时可以在 `${KYLIN_HOME}/conf/kylin_job_conf.xml` 添加若干属性条目用于控制子进程启动时的最大允许堆容量限制[^5]: 示例 XML 片段展示如何分别指定 mapper 及 reducer 进程各自的 java opts max heap size: ```xml <property> <name>mapreduce.map.java.opts.max.heap</name> <value>983</value> </property> <property> <name>mapreduce.reduce.java.opts.max.heap</name> <value>983</value> </property> <property> <name>mapreduce.map.java.opts</name> <value>-Xmx8000m -XX:OnOutOfMemoryError='kill -9 %p'</value> </property> <property> <name>mapreduce.reduce.java.opts</name> <value>-Xmx8000m -XX:OnOutOfMemoryError='kill -9 %p'</value> </property> ``` 这些改动有助于防止由于单个 task 占用过多资源而导致整个作业崩溃的现象发生。 #### YARN ApplicationMaster Java Options Base 设定 最后还有一点需要注意的是,在 Cloudera Manager 界面中找到对应的 Yarn Service 页面之后,搜索关键字 “ApplicationMaster Java Opts Base”,然后在此处追加合适的 `-Xmx` 参数值作为补充说明[^4]。比如下面这个例子表示给 AM 分配大约等于总 RAM 容量百分之九十那么大一块连续地址区间来做工作区用途: ```shell -Djava.net.preferIPv4Stack=true -Xmx1800M ``` 以上四种方式结合起来能够有效应对大部分由内存溢出引起的功能障碍现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值