ESS(EMR Remote Shuffle Service)是EMR在优化计算引擎的Shuffle操作上,推出的扩展组件。
背景信息
目前Shuffle方案缺点如下:
-
Shuffle Write在大数据量场景下会溢出,导致写放大。 -
Shuffle Read过程中有大量的网络小包导致Connection reset问题。 -
Shuffle Read过程中存在大量小数据量的IO请求和随机读,对磁盘和CPU造成高负载。 - 对于
M*N次的连接数,在M和N数千的规模下,作业基本无法完成。 -
NodeManager和Spark Shuffle Service是同一进程,当Shuffle的数据量特别大时,通常会导致NodeManager重启,从而影响YARN调度的稳定性。
EMR推出的基于Shuffle的ESS服务,可以优化目前方案的问题。优势如下:
- 使用
Push-Style Shuffle代替Pull-Style,减少Mapper的内存压力。 - 支持
IO聚合,Shuffle Read的连接数从M*N降到N,同时更改随机读为顺序读。 - 支持两副本机制,降低
Fetch Fail概率。 - 支持计算与存储分离架构,可以部署
Shuffle Service至特殊硬件环境中,与计算集群分离。 - 解决
Spark on Kubernetes时对本地磁盘的依赖。
ESS架构图

image.png
使用ESS
Spark使用ESS时,只需在提交Spark作业时添加如下两个配置项
spark.shuffle.manager org.apache.spark.shuffle.ess.EssShuffleManager 固定值
spark.ess.master.address <ess-master-ip>:<ess-master-port>
【参考】
https://developer.aliyun.com/article/772328
https://developer.aliyun.com/article/779686