这是我参与「第四届青训营 」笔记创作活动的的第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数据。