千家信息网

如何分析基于Kubernetes的Spark部署

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章将为大家详细讲解有关如何分析基于Kubernetes的Spark部署,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Yarn曾经是Hadoop默
千家信息网最后更新 2026年11月03日如何分析基于Kubernetes的Spark部署

这篇文章将为大家详细讲解有关如何分析基于Kubernetes的Spark部署,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Yarn曾经是Hadoop默认的资源编排管理平台。但最近情况有所变化,特别是对于Hadoop中的Spark,由于其与S3等其他存储平台集成得很好,而与Hadoop生态中其他组件反而没有太紧密的关联,因此Kubernetes正迅速替代Yarn,成为基于对象存储的Spark系统的默认编排管理平台。在这篇文章中,我们将深入研究如何在Kubernetes集群上构建和部署Spark容器。由于Spark的运行依赖于数据,我们将配置Spark集群通过S3 API进行存储操作。

在Kubernetes上部署应用的第一步,是创建容器。虽然有些项目会提供官方的容器镜像,但截止到写此文时,Apache Spark并没有提供官方镜像。因此我们将自己创建Spark容器,让我们从Dockerfile开始。

FROM java:openjdk-8-jdk  ENV hadoop_ver 2.8.2 ENV spark_ver 2.4.4  RUN mkdir -p /opt && \ cd /opt && \ curl http://archive.apache.org/dist/hadoop/common/hadoop-${hadoop_ver}/hadoop-${hadoop_ver}.tar.gz | \     tar -zx && \ ln -s hadoop-${hadoop_ver} hadoop && \ echo Hadoop ${hadoop_ver} installed in /opt  RUN mkdir -p /opt && \ cd /opt && \ curl http://archive.apache.org/dist/spark/spark-${spark_ver}/spark-${spark_ver}-bin-without-hadoop.tgz | \     tar -zx && \ ln -s spark-${spark_ver}-bin-without-hadoop spark && \ echo Spark ${spark_ver} installed in /opt  ENV SPARK_HOME=/opt/spark ENV PATH=$PATH:$SPARK_HOME/bin ENV HADOOP_HOME=/opt/hadoop ENV PATH=$PATH:$HADOOP_HOME/bin ENV LD_LIBRARY_PATH=$HADOOP_HOME/lib/native  RUN curl http://central.maven.org/maven2/org/apache/hadoop/hadoop-aws/2.8.2/hadoop-aws-2.8.2.jar -o /opt/spark/jars/hadoop-aws-2.8.2.jar RUN curl http://central.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.3/httpclient-4.5.3.jar -o /opt/spark/jars/httpclient-4.5.3.jar RUN curl http://central.maven.org/maven2/joda-time/joda-time/2.9.9/joda-time-2.9.9.jar -o /opt/spark/jars/joda-time-2.9.9.jar RUN curl http://central.maven.org/maven2/com/amazonaws/aws-java-sdk-core/1.11.712/aws-java-sdk-core-1.11.712.jar -o /opt/spark/jars/aws-java-sdk-core-1.11.712.jar RUN curl http://central.maven.org/maven2/com/amazonaws/aws-java-sdk/1.11.712/aws-java-sdk-1.11.712.jar -o /opt/spark/jars/aws-java-sdk-1.11.712.jar RUN curl http://central.maven.org/maven2/com/amazonaws/aws-java-sdk-kms/1.11.712/aws-java-sdk-kms-1.11.712.jar -o /opt/spark/jars/aws-java-sdk-kms-1.11.712.jar RUN curl http://central.maven.org/maven2/com/amazonaws/aws-java-sdk-s3/1.11.712/aws-java-sdk-s3-1.11.712.jar -o /opt/spark/jars/aws-java-sdk-s3-1.11.712.jar  ADD start-common.sh start-worker start-master / ADD core-site.xml /opt/spark/conf/core-site.xml ADD spark-defaults.conf /opt/spark/conf/spark-defaults.conf ENV PATH $PATH:/opt/spark/bin

在这个Dockerfile中,我们首先从官方地址下载Apache Spark和Hadoop,然后从Maven获取关联的jar包。当所有关联的文件都已经下载并解压到一个特定的目录后,我们将这些重要的配置文件添加到镜像中。

在这个过程中,你可以很方便的添加自己环境特有的配置。

原本我们可以跳过以上步骤,直接使用一个预先构建好的镜像,但是通过解读这些步骤可以让我们的读者看到Spark容器内部的内容,高级用户可以据此修改来满足他们特殊的需求。

以上示例中使用到的Dockerfile和其他关联的配置文件,可以从这个GitHub仓库中获取。如果要使用这个仓库中的内容,请先使用以下命令将其克隆到本地:

git clone git@github.com:devshlabs/spark-kubernetes.git

现在,你可以根据需要在你的环境中进行任何更改,然后构建镜像,并上传到你使用的容器注册表中。在本文的示例中,我使用Dockerhub作为容器注册表,命令如下:

cd spark-kubernetes/spark-container docker build . -t mydockerrepo/spark:2.4.4 docker push mydockerrepo/spark:2.4.4

记得将其中的mydockerrepo替换为你实际的注册表名字。

在Kubernetes上部署Spark

至此,Spark容器镜像已经构建好,并可以拉取使用了。让我们使用此镜像来部署Spark Master和Worker。第一步是创建Spark Master。我们将使用Kubernetes ReplicationController创建Spark Master。在本文的示例中,我仅用单实例创建Spark Master。而在有HA需求的生产环境中,你可能需要将副本数设置为3或者以上。

kind: ReplicationController apiVersion: v1 metadata: name: spark-master-controller spec: replicas: 1 selector: component: spark-master template: metadata:   labels:     component: spark-master spec:   hostname: spark-master-hostname   subdomain: spark-master-headless   containers:     - name: spark-master       image: mydockerrepo/spark:2.4.4       imagePullPolicy: Always       command: ["/start-master"]       ports:         - containerPort: 7077         - containerPort: 8080       resources:         requests:           cpu: 100m

为了使Spark Worker节点可以发现Spark Master节点,我们还需要创建headless服务。
当你从GitHub仓库完成克隆,并进入spark-kubernetes目录后,就可以启动Spark Master服务了,命令如下:

kubectl create -f spark-master-controller.yaml kubectl create -f spark-master-service.yaml

现在,确保Master节点和所有的服务都正常运行,然后就可以开始部署Worker节点了。Spark Worker的副本数设置为2,你可以根据需要修改。Worker启动命令如下:
kubectl create -f spark-worker-controller.yaml
最后,通过以下命令确认是否所有服务都正常运行:
kubectl get all
执行以上命令,你应该可以看到类似下面的内容:

NAME                               READY     STATUS    RESTARTS   AGE po/spark-master-controller-5rgz2   1/1       Running   0          9m po/spark-worker-controller-0pts6   1/1       Running   0          9m po/spark-worker-controller-cq6ng   1/1       Running   0          9m  NAME                         DESIRED   CURRENT   READY     AGE rc/spark-master-controller   1         1         1         9m rc/spark-worker-controller   2         2         2         9m  NAME               CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE svc/spark-master   10.108.94.160           7077/TCP,8080/TCP   9m

向Spark集群提交Job

现在让我们提交一个Job,看看是否执行正常。不过在此之前,你需要一个有效的AWS S3账户,以及存有样本数据的桶存在。我使用了Kaggle下载样本数据,样本数据可以从https://www.kaggle.com/datasna ... s.csv获取,获取以后需要上传到S3的桶里。假定桶名是s3-data-bucket,那么样本数据文件则位于s3-data-bucket/data.csv。
数据准备好以后,将其加载到一个Spark master pod中执行。以Pod名为spark-master-controller-5rgz2为例,命令如下:
kubectl exec -it spark-master-controller-v2hjb /bin/bash
如果你登录进入了Spark系统,可以运行Spark Shell:

export SPARK_DIST_CLASSPATH=$(hadoop classpath) spark-shell Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). Spark context Web UI available at http://192.168.132.147:4040 Spark context available as 'sc' (master = spark://spark-master:7077, app id = app-20170405152342-0000). Spark session available as 'spark'. Welcome to   ____              __  / __/__  ___ _____/ /__ _\ \/ _ \/ _ `/ __/  '_/ /___/ .__/\_,_/_/ /_/\_\   version 2.4.4   /_/  Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_221) Type in expressions to have them evaluated. Type :help for more information.  scala>

现在让我们告诉Spark Master,S3存储的详细信息,在上文所示的Scale提示符中输入以下配置:

sc.hadoopConfiguration.set("fs.s3a.endpoint", "https://s3.amazonaws.com") sc.hadoopConfiguration.set("fs.s3a.access.key", "s3-access-key") sc.hadoopConfiguration.set("fs.s3a.secret.key", "s3-secret-key")

现在,只需将以下内容粘贴到Scala提示符中,以提交Spark Job(请记得修改S3相关字段):

import org.apache.spark._ import org.apache.spark.rdd.RDD import org.apache.spark.util.IntParam import org.apache.spark.sql.SQLContext import org.apache.spark.graphx._ import org.apache.spark.graphx.util.GraphGenerators import org.apache.spark.mllib.regression.LabeledPoint import org.apache.spark.mllib.linalg.Vectors import org.apache.spark.mllib.tree.DecisionTree import org.apache.spark.mllib.tree.model.DecisionTreeModel import org.apache.spark.mllib.util.MLUtils  val conf = new SparkConf().setAppName("YouTube") val sqlContext = new SQLContext(sc)  import sqlContext.implicits._ import sqlContext._  val youtubeDF = spark.read.format("csv").option("sep", ",").option("inferSchema", "true").option("header", "true").load("s3a://s3-data-bucket/data.csv")  youtubeDF.registerTempTable("popular")  val fltCountsql = sqlContext.sql("select s.title,s.views from popular s") fltCountsql.show()

最后,你可以使用kubectl patch command命令更新Spark部署。比如,你可以在负载较高时添加更多工作节点,然后在负载下降后删除这些工作节点。

关于如何分析基于Kubernetes的Spark部署就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

命令 容器 镜像 内容 数据 节点 配置 文件 关联 存储 服务 运行 仓库 官方 平台 更多 样本 注册表 环境 示例 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 蓝思科技飞鸽互联网 科技制造互联网公司 互联网科技公司发展 智网互联网科技 互联网科技公司怎么样 碳银互联网科技有限公司 深圳艾佳互联网科技 滨湖区互联网智能科技产品供应 海南购全球互联网科技 太原新华互联网科技学校怎么样 须眉科技是互联网公司吗 承德科技产业互联网发展 重庆互联网医院沙龙医盟信息科技 宝灵互联网科技有限公司 保险科技服务互联网营销体系 华中科技大学互联网的牛人 互联网科技圈年度人物 卡尔迅互联网科技有限公司 河南商务圈互联网科技有限公司 株洲百竞科技的互联网营销顾问 互联网科技工作委员会主任 互联网科技ppt模板 互联网科技公司做什么 美国互联网前沿科技 滨湖区互联网智能科技产品供应 湖南一路畅行互联网科技 移动互联网年度科技创新 华中科技大学互联网的牛人 中国互联网有什么科技 互联网科技自媒体灵感
0