前往小程序,Get更优阅读体验!
立即前往
社区首页 >专栏 >在 K8S 部署一个 Spark History Server - 篇2

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

作者头像
runzhliu
发布于 2020-08-06 01:50:57
发布于 2020-08-06 01:50:57
1.2K00
代码可运行
举报
文章被收录于专栏:容器计算容器计算
运行总次数:0
代码可运行

1 Overview

之前我们组在生产环境上部署的是 Spark 2.2 on k8s 的那个 fork,部署在 K8S 上,至少需要一个 Dockerfile,最近有计划升级到 3.0.0 Snapshot 的分支代码上,借此,做个记录。

History Server => HS

2 Start

Spark 自2.3.0,之后就提供官方的 Dockerfile 了,可以基于生产环境的需求,自行 build。所以这里调研一下,Dockerfile 能否直接支持运行一个 HS 的进程。

贴个 Dockerfile 看看(删除了一些注释)。

代码语言:javascript
代码运行次数:0
复制
FROM openjdk:8-alpine

ARG spark_uid=185

RUN set -ex && \
    apk upgrade --no-cache && \
    ln -s /lib /lib64 && \
    apk add --no-cache bash tini libc6-compat linux-pam krb5 krb5-libs nss && \
    mkdir -p /opt/spark && \
    mkdir -p /opt/spark/examples && \
    mkdir -p /opt/spark/work-dir && \
    touch /opt/spark/RELEASE && \
    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

COPY jars /opt/spark/jars
COPY bin /opt/spark/bin
COPY sbin /opt/spark/sbin
COPY kubernetes/dockerfiles/spark/entrypoint.sh /opt/
COPY examples /opt/spark/examples
COPY kubernetes/tests /opt/spark/tests
COPY data /opt/spark/data

ENV SPARK_HOME /opt/spark

WORKDIR /opt/spark/work-dir
RUN chmod g+w /opt/spark/work-dir

ENTRYPOINT [ "/opt/entrypoint.sh" ]

# Specify the User that the actual main process will run as
USER ${spark_uid}

看出来了,不论 Driver 还是 Executor,这个 Dockerfile 来跑什么,取决于最后的脚本 entrypoint.sh

再贴个 entrypoint.sh 的关键代 码。

代码语言:javascript
代码运行次数:0
复制
case "$1" in
  driver)
    shift 1
    CMD=(
      "$SPARK_HOME/bin/spark-submit"
      --conf "spark.driver.bindAddress=$SPARK_DRIVER_BIND_ADDRESS"
      --deploy-mode client
      "$@"
    )
    ;;
  executor)
    shift 1
    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 "Non-spark-on-k8s command provided, proceeding in pass-through mode..."
    CMD=("$@")
    ;;
esac

注意到了,当运行这个 Dockerfile build 出来的容器的时候,需要输入一些参数,如果输入 driver 则运行的是一个 Driver 进程,如果是 executor 就是一个 Executor 进程。

那么如果想跑 HS 这样的进程服务的时候该怎么办呢?

显然最后一个选项就是给兜底的,你可以运行 Spark 官方提供的 start-history-server.sh

所以按照官方 build 完镜像之后可以试试。

代码语言:javascript
代码运行次数:0
复制
./bin/docker-image-tool.sh -t v3.0.0 build

然后运行 start-history-server.sh,其实细看这个脚本文件,HS 是用 Daemon 的方式运行的,Docker 是不能直接跑后台进程的(这个说法可能有误,大概可以先这么理解)。而 HS 其实就是运行 org.apache.spark.deploy.history.HistoryServer 这个启动类,所以按照下面这个脚本跑吧。

代码语言:javascript
代码运行次数:0
复制
docker run -it spark:v3.0.0 /opt/spark/bin/spark-class org.apache.spark.deploy.history.HistoryServer

然后你就会看到报错了…

代码语言:javascript
代码运行次数:0
复制
➜  spark git:(master) ✗ docker run -it spark:v3.0.0 /opt/spark/bin/spark-class org.apache.spark.deploy.history.HistoryServer
++ id -u
+ myuid=0
++ id -g
+ mygid=0
+ set +e
++ getent passwd 0
+ uidentry=root:x:0:0:root:/root:/bin/ash
+ set -e
+ '[' -z root:x:0:0:root:/root:/bin/ash ']'
+ SPARK_CLASSPATH=':/opt/spark/jars/*'
+ env
+ grep SPARK_JAVA_OPT_
+ sort -t_ -k4 -n
+ sed 's/[^=]*=\(.*\)/\1/g'
+ readarray -t SPARK_EXECUTOR_JAVA_OPTS
+ '[' -n '' ']'
+ '[' '' == 2 ']'
+ '[' '' == 3 ']'
+ '[' -z ']'
+ case "$1" in
+ echo 'Non-spark-on-k8s command provided, proceeding in pass-through mode...'
Non-spark-on-k8s command provided, proceeding in pass-through mode...
+ CMD=("$@")
+ exec /sbin/tini -s -- /opt/spark/bin/spark-class org.apache.spark.deploy.history.HistoryServer
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
19/07/09 03:59:22 INFO HistoryServer: Started daemon with process name: 14@df0f7b9fd0cf
19/07/09 03:59:22 INFO SignalUtils: Registered signal handler for TERM
19/07/09 03:59:22 INFO SignalUtils: Registered signal handler for HUP
19/07/09 03:59:22 INFO SignalUtils: Registered signal handler for INT
19/07/09 03:59:23 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
19/07/09 03:59:23 INFO SecurityManager: Changing view acls to: root
19/07/09 03:59:23 INFO SecurityManager: Changing modify acls to: root
19/07/09 03:59:23 INFO SecurityManager: Changing view acls groups to:
19/07/09 03:59:23 INFO SecurityManager: Changing modify acls groups to:
19/07/09 03:59:23 INFO SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users  with view permissions: Set(root); groups with view permissions: Set(); users  with modify permissions: Set(root); groups with modify permissions: Set()
19/07/09 03:59:23 INFO FsHistoryProvider: History server ui acls disabled; users with admin permissions: ; groups with admin permissions
Exception in thread "main" java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.apache.spark.deploy.history.HistoryServer$.main(HistoryServer.scala:278)
	at org.apache.spark.deploy.history.HistoryServer.main(HistoryServer.scala)
Caused by: java.io.FileNotFoundException: Log directory specified does not exist: file:/tmp/spark-events Did you configure the correct one through spark.history.fs.logDirectory?
	at org.apache.spark.deploy.history.FsHistoryProvider.startPolling(FsHistoryProvider.scala:259)

这个解决起来容易啊,不就是默认读取的 spark event log 文件夹不存在吗,那就创建一个好了,或者在 Spark 的配置文件里改一下默认的 Event 读取路径就好了,这里不赘述了。

3 Summary

所以说用 Docker 来跑一个 Spark History Server 并不是什么问题,而且基本可以说是开箱即用 的,重点是一些配置,和日志存放的硬盘需要和 Spark App 配合好。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
在 K8S 部署一个 Spark History Server - 篇3
因为这个系列的主要是想讲怎么在 K8S 上运行 HS,所以篇3讲述的就是这个,假设你已经有一个 K8S 集群,一个 build 好的 image,本文只是将 HS 运行在 K8S 上,关于日志和其他配置的最佳实践,本文不提供参考。
runzhliu
2020/08/06
1K0
在 K8S 部署一个 Spark History Server - 篇3
sparkWebUI-之HTTP ERROR 500
1)在 spark-env.sh 中设置 SPARK_DAEMON_MEMORY=2g 来解决该问题,此处画个图来了解一下shs:
sandyshu
2022/09/23
1.4K0
Spark的Dockerfile分析
Spark 容器化的前提是需要 Spark 的镜像文件,那么怎么 build 呢?Spark 官方是提供了 Dockerfile 的,并且也提供了脚本工具,可以自行 build 并发布到自己的 Restry 里。
runzhliu
2020/08/06
1.1K0
k8s安装spark
这段时间已经基本实现了产品应用层从原生的springboot微服务架构迁移到k8s上,过程可谓是瞎子过河一步一个坑,但是好在系统总体能跑起来了;今天研究了下产品计算层(spark集群)如何基于k8s部署操作,过程有些取巧了,但总的来说有些进展。 本次部署spark on k8s集群,基于kubeapps,简单便捷且一步到胃:
summerking
2022/10/27
1.2K0
k8s安装spark
Spark Standalone Mode 单机启动Spark -- 分布式计算系统spark学习(一)
spark是个啥? Spark是一个通用的并行计算框架,由UCBerkeley的AMP实验室开发。 Spark和Hadoop有什么不同呢? Spark是基于map reduce算法实现的分布式计算,
24-丰总
2018/06/14
9330
Spark2.x学习笔记:1、Spark2.2快速入门(本地模式)
1、Spark2.2快速入门(本地模式) 1.1 Spark本地模式 学习Spark,先易后难,先从最简单的本地模式学起。 本地模式(local),常用于本地开发测试,解压缩Spark软件包就可以用,
程裕强
2018/01/02
2.2K0
Spark2.x学习笔记:1、Spark2.2快速入门(本地模式)
Spark on Kubernetes在Mac的Demo
讲真,Spark 2.3 开始原生支持 K8S,按照Spark 2.4 官网的方法一开始真的没跑起来,K8S Dashboard 又一堆问题,可能我太菜了,头疼。
runzhliu
2020/08/06
7540
SparkML(1)环境构建
首先,我们需要Docker。毕竟我们的重点并不是在安装配置spark上面,怎么简便,怎么做是最好的啦。不过为了适用尽量多的场景,我们会配置一个单机集群,同时配置Pycharm远程调试。
干货满满张哈希
2021/04/12
6720
SparkML(1)环境构建
Spark-2
上次给大家讲了Spark local模式的启动安装和使用,现在给大家分享一下Standalone模式下的使用和安装。这个讲完以后,还有yarn和mesos下集群的安装和使用。 Spark on local Cluster伪分布式 即Spark Standalone模式。此时Spark会使用Standalone的集群管理器(Cluster Manager)启动Spark。 这种模式,也可以称为Spark的伪分布式。 Standalone集群管理器是Spark实现的资源调度框架,其主要的节点有Client节点、
企鹅号小编
2018/03/02
1.1K0
Spark-2
Kettle与Hadoop(九)提交Spark作业
实验环境: Spark History Server: 172.16.1.126
用户1148526
2020/06/11
1.6K0
Kettle与Hadoop(九)提交Spark作业
提交第一个Spark统计文件单词数程序,配合hadoop hdfs
先说明,这次我们用的还不是Spark streaming,而是从hadoop hdfs拿取文件,经过计算,再把结果放回hadoop hdfs.
算法之名
2019/08/20
7060
Spark2.x学习笔记:8、 Spark应用程打包与提交
程裕强
2018/01/02
2.6K0
Spark2.x学习笔记:8、 Spark应用程打包与提交
分享一下Spark History Server搭建以及使用s3路径的eventlog的坑
完成了spark on k8s的部署和测试,现在需要一个能够查看spark任务执行情况的ui,原先采用yarn资源管理器ui链接到spark-web-ui,由于yarn集群下的机器ip固定,可以通过配置本地代理的方式访问它,现在去掉了yarn,自己需要搭建一个能够查看所有spark任务执行情况的页面。直接使用spark-web-ui不方便管理且部署的driver机器在线上且ip不固定,无法通过配置代理和服务名方式打通。
框框不是欢欢
2022/06/07
1.5K0
执行Spark运行在yarn上的命令报错 spark-shell --master yarn-client
1、执行Spark运行在yarn上的命令报错 spark-shell --master yarn-client,错误如下所示: 18/04/22 09:28:22 ERROR SparkContext: Error initializing SparkContext. org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch applic
别先生
2018/05/16
1.8K0
Caused by: java.net.ConnectException: Connection refused: master/192.168.3.129:7077
1:启动Spark Shell,spark-shell是Spark自带的交互式Shell程序,方便用户进行交互式编程,用户可以在该命令行下用scala编写spark程序。 启动Spark Shell,出现的错误如下所示: 1 [root@master spark-1.6.1-bin-hadoop2.6]# bin/spark-shell --master spark://master:7077 --executor-memory 512M --total-executor-cores 2 2 18/
别先生
2018/04/02
2.9K0
在 K8S 部署一个 Spark History Server - 篇1
要在 K8S 集群中部署一套 Spark History Server,首先要了解,怎么部署一个本地版本。然后就是了解一些基本的 K8S 相关的知识点。最后就是两部分知识结合起来,看看业界流行的方案是如何实现的。
runzhliu
2020/08/06
7060
在 K8S 部署一个 Spark History Server - 篇1
Spark 系列教程(2)运行模式介绍
Apache Spark 是用于大规模数据处理的统一分析引擎,它提供了 Java、Scala、Python 和 R 语言的高级 API,以及一个支持通用的执行图计算的优化引擎。
Se7en258
2021/10/09
1.6K0
Spark 系列教程(2)运行模式介绍
Spark内核详解 (4) | Spark 部署模式
实际上,除了上述这些通用的集群管理器外,Spark 内部也提供了方便用户测试和学习的简单集群部署模式。由于在实际生产环境下使用的绝大多数的集群管理器是 Hadoop YARN,因此我们关注的重点是 Hadoop YARN 模式下的 Spark 集群部署。
不温卜火
2020/10/28
1.7K0
Spark内核详解 (4) | Spark 部署模式
第一天:spark基础
Hadoop 的概念可追溯到 2003,2004 Google2篇论文(老版三辆马车),2011年发布1.0版本,2012年发布稳定版。Hadoop 在2.0版本之前组件主要是 HDFS跟MapReduce。
sowhat1412
2020/11/05
6950
第一天:spark基础
docker下的spark集群,调整参数榨干硬件
本文是《docker下,极速搭建spark集群(含hdfs集群)》的续篇,前文将spark集群搭建成功并进行了简单的验证,但是存在以下几个小问题:
程序员欣宸
2019/05/29
1.5K0
docker下的spark集群,调整参数榨干硬件
相关推荐
在 K8S 部署一个 Spark History Server - 篇3
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验