专栏首页绿盟科技研究通讯Kubernetes助力Spark大数据分析

Kubernetes助力Spark大数据分析

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.IOUtils import org.apache.spark.sql.functions._ import java.net.URL import org.apache.spark.sql.SparkSession class WordCount { def main(args: Array[String]) { val spark = SparkSession .builder .appName("CopyData") .getOrCreate() import spark.implicits._ val bankText = spark.sparkContext.parallelize( IOUtils.toString( new URL("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, 更加灵活和方便;

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

本文分享自微信公众号 - 绿盟科技研究通讯(nsfocus_research),作者:安全大数据分析

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-17

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 好书推荐 — Kubernetes安全分析

    笔者最近在研究容器安全时读到一本关于讲述Kubernetes安全的书籍,作者为LizRice和Michael Hausenbla,两位分别来自美国容器安全厂商A...

    绿盟科技研究通讯
  • NuggetPhantom分析报告

    近期,绿盟威胁情报中心(NTI)在一次应急响应中,发现一起使用模块化恶意工具集“NuggetPhantom(掘金幽灵)”的安全事件。据我们观测,本次安全事件背后...

    绿盟科技研究通讯
  • 主流云原生微服务API网关成熟度与安全功能对比分析

    在整个微服务架构中,API网关充当着非常重要的一环,它不仅要负责外部所有的流量接入,同时还要在网关入口处根据不同类型请求提供流量控制、日志收集、性能分析、速率限...

    绿盟科技研究通讯
  • Apache Spark 2.3 加入支持Native Kubernetes及新特性文档下载

    问题导读 1.什么是Kubernetes? 2.在Kubernetes集群尝试新功能,该如何实现? 3.观看群集上创建的Spark资源,该如何操作? 在开始...

    用户1410343
  • 王联辉:Spark在腾讯应用及对企业spark使用指导

    问题导读 1.腾讯如何使用Spark 技术的?带来了哪些好处? 2.Spark 技术最适用于哪些应用场景? 3.企业在应用Spark 技术时,需要做哪些改变吗...

    用户1410343
  • Spark官方文档翻译(一)~Overview

    http://spark.apache.org/docs/latest/index.html

    实时计算
  • 30分钟--Spark快速入门指南

    Spark快速入门指南 – Spark安装与基础使用  2016-01-15 (updated: 2016-03-07) 6309 29 Apache Spa...

    汤高
  • Apache Spark常见的三大误解

    最近几年关于Apache Spark框架的声音是越来越多,而且慢慢地成为大数据领域的主流系统。最近几年Apache Spark和Apache Hadoop的Go...

    Albert陈凯
  • Hadoop/Spark生态圈里的新气象

    我是攻城师
  • Spark Streaming 的玫瑰与刺

    说人话:其实就是讲Spark Streaming 的好处与坑。好处主要从一些大的方面讲,坑则是从实际场景中遇到的一些小细节描述。

    用户2936994

扫码关注云+社区

领取腾讯云代金券