EMR Spark on ACK

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 本文介绍在ACK上运行EMR Spark工作负载,并通过Remote Shuffle Service和JindoFS提升性能。

001.jpeg

如上文Apache Spark on ACK介绍,Spark on Kubernetes能给我们带来诸多优点,但社区版的解决方案还不是那么完善,存在以下几个关键问题:

  • Shuffle流程,按照目前的Shuffle方式,我们是没办法打开动态资源特性的。而且还需要挂载云盘,云盘面临着Shuffle数据量的问题,挂的比较大会很浪费,挂的比较小又支持不了Shuffle Heavy的任务。
  • 调度和队列管理问题,调度性能的衡量指标是,要确保当大量作业同时启动时,不应该有性能瓶颈。作业队列这一概念对于大数据领域的同学来说应该非常熟悉,他提供了一种管理资源的视图,有助于我们在队列之间控制资源和共享资源。
  • 读写数据湖相比较HDFS,在大量的rename,list等场景下性能会有所下降,同时OSS带宽也是一个不可避免的问题。

为了让在ACK上更好的运行Spark工作负载,阿里云EMR和ACK团队做了大量优化工作,在架构、性能、稳定性、易用性方面都有着很大的提升。

EMR Spark on ACK解决方案

002.png

EMR Spark

EMR Spark是运行在阿里云平台上的大数据处理解决方案,在开源版Apache Spark的基础上做了大量性能、功能以及稳定性方面的改造,并且在和阿里云基础服务的适配上做了非常多的工作。主要有以下核心技术:

  • 实现SparkSQL事务功能,支持update、delete语句。
  • 实现PK、FK、NOT NULL等SQL Constraint,并应用在SQL优化中。
  • 实现Relational Cache:SparkSQL的物化视图。
  • 实现多租户高可用的SparkSQL JDBC Server。
  • SparkSQL部分性能优化列表:
    • 支持Runtime Filter。
    • 使用Adaptive Execution,可在运行时调整作业行为。
    • CBO Join Reorder进一步优化,支持遗传算法。
    • Shuffle流程优化,构建异步非阻塞的Shuffle IO。

Remote Shuffle Service

Spark on kubernetes时会面临shuffle的问题,按照目前的shuffle方式,是没办法打开动态资源特性的。而且还需要挂载云盘,面临着shuffle数据量的问题,挂的大会很浪费,挂的小又支持不了shuffle heavy的任务。针对这个问题,我们设计了shuffle读写分离的架构,称为Remote Shuffle Service,对现有的shuffle机制做了比较大的优化,解决了计算存储分离和混合架构下的shuffle稳定性和性能问题。可以总结为以下3点:

  • Shuffle数据通过网络写出,中间数据计算与存储分离架构。
  • DFS 2副本,消除fetch failed引起的重算,shuffle heavy作业更加稳定。
  • Reduce阶段顺序读磁盘,避免现有版本的随机IO,大幅提升性能。

003.png

JindoFS

计算存储分离已经成为云计算的一种发展趋势。在计算存储分离之前,普遍采用的是传统的计算存储相互融合的架构,但是这种架构存在一定的问题,比如在集群扩容的时候会面临计算能力和存储能力相互不匹配的问题。用户在某些情况下只需要扩容计算能力或者存储能力,而传统的融合架构不能满足用户的这种需求,进行单独的扩充计算或者存储能力;其次在缩容的时候可能会遇到人工干预,人工干预完后需要保证数据在多个节点中同步,而当有多个副本需要同步时候,可能会造成的数据丢失。计算存储分离架构则可以很好的解决这些问题,使得用户只需要关心整个集群的计算能力,但同时也会引入读写数据网络延迟的问题。

004.jpeg

JindoFS是一种云原生的文件系统,结合OSS和本地存储,成为EMR产品的新一代存储系统,为上层计算提供了高效可靠的存储。JindoFS 提供了块存储模式(Block)和缓存模式(Cache)的存储模式, 采用了本地存储和OSS的异构多备份机制,Storage Service提供了数据存储能力,首先使用OSS作为存储后端,保证数据的高可靠性,同时利用本地存储实现冗余备份,利用本地的备份,可以加速数据读取,解决了网络延迟的问题;另外,JindoFS的元数据通过本地服务Namespace Service管理,从而保证了元数据操作的性能(和HDFS元数据操作性能相似)。

005.png

性能评测

为了验证EMR Spark在ACK上的性能,我们通过TPC-DS进行对比评测。TPC-DS测试基准是TPC组织推出的一个决策支持系统测试基准,TPC-DS采用星型、雪花型等多维数据模式。它包含7张事实表,17张纬度表平均每张表含有18列。其工作负载包含99个SQL查询,覆盖SQL99和2003的核心部分以及OLAP。这个测试集包含对大数据集的统计、报表生成、联机查询、数据挖掘等复杂应用,测试用的数据和值是有倾斜的,与真实数据一致。可以说TPC-DS是与真实场景非常接近的一个测试集,也是难度较大的一个测试集。

测试环境

首先准备测试环境,在ACK上新建一个标准版集群或标准专有集群,安装依赖的组件。

集群配置

ACK集群说明

集群配置 参数
集群类型 ACK标准集群
集群版本 1.16.9-aliyun.1
ECS实例 ECS规格:ecs.d1ne.6xlarge操作系统:CentOS 7.7 64位CPU: 24核内存:96G数据盘:5500GB HDD x 12
Worker Node个数 20

ecs.d1ne.6xlarge 大数据机型,默认带了12块5500GB的HDD数据盘,需要mount一下才能使用。

组件配置

ack-spark-operator

在ACK应用目录中安装,用来提交SparkApplicaiton作业。

ack-spark-history-server (非必要)

在ACK应用目录中安装,记录Spark执行任务过程中的event-log,并提供UI界面,方便排查问题。

JindoFS

在ACK应用目录中安装,用来实现数据的分布式缓存加速。

EMR Spark

在社区版Apache Spark深度优化的版本。

Remote Shuffle Service

Shuflle读写分离架构。

注意:EMR Spark 和 Remote Shuffle Service 可通过文章结尾处的钉钉群联系我们获取安装方式。

测试数据

基于TPC-DS生成的1TB和10TB测试数据,生成数据的情况可参考TPC-DS生成数据

测试结果

1. EMR Spark vs Apache Spark

测试数据:10TB

纵轴单位:秒

006.jpeg

007.jpeg

在10TB数据上测试,EMR Spark相比社区版本Spark约有57%的性能提升,详细测试过程参考使用EMR Spark运行Spark工作负载

2. EMR Spark vs EMR Spark + EMR Shuffle Service

测试数据:10TB

纵轴单位:秒
008.jpeg

009.jpeg

在10TB数据上,增加Remote Shuffle Service后,相比直接使用EMR Spark,约有16%的性能提升。详细测试过程请参考使用EMR Spark + Remote Shuffle Service运行Spark工作负载

3. EMR Spark vs EMR Spark + JindoFS

测试数据:1TB

纵轴单位:秒

010.jpeg

011.jpeg

在1TB数据上,使用JindoFS做数据分布式缓存后,相比直接使用EMR Spark,得到约15%性能提升。详细测试过程请参考使用EMR Spark + JindoFS运行Spark工作负载

测试总结

通过上面几组对比可以看到,EMR Spark相比社区版Spark有大幅度的性能提升,而通过Remote Shuffle Service和JindoFS也分别解决了存储计算分离架构带来的Shuffle和数据本地化问题。另外,需要说明的是Remote Shuffle Service和JindoFS在比较适用于数据量大的场景,用户可以根据自己的需要灵活组合使用。

展望

对于Spark on ACK的后续发展,我们一方面是要达到运维一体化,另一方面主要希望做到更好的性价比,主要有以下几点工作:

  • 可以将k8s计算资源分为固定集群和Serverless集群的混合架构,固定集群主要是一些包年包月、资源使用率很高的集群,Serverless是做到按需弹性。
  • 可以通过调度算法,灵活的把一些SLA不高的任务调度到Spot实例上,就是支持抢占式ECI容器,这样可以进一步降低成本。
  • 由于提供了Remote Shuffle Service集群,充分让Spark在架构上解耦本地盘,只要Executor空闲就可以销毁。配合上OSS提供的存算分离,必定是后续的主流方向。
  • 对于调度能力,这方面需要特别的增强,做到能够让客户感受不到性能瓶颈,短时间内调度起来大量的作业。同时对于作业队列管理方面,希望做到更强的资源控制和资源共享。

欢迎加入钉钉群沟通交流。

c17fc7d1d4f543e0b793fa89c2188c6f.jpeg

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
SQL 分布式计算 Serverless
EMR Serverless Spark:一站式全托管湖仓分析利器
本文根据2024云栖大会阿里云 EMR 团队负责人李钰(绝顶) 演讲实录整理而成
153 2
|
5月前
|
存储 分布式计算 Serverless
|
3月前
|
SQL 分布式计算 Serverless
阿里云 EMR Serverless Spark 版正式开启商业化
阿里云 EMR Serverless Spark 版正式开启商业化,内置 Fusion Engine,100% 兼容开源 Spark 编程接口,相比于开源 Spark 性能提升300%;提供 Notebook 及 SQL 开发、调试、发布、调度、监控诊断等一站式数据开发体验!
163 3
阿里云 EMR Serverless Spark 版正式开启商业化
|
5月前
|
分布式计算 Java Serverless
EMR Serverless Spark 实践教程 | 通过 spark-submit 命令行工具提交 Spark 任务
本文以 ECS 连接 EMR Serverless Spark 为例,介绍如何通过 EMR Serverless spark-submit 命令行工具进行 Spark 任务开发。
426 7
EMR Serverless Spark 实践教程 | 通过 spark-submit 命令行工具提交 Spark 任务
|
5月前
|
弹性计算 分布式计算 运维
迟来的EMR Serverless Spark评测报告
本文是一篇关于阿里云EMR Serverless Spark产品评测的文章,作者分享了使用体验和理解。EMR Serverless Spark是阿里云提供的全托管、一站式的Spark数据计算平台,简化了大数据处理流程,让用户专注于数据分析。文章提到了产品的主要优势,如快速启动、弹性伸缩、高资源利用率和低成本。
248 8
|
4月前
|
分布式计算 Serverless 数据处理
EMR Serverless Spark 实践教程 | 通过 Apache Airflow 使用 Livy Operator 提交任务
Apache Airflow 是一个强大的工作流程自动化和调度工具,它允许开发者编排、计划和监控数据管道的执行。EMR Serverless Spark 为处理大规模数据处理任务提供了一个无服务器计算环境。本文为您介绍如何通过 Apache Airflow 的 Livy Operator 实现自动化地向 EMR Serverless Spark 提交任务,以实现任务调度和执行的自动化,帮助您更有效地管理数据处理任务。
218 0
|
5月前
|
存储 分布式计算 运维
EMR Serverless Spark服务最佳实践测评
EMR Serverless Spark服务最佳实践测评
146 2
|
存储 分布式计算 Kubernetes
在 kubernetes 中用 alluxio 加速 spark 数据访问
Alluxio是一个开源的基于内存的分布式存储系统,适合作为云上大数据和AI / ML的数据编排方案。本文主要为大家讲解如何用alluxio加速spark数据访问。
664 0
在 kubernetes 中用 alluxio 加速 spark 数据访问
|
存储 分布式计算 Kubernetes
在kubernetes中用alluxio加速spark数据访问(二)
本文档主要说明怎样在k8s上用alluxio加速spark的数据访问。文档将演示结合spark、alluxio和k8s完成一个对文件单词进行计数的任务。在实验中,我们将开启alluxio的short-circuit的功能,验证spark executor与alluxio worker之间的通信是否通过domain socket方式完成。
2129 0
在kubernetes中用alluxio加速spark数据访问(二)
|
存储 分布式计算 Kubernetes
在Kubernetes中用Alluxio加速Spark数据访问(一)
本文档主要说明怎样在k8s上用alluxio加速spark的数据访问。文档将演示结合spark、alluxio和k8s完成一个对文件单词进行计数的任务。在实验中,我们将关闭alluxio的short-circuit的功能,验证spark executor与alluxio worker之间的通信是否通过网络栈完成。
2039 0
在Kubernetes中用Alluxio加速Spark数据访问(一)