【教程】如何编译指定版本Spark
背景
我们目前在K8S集群中使用的spark是,基于kubeflow的Spark-Operator来运行的,对应的spark版本: 3.2.1
为啥要编译指定版本的Spark?
主要是需要读取一个消息队列的数据源, 看到有对应数据源spark读取的实现,有现成的。不过,是基于低版本spark 2.3的实现,想直接拿来用(果然没有现成的馅饼)。
结果: 悲剧了, 根本用不上。 还遇到一堆问题(不支持 On K8S、 spark operator的兼容性问题)
最终: 跑是跑起来了, 只能local模式。On K8S的问题有太多兼容性问题
所以,想着总结一下在这过程中遇到的问题
源码下载
Apache Spark, 选择对应的分支即可, 以下操作都以branch-2.3为例
准备工具
- sbt: 下载并安装
- jdk: jdk8
正式编译
假设你当前正在下载的spark根目录${source_code_root}
添加模块编译:
-Pkubernetes
: 启用 Kubernetes 模块
编译命令如下:
./build/sbt -Pkubernetes clean package
编译结果
在编译完成后,产生的结果如下:
- 运行环境的jar包: ${source_code_root}/assembly/target/scala-${scala_version}/jars
注意: 不同模块编译时,依赖生产的位置不同,最终都会放入这个jars目录下
- spark-submit: ${source_code_root}/bin
- spark-class: ${source_code_root}/bin
- entrypoint.sh: ${source_code_root}/resource-managers/kubernetes/docker/src/main/dockerfiles/spark
运行程序
./bin/spark-submit \
--master k8s://https://<k8s-apiserver-host>:<k8s-apiserver-port> \
--deploy-mode cluster \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=5 \
--conf spark.kubernetes.container.image=<spark-image> \
local:///path/to/examples.jar
遇到的报错
1. Exception in thread "main" org.apache.spark.SparkException: The Kubernetes mode does not yet support referencing application dependencies in the local file system.
解决方案: 不是spark的依赖jar的问题,是你需要提交的程序jar的问题,一般都是没有在需要运行的程序前面加: local:// 导致的