spark transform算子_Spark高性能Job

本文深入探讨了Spark中的shuffle操作,包括shuffle write和shuffle read的分析,特别是transform算子引起的shuffle read。介绍了如何通过优化数据持久化、避免shuffle算子、使用广播变量、预聚合shuffle算子和调整Spark配置参数来提升性能。还讨论了数据倾斜的概念、识别与解决方案,以及Spark Shuffle的多种机制。
摘要由CSDN通过智能技术生成

366e210d43065e982b2dbae1a8b1b29a.png

知乎导入md文件会失真,无语,将就着看吧!原博客地址为:Spark高性能Job

1.1 Job

遇到一个action算子就会提交一个job,常见的transformation算子以及Action算子:

  • Transformation
    • map, mapPartitions, flatMap, filter, union, groupbyKey, repartition, cache
  • Action
    • reduce, collect, show, count, foreach, save一系列操作

1.2 Task

​ task是spark最小的执行单元,task的数量就是stage的并行度,分配给不同的executor去执行。RDD在计算的时候,每个分区都会启一个task,这就是我们常说的数据并行!在map阶段,partition分区的数量保持不变,在reduce阶段,RDD聚合会触发shuffle操作。

2 Spark Shuffle

shuffle是spark job中一个比较重要的阶段,发生在map与reduce之间。

2.1 举例分析

bbd9ced6e2594180d040ac66504446a4.png

对于上述的reduceByKey,涉及到需要将相同的key进行聚合。对于Stage1中的每个分区的数据,其输入可能存在于Stage0中的每个分区,因此需要从上游的每一个分区所在的机器拉取数据,这个过程称为shuffle。

2.2 Shuffle Write

shuffle write操作发生在ShuffleMapTask,Spark中的task分为以下两种类型:

  • ShuffleMapTask
  • 负责rdd之间的transform,map的输出也就是shuffle write
  • ResultTask
  • job最后阶段的执行任务,也就是action操作。

2.2.1 shuffle write分析

  • Hash Based Shuffle

885a009ee7b4d2891e74124e60da74ea.png

​ 上图有四个ShuffleMapTask,假设在这四个都在一个worker node上运行,CPU的核为2,可以同时运行2个task(一个核运行两个线程,可能是超线程技术)。

​ 那么每个执行shuffle write的task,要为下一个stage创建多少个磁盘文件呢?很简单,下一个stage的task有多少个,当前stage的每个Map task就要创建多少份磁盘文件。比如下一个stage总共有100个task,那么当前stage的每个task都要创建100份磁盘文件。如果当前stage有50个task,总共有10个Executor,每个Executor执行5个Task,那么每个Executor上总共就要创建500个磁盘文件,所有Executor上会创建5000个磁盘文件。由此可见,未经优化的shuffle write操作所产生的磁盘文件的数量是极其惊人的。

每个task包含R个缓冲区,R=Reducer的个数(也就是下个stage中task的个数),缓冲区被称为bucket。在将数据写入磁盘之前,会先将数据写入内存缓冲中,当内存缓冲填满之后,才会溢写到磁盘文件中去

但上述可能会出现下面几个问题:

  • 本地磁盘根据bucket产生的blockfile很多,ShuffleMap task产生R个blockfile,M个ShuffleMapTask产生M×R个文件。一般Spark Job的M与R都很大,因此磁盘上会有大量的blockfile文件
  • 缓冲区内存占用空间大
    每个 ShuffleMapTask 需要开 R 个 bucket,M 个 ShuffleMapTask 就会产生 M * R 个 bucket。实际情况下,在一个worker node上,可以并行运行cores个ShuffleMapTask,一个机器上的bucket个数达到cores×R个,这会占用大量的内存空间。

对于第二个问题,由于从内存往磁盘写数据一定得开缓冲区(内存与磁盘速度不匹配),所以对于第二个问题而言,没有较好的方法解决!但第一个问题可以通过下面的方法解决。

  • Consolidation机制的Shuffle

dce34d58d10006c8ec244f15ab7d234c.png

​ 在一个 core 上连续执行的 ShuffleMapTasks 可以共用一个输出文件 ShuffleFile。先执行完ShuffleMapTask 形成 Shuf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值