Kubernetes助力Spark大数据分析

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: Kubernetes 作为一个广受欢迎的开源容器协调系统,是Google于2014年酝酿的项目。从Google趋势上看到,Kubernetes自2014年以来热度一路飙升,短短几年时间就已超越了大数据分析领域的长老Hadoop。

Kubernetes 作为一个广受欢迎的开源容器协调系统, 是Google于2014年酝酿的项目。从Google趋势上看到,Kubernetes自2014年以来热度一路飙升,短短几年时间就已超越了大数据分析领域的长老Hadoop。本公众号之前的文章(Kubernetes核心组件解析也对Kubernetes的几个组件做了一些详细的剖析,本文就带领大家一起看看Kubernetes和Spark碰到一起会擦出什么样的火花。

Spark2.3.0之前的版本只原生支持Standalone、YARN和Mesos三种部署模式,也就是说要迁移Spark2.3.0之前的Spark到Kuberbetes上,还得准备一层Standalone、YARN或者Mesos环境,不过Spark2.3.0已经引入了对Kubernetes的原生支持。

Spark2.3.0可以将编写好的数据处理程序直接通过spark-submit提交到Kubernetes集群,通过创建一个Drive Pod和一系列Executor Pods,然后共同协调完成计算任务,整体过程的官方示意图如下。

当我们通过spark-submit将Spark作业提交到Kubernetes集群时,会执行以下流程:

1. Spark在Kubernetes Pod中创建Spark Driver

2. Driver调用Kubernetes API创建ExecutorPods,Executor Pods执行作业代码

3. 计算作业结束,Executor Pods回收并清理

4. Driver Pod处于completed状态,保留日志,直到Kubernetes GC或者手动清理

Spark原生支持Kubernetes最大的好处是,不用在Kubernetes集群上再建立一层资源调度系统,只要建立一个新Spark容器镜像,并指派合适的RBAC权限角色,给所要执行的Spark应用程序,就可以在Kubernetes集群上运行Spark程序了。

接下来就介绍如何在一个Kubernetes上运行Spark程序。

1前提条件

(1) 我们测试的是Spark 2.3.0,由于Spark on Kubernetes任务提交后,实际上在集群中是以custom resources和custom controller的形式运行,所以我们需要一个1.7+版本的k8s集群,同时需要启动Kubernetes DNS和RBAC。

(2) Spark2.3.0版本的二进制包,下载链接https://archive.apache.org/dist/spark/spark-2.3.0/spark-2.3.0-bin-hadoop2.6.tgz

2 打包制作Spark镜像

(1) 解压并进入到解压后的Spark安装文件路径

$ tar -zxvf spark-2.3.0-bin-hadoop2.6

$ cd spark-2.3.0-bin-hadoop2.6

(2) 制作Spark基础镜像

  • 使用Spark提供的docker-image-tool.sh脚本制作

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

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

  • 使用docker build命令制作

$ docker build -t registry/spark:2.3.0 -f kubernetes/dockerfiles/spark/Dockerfile .

(3) 查看镜像

$ docker images | grep registry/spark

3 运行Spark官方例子

(1) 获取集群信息,确认Kubernetes master地址

$ kubectl cluster-info

(2) 为Spark创建一个RBAC的role

$ kubectl create serviceaccount spark

$ kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=default:spark --namespace=default

(3) 运行如下命令,向Kubernetes集群提交计算π值的例子

$/spark-2.3.0-bin-hadoop2.6/bin/spark-submit \

--master k8s://k8s-master\

--deploy-mode cluster \

--name spark-pi \

--class org.apache.spark.examples.SparkPi \

--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \

--conf spark.executor.instances=2 \

--conf spark.kubernetes.container.image=registry/spark:2.3.0 \

local:///opt/spark/examples/jars/spark-examples_2.11-2.3.0.jar

(4) 查看运行状态,计算π值的例子运行很快,可以看到它已经运行结束了

$ kubectl get po

(5) 查看运行日志,可以看到π值已经计算出来了

$ kubectl logs -f spark-pi-63abb54cf382394d95413f43744c65ed-Drive

至此,使用官方的例子体验Spark on Kubernetes就完成了。那么,如何提交自己编写的Spark程序到Kubernetes集群呢?

其实只需把自己写好的Spark程序编译成jar文件,然后打包到Spark基础镜像中,就可以提交到Kubernetes集群中运行了。

4 运行自己编写的Spark程序

(1)准备源代码。以一个wordcount程序为例。程序会从一个小说网站下载《了不起的盖茨比》的英文版小说,然后对其做词频统计,源代码如下:

import org.apache.commons.io.IOUtilsimport org.apache.spark.sql.functions._import java.net.URLimport org.apache.spark.sql.SparkSessionclass WordCount { def main(args: Array[ String]) { val spark = SparkSession .builder .appName("CopyData") .getOrCreate() import spark.implicits._ valbankText = spark.sparkContext.parallelize( IOUtils.toString ( newURL("http://novel.tingroom.com/novel_down.php?aid=319&dopost=txt") ).split("\n" )) bankText.flatMap(p=>{ val pattern = "[^a-zA-Z0-9-']".r val line = pattern.replaceAllIn(p," " ) line.split(" ") }).map((_,1 )).reduceByKey(_+_).sortBy(p=>p._2,false ).toDF("word","count"). where(length ('word)> 4).show }}

(2) 源代码编译为wordcount.jar文件,并编写Dockerfile文件,内容如下:

FROM registry/spark:2.3.0

RUN mkdir -p /opt/spark/jars

COPY wordcount.jar /opt/spark/jars

(3)wordcount.jar和DockerFlie文件放在同一路径下,并在该路径下运行docker bulid命令打包镜像:

$docker build -t registry/spark_wordcount:latest -f Dockerfile .

(4)使用如下命令将wordcount程序提交到Kubernetes集群:

/home/nsfocus/dengxincheng/spark-2.3.1-bin-hadoop2.6/bin/spark-submit \

--master k8s://192.168.19.13:6443\

--deploy-mode cluster \

--name wordcount \

--class example.wordcount.WordCount \

--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \

--conf spark.executor.instances=2 \

--conf spark.kubernetes.container.image=registry/spark_wordcount:latest \

local:///opt/spark/jars/wordcount.jar

(5)当任务运行完了之后,使用kubectl logs查看wordcount程序运行所对应drive pod内的日志,可以得词频最高的前20个词,如下图。

5总结

新版的Spark加入对Kubernetes的原生支持,统一了Spark程序在Kubernetes上所有工作负载的控制层,这样可以简化群集管理并提高资源利用率。总的来说,使用Kubernetes原生调度的Spark主要有以下优点:

原生资源调度:不再需要二级调度,直接使用Kubernetes原生的调度模块,实现与其他应用的混布;

资源隔离:任务可以提交到指定的namespace,这样可以复用Kubernetes原生的qouta限制,实现任务资源的限制;

用户自定义:用户可以在Spark基础镜像中打上自己的Application, 更加灵活和方便;

内容编辑:安全大数据分析实验室 邓新程 责任编辑:肖晴

期回顾

本公众号原创文章仅代表作者观点,不代表绿盟科技立场。所有原创内容版权均属绿盟科技研究通讯。未经授权,严禁任何媒体以及微信公众号复制、转载、摘编或以其他方式使用,转载须注明来自绿盟科技研究通讯并附上本文链接。

关于我们

绿盟科技研究通讯由绿盟科技创新中心负责运营,绿盟科技创新中心是绿盟科技的前沿技术研究部门。包括云安全实验室、安全大数据分析实验室和物联网安全实验室。团队成员由来自清华、北大、哈工大、中科院、北邮等多所重点院校的博士和硕士组成。

绿盟科技创新中心作为“中关村科技园区海淀园博士后工作站分站”的重要培养单位之一,与清华大学进行博士后联合培养,科研成果已涵盖各类国家课题项目、国家专利、国家标准、高水平学术论文、出版专业书籍等。

我们持续探索信息安全领域的前沿学术方向,从实践出发,结合公司资源和先进技术,实现概念级的原型系统,进而交付产品线孵化产品并创造巨大的经济价值。

本文转自掘金-Kubernetes助力Spark大数据分析

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
21天前
|
SQL 消息中间件 分布式计算
大数据-124 - Flink State 01篇 状态原理和原理剖析:状态类型 执行分析
大数据-124 - Flink State 01篇 状态原理和原理剖析:状态类型 执行分析
57 5
|
1天前
|
SQL 机器学习/深度学习 分布式计算
Spark快速上手:揭秘大数据处理的高效秘密,让你轻松应对海量数据
【10月更文挑战第25天】本文全面介绍了大数据处理框架 Spark,涵盖其基本概念、安装配置、编程模型及实际应用。Spark 是一个高效的分布式计算平台,支持批处理、实时流处理、SQL 查询和机器学习等任务。通过详细的技术综述和示例代码,帮助读者快速掌握 Spark 的核心技能。
13 6
|
1天前
|
分布式计算 大数据 OLAP
AnalyticDB与大数据生态集成:Spark & Flink
【10月更文挑战第25天】在大数据时代,实时数据处理和分析变得越来越重要。AnalyticDB(ADB)是阿里云推出的一款完全托管的实时数据仓库服务,支持PB级数据的实时分析。为了充分发挥AnalyticDB的潜力,将其与大数据处理工具如Apache Spark和Apache Flink集成是非常必要的。本文将从我个人的角度出发,分享如何将AnalyticDB与Spark和Flink集成,构建端到端的大数据处理流水线,实现数据的实时分析和处理。
11 1
|
1天前
|
人工智能 供应链 搜索推荐
大数据分析:解锁商业智能的秘密武器
【10月更文挑战第31天】在信息爆炸时代,大数据分析成为企业解锁商业智能的关键工具。本文探讨了大数据分析在客户洞察、风险管理、供应链优化、产品开发和决策支持等方面的应用,强调了明确分析目标、选择合适工具、培养专业人才和持续优化的重要性,并展望了未来的发展趋势。
|
5天前
|
SQL 分布式计算 Serverless
EMR Serverless Spark:一站式全托管湖仓分析利器
本文根据2024云栖大会阿里云 EMR 团队负责人李钰(绝顶) 演讲实录整理而成
38 2
|
11天前
|
分布式计算 大数据 Apache
利用.NET进行大数据处理:Apache Spark与.NET for Apache Spark
【10月更文挑战第15天】随着大数据成为企业决策和技术创新的关键驱动力,Apache Spark作为高效的大数据处理引擎,广受青睐。然而,.NET开发者面临使用Spark的门槛。本文介绍.NET for Apache Spark,展示如何通过C#和F#等.NET语言,结合Spark的强大功能进行大数据处理,简化开发流程并提升效率。示例代码演示了读取CSV文件及统计分析的基本操作,突显了.NET for Apache Spark的易用性和强大功能。
25 1
|
17天前
|
存储 SQL 分布式计算
湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
【10月更文挑战第7天】湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
22 1
|
21天前
|
消息中间件 druid 大数据
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(二)
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(二)
26 2
|
21天前
|
消息中间件 分布式计算 druid
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(一)
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(一)
45 1
|
4天前
|
数据采集 分布式计算 OLAP
最佳实践:AnalyticDB在企业级大数据分析中的应用案例
【10月更文挑战第22天】在数字化转型的大潮中,企业对数据的依赖程度越来越高。如何高效地处理和分析海量数据,从中提取有价值的洞察,成为企业竞争力的关键。作为阿里云推出的一款实时OLAP数据库服务,AnalyticDB(ADB)凭借其强大的数据处理能力和亚秒级的查询响应时间,已经在多个行业和业务场景中得到了广泛应用。本文将从个人的角度出发,分享多个成功案例,展示AnalyticDB如何助力企业在广告投放效果分析、用户行为追踪、财务报表生成等领域实现高效的数据处理与洞察发现。
18 0

推荐镜像

更多