专栏首页容器计算Spark的Dockerfile分析

Spark的Dockerfile分析

1 Overview

Spark 容器化的前提是需要 Spark 的镜像文件,那么怎么 build 呢?Spark 官方是提供了 Dockerfile 的,并且也提供了脚本工具,可以自行 build 并发布到自己的 Restry 里。

2 Spark里的Kubernetes

2.1 Dockerfile

Spark 提供的 Dockerfile 可以在类似目录找到。

# tmp 是我放 Spark 的目录
/tmp/spark-2.4.2-bin-hadoop2.7/kubernetes/dockerfiles/spark

查看 Dockerfile 的内容,需要注意一下注释的内容,关键点在于构建命令 docker build...,需要在哪个目录去执行,注释写的很清楚,这里就不赘述了。然后一句句看下来再分析。

首先看第一部分是基础镜像。

FROM openjdk:8-alpine

第二部分是一些内部的临时变量 ARG。

ARG spark_jars=jars
ARG img_path=kubernetes/dockerfiles
ARG k8s_tests=kubernetes/tests

第三部分是一些命令。

# -e: 若指令传回值不等于0,则立即退出shell
# -x: 执行指令后,会先显示该指令及所下的参数
set -ex
# apk 是 alpine 提供的软件包管理工具
# upgrade --no-cache 重新更新已安装的软件包
# add 命令从仓库中安装最新软件包,并自动安装必须的依赖包,这里注意一下 tini,在 entrypoint.sh 中是很重要的角色
apk upgrade --no-cache
apk add --no-cache bash tini libc6-compat linux-pam nss
# 创建 Spark 相关的一些文件夹用来存放文件
mkdir -p /opt/spark
mkdir -p /opt/spark/work-dir
touch /opt/spark/RELEASE
# 这个是 linux 系统经常存在的配置,详细可以自行找找 /bin/sh 和 /bin/bash 的区别 
rm /bin/sh
ln -sv /bin/bash /bin/sh
echo "auth required pam_wheel.so use_uid" >> /etc/pam.d/su
chgrp root /etc/passwd
chmod ug+rw /etc/passwd

第四部分是将构建 Docker 镜像文件的时候,将本地文件 Copy 到镜像中。

COPY ${spark_jars} /opt/spark/jars
COPY bin /opt/spark/bin
COPY sbin /opt/spark/sbin
COPY ${img_path}/spark/entrypoint.sh /opt/
COPY examples /opt/spark/examples
COPY ${k8s_tests} /opt/spark/tests
COPY data /opt/spark/data

第五部分是设置环境变量和工作目录以及容器启动的脚本(后面也会分析这个脚本)。

ENV SPARK_HOME /opt/spark

WORKDIR /opt/spark/work-dir

ENTRYPOINT [ "/opt/entrypoint.sh" ]

2.2 Entrypoint

这个是容器的入口点,执行的是 COPY 进去镜像的 entrypoint.sh 文件。而这个脚本最后的命令是这样的。

exec /sbin/tini -s -- "${CMD[$]}"

打开内容可以看到,首先会根据容器启动的类型来初始化一些环节变量,并且根据启动的参数,来执行镜像里的脚本,并启动 Driver 或者 Executor,具体可以参看脚本内容。

# 篇幅有限,有删减
case "$SPARK_K8S_CMD" in
  driver)
    CMD=(
      "$SPARK_HOME/bin/spark-submit"
      --conf "spark.driver.bindAddress=$SPARK_DRIVER_BIND_ADDRESS"
      --deploy-mode client
      "$@"
    )
    ;;
    # 删减开始
    ...
    ...
    ...
    # 删减结束
  executor)
    CMD=(
      ${JAVA_HOME}/bin/java
      "${SPARK_EXECUTOR_JAVA_OPTS[@]}"
      -Xms$SPARK_EXECUTOR_MEMORY
      -Xmx$SPARK_EXECUTOR_MEMORY
      -cp "$SPARK_CLASSPATH"
      org.apache.spark.executor.CoarseGrainedExecutorBackend
      --driver-url $SPARK_DRIVER_URL
      --executor-id $SPARK_EXECUTOR_ID
      --cores $SPARK_EXECUTOR_CORES
      --app-id $SPARK_APPLICATION_ID
      --hostname $SPARK_EXECUTOR_POD_IP
    )
    ;;

  *)
    echo "Unknown command: $SPARK_K8S_CMD" 1>&2
    exit 1
esac

关于 tini 的使用,我也是最近才了解的,给两个参考链接。

http://yunke.science/2018/04/09/Tini-command/ https://github.com/krallin/tini/issues/8

3 Summary

我们可以根据 Spark 提供的镜像构建的方式,来构建自己的 Spark 镜像,适合有定制化需求的团队。

看完文章,大家可能会好奇,Spark 如何通过 K8S 的 Java 客户端来拉起镜像创建 Pod 的,后面会通过源码来继续分析。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 在 K8S 部署一个 Spark History Server - 篇2

    之前我们组在生产环境上部署的是 Spark 2.2 on k8s 的那个 fork,部署在 K8S 上,至少需要一个 Dockerfile,最近有计划升级到 3...

    runzhliu
  • Spark on Kubernetes PodTemplate 的配置

    本文主要讲 Apache Spark 在 on Kubernetes 的 PodTemplate 的问题,以及也会讲到 Spark Operator 里关于 P...

    runzhliu
  • spark shell 配置 Kryo 序列化

    Spark 默认使用 Java Serialization 作为序列化方式,但是这种序列化方式一般会被认为性能和效率一般。因此 Spark 官方是推荐使用 Kr...

    runzhliu
  • Mac部署spark2.4.4

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    程序员欣宸
  • 在 K8S 部署一个 Spark History Server - 篇1

    要在 K8S 集群中部署一套 Spark History Server,首先要了解,怎么部署一个本地版本。然后就是了解一些基本的 K8S 相关的知识点。最后就是...

    runzhliu
  • 分析Twitter上流行词与城市词典活动之间的时间关系(CS CL)

    作为在线的,众包的,开放式英语语词典,Urban Dictionary平台包含大量的观点,笑话以及术语,短语,首字母缩写等等的定义。但是,目前尚不清楚该平台上的...

    刘子蔚
  • 【漏洞通告】Jenkins插件多个漏洞通告

    5月6日,Jenkins官方发布安全公告修复插件中的9个漏洞,有5个插件受到影响。其中SCM Filter Jervis插件存在远程代码执行漏洞(CVE-202...

    绿盟科技安全情报
  • 灭霸级IPFS矿机来袭:千亿金矿我来了!

    最近搜IPFS矿机,我们关注到百度上有一篇叫做《一文带你细数IPFS矿机的种种坑》的热文,引起了国内IPFS矿工朋友们的强烈的反响。这篇文章将目前鱼龙混杂的IP...

    区块链领域
  • Struts2升级版本至2.5.10,高危漏洞又来了

    前情概要 漏洞年年有,最近特别多。2017年3月6日,Apache Struts2被曝存在远程命令执行漏洞,漏洞编号:S2-045,CVE编号:CVE-2017...

    小柒2012
  • 快速学习-Kafka 监控

    cwl_java

扫码关注云+社区

领取腾讯云代金券