spark&shuffle | 青训营笔记

112 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第5天

在这里插入图片描述 master:监控worker节点,负责资源调度 worker:执行计算任务

启动模式: 本地 standalone yarn

spark可以用交互式界面进行开发自测

线上提交使用jar包submit,可以看UI,和historyserver查看运行明细。eventlog存储在hdfs

sparkcore

spark任务提交之后,yarn创建appmaster

RDD:分布式弹性数据集,spark中数据处理的基本单元。 组成部分: 分区:决定任务的并行数,创建rdd指定 函数:对数据进行计算 依赖关系:rdd的转换会生成新的rdd,spark可以通过依赖关系重新计算。 分区器:要产生分区的算子会有分区器 分区优先位置列表:移动数据,不移动数据

RDD的依赖 窄依赖:父RDD的一个partition最多对应一个字RDD的partition

宽依赖:父RDD的每个分区对应子RDD的多个分区,产生shuffle。

划分stage,依靠宽窄依赖:从后往前推:遇到宽依赖就划分stage,遇到窄依赖就加入stage。最后一个stage叫resulttask,前面的叫shufflemaptastk(因为stage末尾都要对应shuffle操作)

内存管理:堆内内存 executor缓存认 存储内存:广播,缓存RDD数据 执行内存:shuffle的内存

这两种内存可以互相借用,当存储内存空闲的时候,执行内存可以借用存储内存。spark还可以控制堆外内存。

shuffle机制:shufflemanager管理。 SortShuffleManager:在shuffle的时候会spill产生磁盘文件。不是说spark不落盘吗,怎么这里讲的意思好像是要落盘?

sparksql:也是要进行第一节课的sql执行阶段。 解析:解析sql语句生成抽象语法树。 分析:分析正确性,检查数据库,列。 优化:CBO,RBO,生成优化后的逻辑执行计划。 生成:物理执行计划

CBO的举例:统计数据决定join的方法:broadcastjoin,shuffle hash join,sort merge join 在这里插入图片描述

shuffle

在这里插入图片描述

shuffle概述

shuffle:对数据的移动 shuffle会消耗很多的资源的原因: M*R次网络连接 大量的数据移动 数据丢失风险 大量的排序操作 序列化,反序列化,数据压缩 在这里插入图片描述 产生shuffle的算子的分类 repartition改变分区,keyby指定key进行聚合,join把本身不在一起的数据聚合在一起,distinct(特殊的bykey) 在这里插入图片描述 当产生宽依赖是,spark会划分statge,两个stage之间是shuffle操作。

当创建cogroupRDD和shuffleRDD的时候,会产生shuffledependency 由partitioner类完成对shuffle的分区逻辑。shuffledependency中的Aggregator可以优化计算逻辑,eg:Wc的时候先在map端预聚合再发送,而不是直接发送原始的wordAndOne数据。

shuffle类型: hashshuffle:把不同的partition写到不同的文件中。优化,每个partition映射一个文件片段。

sortshuffle:每个task的数据写到一个文件中。通过排序的方式把相同partition的数据放到一起。

shufflerread:每个reducetask获取属于自己的shuffle生成的片段。 action算子会调用taskscheduler提交任务,创建RDD对象,从后往前划分stage。注册shuffle的时候会创建shufflehandler。会根据不同的条件生成不同的shuffle。

sortshufflewriter跟mr很类似。

shuffle优化

shuffle优化:广播join,实际上是不用join的,通过broadcast传过来的变量用map的逻辑。 mapsidecombine:map端预聚合。 参数优化。

shuffle倾斜优化:可能会oom,某些task作业很慢 提高并行度。 aqe:自适应查询执行,可以通过以往的执行经验来优化执行。 AQE中有skewjoin,spark通过运行信息了解到某数据a的量非常大,spark会切分a,分别与bjoin。

在这里插入图片描述

业界最新

pushshuffle 解决随机读问题:在读取shuffle数据之前合并shuffle数据。