技术世?/title> <icon>https://www.gravatar.com/avatar/b7c3335ef8378cf904c036c9f55912c9</icon> <subtitle>分n交流大数据领域技术,包括但不限于Storm、Spark、Hadoop{流行分布式计算pȝQKafka、MetaQ{分布式消息pȝQMongoDB、Cassandra{NoSQLQPostgreSQL、MySQL{RDBMS以及其它前沿技?/subtitle> <link href="/atom.xml" rel="self"/> <link href="http://www.luozeyang.com/"/> <updated>2018-10-16T23:02:13.000Z</updated> <id>http://www.luozeyang.com/</id> <author> <name>郭俊 Jason</name> <email>jason.guo.vip@gmail.com</email> </author> <generator uri="http://hexo.io/">Hexo</generator> <entry> <title>Adaptive Execution ?Spark SQL 更高效更 http://www.luozeyang.com/spark/adaptive_execution/ 2018-10-16T23:02:13.000Z 2018-10-16T23:02:13.000Z

原创文章Q{载请务必下面这D话|于文章开头处?br>本文转发?a href="http://www.luozeyang.com">技术世?/strong>Q?a href="http://www.luozeyang.com/spark/adaptive_execution/">原文链接 http://www.luozeyang.com/spark/adaptive_execution/

本文所q内容均Z 2018q??7?Spark 最?Spark Release 2.3.1 版本Q以及截止到 2018q?0?1?Adaptive Execution 最新开发代码。自动设|?Shuffle Partition 个数已进?Spark Release 2.3.1 版本Q动态调整执行计划与处理数据倾斜未q入 Spark Release 2.3.1

1 背景

前面?a href="http://www.luozeyang.com/spark/rbo/">Spark SQL / Catalyst 内部原理 ?RBO》与?a href="http://www.luozeyang.com/spark/cbo/">Spark SQL 性能优化再进一?CBO Z代h的优?/a>》介l的优化Q从查询本n与目标数据的特点的角度尽可能保证了最l生成的执行计划的高效性。但?/p>

本文介绍?Adaptive Execution 可以根据执行过E中的中间数据优化后l执行,从而提高整体执行效率。核心在于两?/p>

2 动态设|?Shuffle Partition

2.1 Spark Shuffle 原理

Spark Shuffle 一般用于将上游 Stage 中的数据?Key 分区Q保证来自不?Mapper Q表CZ?Stage ?TaskQ的相同?Key q入相同?Reducer Q表CZ?Stage ?TaskQ。一般用?group by 或?Join 操作?br>Spark Shuffle q程

如上图所C,?Shuffle d?2 ?Mapper ?5 ?Reducer。每?Mapper 会按相同的规则(?Partitioner 定义Q将自己的数据分Z份。每?Reducer 从这两个 Mapper 中拉取属于自q那一份数据?/p>

2.3 自动讄 Shuffle Partition 原理

?Spark Shuffle 原理 一节图中所C,Stage 1 ?5 ?Partition 数据量分别ؓ 60MBQ?0MBQ?MBQ?MBQ?0MB。其?1MB ?2MB ?Partition 明显q小Q实际场景中Q部分小 Partition 只有几十 KB 及至几十字节Q?/p>

开?Adaptive Execution ?/p>

三个 Reducer q样分配是因?/p>

׃囑֏见,Reducer 1 从每?Mapper d Partition 1?? 都有三根U,是因为原来的 Shuffle 设计中,每个 Reducer 每次通过 Fetch h从一个特?Mapper L据时Q只能读一?Partition 的数据。也卛_上图中,Reducer 1 d Mapper 0 的数据,需?3 ?Fetch h。对?Mapper 而言Q需要读三次盘Q相当于随机 IO?/p>

Z解决q个问题QSpark 新增接口Q一?Shuffle Read 可以d?Partition 的数据。如下图所C,Task 1 通过一轮请求即可同时读?Task 0 ?Partition 0? ?2 的数据,减少了网l请求数量。同?Mapper 0 一ơ性读取ƈq回三个 Partition 的数据,相当于顺?IOQ从而提升了性能?br>Spark SQL adaptive reducer 2

׃ Adaptive Execution 的自动设|?Reducer 是由 ExchangeCoordinator Ҏ Shuffle Write l计信息军_的,因此即在同一?Job 中不?Shuffle ?Reducer 个数都可以不一P从而得每?Shuffle 都尽可能最优?/p>

上文