spark on k8s 镜像构建

本文档详细介绍了如何构建用于Spark on Kubernetes的基础镜像和任务镜像。首先,通过git clone获取特定版本的Spark源码,然后进行定制化构建,包括处理Hadoop版本冲突、安装必要的库和配置环境变量。接着,提供了Dockerfile的修改内容,用于创建包含Kubernetes支持的Spark镜像。最后,展示了任务镜像的构建过程,强调了在Dockerfile中配置HADOOP_CONF_DIR和解决executor连接driver的问题,以及配置spark-default.conf。整个过程涵盖了从源码编译到Docker镜像的创建,为运行Spark on Kubernetes任务提供了完整的解决方案。

spark on k8s 基础镜像的构建

背景

这是跑spark on k8s任务的基础镜像,用来指明executor pod的基础镜像

构建步骤

  • git clone spark特定的版本(假如是3.0.1版本),克隆完后,执行一下命令进行构建,构建出包含kubernetes模块的可运行包:

     ## spark 3.x兼容hadoop cdh版本,处理冲突
    git cherry-pick 8e8afb3a3468aa743d13e23e10e77e94b772b2ed
    
    ./dev/make-distribution.sh --name 2.6.0-cdh5.13.1  --pip --tgz -Phive -Phive-thriftserver -Pmesos -Pyarn -Pkubernetes -Dhadoop.version=2.6.0-cdh5.13.1 -DskipTests
    
  • 安装并加入必要的jar包
    按照lzoCodec,安装native-lzo library(用来支持lzo),
    把包含libhadoop.so的目录下的文件复制到assembly/target/scala-2.12/jars/hadoop_native
    把包含libgplcompression.so的目录下的文件复制到assembly/target/scala-2.12/jars/native
    把hadoop-lzo-0.4.15-cdh5.13.1.jar复制到assembly/target/scala-2.12/jars
    配置环境变量

    ENV SPARK_DIST_CLASSPATH=$SPARK_HOME/jars/native:$SPARK_HOME/jars/hadoop_native
    ENV LD_LIBRARY_PATH=$SPARK_HOME/jars/native:$SPARK_HOME/jars/hadoop_native
    ENV JAVA_LIBRARY_PATH=$SPARK_HOME/jars/native:$SPARK_HOME/jars/hadoop_native
    
    
  • 修改镜像代码为

    # distribution, the docker build command should be invoked from the top level directory
    # of the Spark distribution. E.g.:
    # docker build -t spark:latest -f kubernetes/dockerfiles/spark/Dockerfile .
    
    RUN 
### 如何在 Kubernetes 上配置并使用 SparkSession 要在 Kubernetes 上创建和配置 `SparkSession`,可以通过动态加载 Spark 配置属性来实现。以下是详细的说明: #### 动态加载 Spark 属性 通过 `spark-submit` 提交作业时,可以传递多个配置选项以设置 Spark 的运行环境。这些配置可以在提交命令中指定,也可以通过代码中的 `SparkConf` 对象定义。 ```bash ./bin/spark-submit \ --name "My app" \ --master k8s://<k8s-apiserver-host>:<k8s-apiserver-port> \ --conf spark.kubernetes.namespace=default \ --conf spark.executor.instances=5 \ --conf spark.app.name=my-spark-app \ myApp.jar ``` 此命令设置了 Spark 应用程序的名称、Kubernetes 主机地址以及命名空间等参数[^1]。 #### 使用 SparkSession 初始化 Spark 应用程序 在代码层面初始化 `SparkSession` 时,可以通过 `SparkConf` 设置相关属性。以下是一个示例代码片段: ```scala import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("Spark on Kubernetes Example") .config("spark.master", "k8s://https://<k8s-apiserver-host>:<k8s-apiserver-port>") .config("spark.kubernetes.container.image", "your-docker-image-name") .getOrCreate() // 执行一些操作... val df = spark.read.json("/path/to/json/file") df.show() spark.stop() ``` 在此代码中,`SparkSession.builder()` 被用来构建一个新的会话实例,并指定了 Kubernetes Master 地址和 Docker 容器镜像名[^2]。 #### 关于 Shuffle Service 名称的一致性 如果需要自定义 Shuffle Service 的名称,则必须确保 YARN NodeManager 和 Spark 应用程序之间的配置一致。例如,在 Spark 中设置如下属性: ```scala .config("spark.shuffle.service.enabled", "true") .config("spark.shuffle.service.name", "custom_shuffle_service_name") ``` 同时,YARN NodeManager 的配置文件也需要更新相应的 shuffle service name 值[^3]。 #### 查看 Spark 配置与日志 为了调试方便,可通过 Spark Web UI (`http://<driver>:4040`) 查看当前应用的所有配置项及其状态。此外,还可以调整日志级别以便更好地监控执行过程。修改 `log4j.properties` 文件即可完成这一目标。 #### 访问历史记录服务器 对于已完成的任务,可利用 History Server 来查看其详细信息。访问 REST API 接口获取特定 Application ID 下的所有 Executor 数据: ```text http://{ip}:{port}/api/v1/applications/{applicationId}/{attemptNumber}/allexecutors ``` 这有助于分析性能瓶颈或者排查错误原因[^5]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值