Spark on Kubernetes与阿里云的深度整合

最近,笔者尝试将Spark on Kubernetes与阿里云深度整合,设计一个开箱即用的Spark on Kubernetes镜像。

首先通过Terraform在阿里云上一键创建和销毁Kubernetes集群。然后写了一个脚本生成Spark镜像,使其在Kubernetes上运行时可以直接读写阿里云OSS上的数据。最后还写了一个spark-submit脚本,可以让镜像动态地从阿里云OSS上下载需要运行的主程序包(jar)。

功能: 
?一次编译,多次运行,同时支持共有云、私有云、以及混合云。用户只需专注于Spark job本身,无需担心运维。解耦计算与存储,不再需要HDFS集群,更加节省费用。避免了常规做法中的二次资源调度,进一步提升资源管理效率。每一个job都可以指定资源,实现更好的资源隔离。自带弹性伸缩属性,无需被集群太小所困扰。

优势:
?镜像可以部署到共有云、私有云、或混合云上的任意一个Kubernetes集群
?镜像可以直接读写阿里云的对象存储服务(OSS),节省了HDFS的费用
?可以从阿里云的OSS上自动下载包含Spark job的工作包(jar),不再用为每个工作包制作新的镜像可以从阿里云的OSS上自动下载包含Spark job的工作包(jar),不再用为每个工作包制作新的镜像

特点:
使用Kubernetes原生调度的Spark on Kubernetes是对现有的Spark on Yarn/Mesos的资源使用方式的革命性的改进,主要表现在以下几点:
?1、Kubernetes原生调度:不再需要二层调度,直接使用Kubernetes的资源调度功能,跟其他应用共用整个kubernetes管理的资源池;
?2、资源隔离,粒度更细:原先yarn中的queue在Spark on Kubernetes中已不存在,取而代之的是Kubernetes中原生的namespace,可以为每个用户分别指定一个namespace,限制用户的资源quota;
?3、细粒度的资源分配:可以给每个spark任务指定资源限制,实际指定多少资源就使用多少资源,因为没有了像yarn那样的二层调度(圈地式的),所以可以更高效和细粒度的使用资源;
?4、监控的变革:因为做到了细粒度的资源分配,所以可以对用户提交的每一个任务做到资源使用的监控,从而判断用户的资源使用情况,所有的metric都记录在数据库中,甚至可以为每个用户的每次任务提交计量;
?5、日志的变革:用户不再通过yarn的web页面来查看任务状态,而是通过pod的log来查看,可将所有的Kubernetes中的应用的日志等同看待收集起来,然后可以根据标签查看对应应用的日志;

所有这些变革都可以让我们更高效的获取资源、更有效率的获取资源!

笔者设计的Spark on Kubernetes在普通版本的基础上,与阿里云深度整合,添加了一些比较实用的特性:
?可以通过Terraform配置阿里云ACK Kubernetes集群,一键创建和销毁集群,避免重复劳动以及不必要的集群消耗
?可以直接从阿里云OSS上获取Spark所需jar包,避免重复打包镜像
?可以直接通过阿里云OSS读写数据,避免不必要的HDFS费用

目前正在免费Alpha测试中,具体操作步骤记录在了这篇博客里。欢迎感兴趣的同学一起讨论。也可通过邮箱与笔者联系沟通。

相关推荐