部署Spark History Server到K8s

Spark History Server running on k8s

Spark History Server(SHS)是一个无状态服务,只要eventlog没有丢失,SHS重启或者切换是不会受到影响的。当然当我们开启了SHS的磁盘缓存的时候,如果SHS换了node启动,缓存可能就会丢失,但是SHS可以根据eventlog重新生成缓存,因此我们可以认为他是一个无状态服务。这样的服务在K8s上可以很容易的进行部署,本文将介绍如何把SHS部署到8s上,分享一下可能遇到的问题。

SHS image准备

Spark暂时还没有提供官方的spark docker image,所以我们需要自己准备好这个image。不过官方有提供build image的脚本,所以自己做image还是很方便的。

  1. spark code download
git clone https://github.com/apache/spark.git
  1. build spark with K8s
./build/mvn -Pkubernetes -DskipTests clean package
  1. build docker image
    spark提供了bin/docker-image-tool.sh这个脚本,可以直接用它来构建你的image,这个image不仅仅可以用来跑SHS也可以用来跑spark job,但是这个是非常基础的image,如果你有一些定制需求,可以尝试修改这个脚本。比如需要有default config,例如你可以再spark repo下创建一个特定的conf文件夹,里面可以包含一些配置文件,例如spark-default.conf,然后修改docker-image-tool.sh和Dockerfile脚本,这样才能保证你的image里有你的这个文件夹。
    docker-image-tool.sh
cp -r "conf" "$BASE_CTX/conf"

Dockerfile

COPY conf /opt/spark/conf

选择以下命令制作docker image:

$ ./bin/docker-image-tool.sh -r <repo> -t my-tag build

参考Spark官网中 Docker Images

部署SHS到k8s

准备一个yaml文件, kubectl apply -f shs.yaml
这里给到的是一个非常基本的一个deployment,重点关注下args这个参数,这里就是我们启动spark hitory server的命令。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: shs-v1
  namespace: default
spec:
  selector:
    matchLabels:
      run: shs-v1
  replicas: 2
  template:
    metadata:
      labels:
        run: shs-v1
    spec:
      containers:
        - image: <docker image>
          name: shs-v1
          args: ["/opt/spark/bin/spark-class", "org.apache.spark.deploy.history.HistoryServer"]
          ports:
            - containerPort: 18080
              name: http
          env:
            - name: SPARK_HISTORY_OPTS
              value: "-Dspark.history.fs.logDirectory=hdfs://xxxxxx"

你可以创造一个service或者利用kube proxy来访问这个SHS。

	kubectl expose deployment shs-v1 -n default --type=ClusterIP --name=shs-v1-svc

常见问题

  1. could not find spark-version-info.properties
    可以手动创建一个空的spark-version-info.properties文件,把它放到如下位置:
    …\core\src\main\resources\spark-version-info.properties

  2. 如果你是在windows环境对spark进行build,你可能需要用到:
    dos to unix命令,来转换一些.sh文件

  3. 如果spark.history.fs.logDirectory没有进行配置,就会使用默认值,/tmp/spark-events
    记得在Dockerfile里进行创建

 mkdir -p /tmp/spark-events && \

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