Part-I : 开发任务背景
Standalone 模式下为什么要支持构建任务设置 deployMode 为 cluster
对于 Kylin Job 节点,通常会有很多构建任务同时提交;在 client 模式下,每个正在运行的构建任务都会启动一个 Java 进程,并且这个 Java 进程包含了 Driver,可能会占用较多的内存资源和 CPU 资源,从而和 Kylin 节点抢占内存资源。为了摆脱该问题,可以考虑将 Driver 的运行提交到 Standalone Cluster 上去,从而使得构建任务更加稳定。
问题现象
我们尝试去通过修改"spark.submit.deployMode" 和 "spark.master=spark://xxx" 来进行功能验证;
第二步构建任务很快(0.14 分钟)结束,出现构建任务的状态出现错误,Cube 元数据错误,并且日志输出两个报错。
版本信息
- Hadoop 版本 : Hadoop 2.7
- Spark 版本 : Spark 2.4.6 (源码分析来自于 branch-2.4 分支)
- Kylin 版本 : Kylin 4.0.0-SNAPSHOT
错误信息
- 构建任务的状态出现错误, 0.14 分钟就错误地结束,任务并没有成功但是被标记为成功
- Cube 的 Segment 元数据发生错误,Parquet Storage 等缺失
- 结合 spark-submit.sh 的输出和 Spark 源码,发现 spark-submit 所在的进程(DriverClient)不会等待任务完成,就会直接退出进程。
- Driver 连续抛出
NullPointerException 和 FileNotFoundException
异常分析
- spark-submit 进程提前退出,并且进程的 exitcode 为 0, Kylin 进程误认为构建任务执行成功,标记任务为成功,执行后续步骤