Spark笔记9之spark shuffle

什么是Spark Shuffle

 

答案:每个Spark作业启动运行的时候,首先Driver进程会将我们编写的Spark作业代码分拆为多个stage,每个stage执行一部分代码片段,并为每个stage创建一批Task,然后将这些Task分配到各个Executor进程中执行。一个stage的所有Task都执行完毕之后,在各个executor节点上会产生大量的文件,这些文件会通过IO写入磁盘(这些文件存放的时候这个stage计算得到的中间结果),然后Driver就会调度运行下一个stage。下一个stage的Task的输入数据就是上一个stage输出的中间结果。如此循环往复,直到程序执行完毕,最终得到我们想要的结果。Spark是根据shuffle类算子来进行stage的划分。如果我们的代码中执行了某个shuffle类算子(比如groupByKey、countByKey、reduceByKey、join等等)每当遇到这种类型的RDD算子的时候,划分出一个stage界限来。(答案来自 链接:https://www.jianshu.com/p/069c37aad295 )

reduceByKey为例

reduceByKey的含义?

reduceByKey会将上一个RDD中的每一个key对应的所有value聚合成一个value,然后生成一个新的RDD,元素类型是<key,value>对的形式,这样每一个key对应一个聚合起来的value

问题:每一个key对应的value不一定都是在一个partition中,也不太可能在同一个节点上,因为RDD是分布式的弹性的数据集,他的partition极有可能分布在各个节点上。

 

如何聚合?

Shuffle Write上一个stage的每个map task就必须保证将自己处理的当前分区中的数据相同的key写入一个分区文件中,可能会写入多个不同的分区文件中

Shuffle Readreduce task就会从上一个stage的所有task所在的机器上寻找属于自己的那些分区文件,这样就可以保证每一个key所对应的value都会汇聚到同一个节点上去处理和聚合

 

图解Hash-Based Shuffle

HashShuffle

1、普通机制

每一个map task都会产生R(reduce task的个数)个磁盘小文件,M个task会产生 M*R个磁盘小文件

磁盘小文件过多,影响

(1)写磁盘的时候,会产生大量的写文件对象

(2)读文件时会产生大量的读文件对象

 (3)频繁的大量数据的通信

对象过多--》内存不足--》GC--》OOM

shuffle可能面临的问题

针对上图中Shuffle过程可能会产生的问题?

小文件过多,耗时低效的IO操作

OOM,读写文件以及缓存过多

2、合并机制

每一个Executor(1 core)会产生R个磁盘小文件,磁盘小文件数=c*R

 c代表core的数量,一个core一般给他分配2-3个task执行

如何优化解决问题?

优化后的HashShuffleManager

优化后的HashShuffleManager的原理

SortShuffle运行原理

SortShuffle的运行机制主要分成两种:

普通运行机制

bypass运行机制

SortShuffle两种运行机制的区别?

SortShuffleManager普通运行机制

 SortShuffleManager  bypass运行机制

 

bypass运行机制的触发条件如下:

shuffle reduce task数量小于spark.shuffle.sort.bypassMergeThreshold参数的值。

 

map task ,reduce task 流程图

Executor的内存管理

<think>好的,用户需要查找关于Apache Spark的学习笔记和资料教程。首先,我需要整理已有的引用信息,看看哪些资源可以直接推荐。根据提供的引用,有四个相关的资料: 1. 引用[1]是Spark官方文档的中文版,项目地址明确,适合作为权威参考。 2. 引用[2]是一本深入学习的教程,覆盖多个领域,适合进阶学习。 3. 引用[3]和[4]是入门笔记,解释了Spark的基本概念和与Hadoop的区别,适合初学者。 接下来,用户可能希望了解这些资源的具体内容和如何获取。需要确保每个推荐的资料都有清晰的描述和链接。例如,官方文档的中文版对中文用户非常友好,而GitCode的地址需要检查是否正确有效。此外,提到的Spark与Hadoop的差异是一个常见问题,引用[4]中的内容可以解答这一点,应该强调。 用户可能还关心学习路径,是否需要从入门到精通的资料。因此,分层次推荐资料会更好,比如先官方文档和入门笔记,再深入学习教程。同时,是否需要补充其他资源?但根据现有引用,这四个已经涵盖了从基础到应用的不同方面,暂时足够。 另外,用户的问题中提到“学习笔记”,所以引用[3]和[4]作为笔记类内容应该优先提到。同时,可能用户需要实践方面的指导,比如代码示例,但现有引用中没有提到具体代码,可能需要说明这些资料更侧重概念和理论。 最后,检查是否有遗漏的信息,比如项目地址是否正确,是否有访问权限问题。引用[1]的GitCode链接需要确认是否存在,但根据提供的信息,应该没问题。总结来说,回答应结构清晰,分点推荐,并简要说明每个资源的特点和适用阶段,方便用户选择。</think>根据您的需求,为您整理以下 Apache Spark 学习资源(按学习阶段分类): ### 一、基础入门资料 1. **Spark核心特性解析** - Spark与Hadoop的核心差异在于**内存计算机制**,通过减少磁盘I/O提升性能(如Shuffle过程优化)[^4] - 支持多种计算模式:批处理、流处理、机器学习、图计算[^2] - 提供Scala/Java/Python/R四种API接口[^3] 2. **官方权威文档** - 《Apache Spark 官方文档中文版》[^1] - 特点:完整体系结构解析 + 配置参数详解 + 代码示例 - 获取:GitCode镜像库 https://gitcode.com/gh_mirrors/sp/spark-duc-zh ### 二、进阶学习路径 3. **系统化学习教程** - 《深入学习 Apache Spark:从入门到精通》[^2] - 涵盖内容: ```markdown 1. RDD编程模型原理 2. Spark SQL优化技巧 3. Structured Streaming实时处理 4. MLlib机器学习实战 ``` 4. **架构设计精要** - 驱动程序-执行器架构 - DAG调度器的工作流程 - 内存管理策略(Tungsten优化) ### 三、实践指导资源 5. **开发者笔记精选** - 《Spark学习笔记》系列: ```python # 典型WordCount示例 text_file = sc.textFile("hdfs://...") counts = text_file.flatMap(lambda line: line.split(" ")) \ .map(lambda word: (word, 1)) \ .reduceByKey(lambda a, b: a + b) ``` - 集群部署实践:Standalone/YARN/Mesos模式对比 6. **性能调优手册** - 常见优化策略: ```markdown - 并行度设置公式:$$ partitions = \frac{total\_cores}{executor\_instances} $$ - 内存分配黄金比例:Storage/Execution内存占比 - Shuffle参数优化指南 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值