Spark——性能调优——Shuffle

本文探讨了Spark中的shuffle过程,指出shuffle是性能瓶颈,详细阐述了shuffle的压缩、数据分区和算子选择对性能的影响。建议通过预分区、合理选择算子如reduceByKey代替groupByKey,以及使用coalesce减少shuffle来优化性能。同时指出,虽然shuffle通常被视为性能损耗,但在某些情况下,它可以节省执行时间。
摘要由CSDN通过智能技术生成

一、序引
    当以分布式方式处理数据时,常常需要执行map与reduce转换。由于巨量数据必须从一个节点传输到另外的节点,给集群中的cpu、磁盘、内存造成沉重的负载压力,同时也会给网络带宽带来压力。所以,reduce阶段进行的shuffle过程,往往是性能的瓶颈所在。
    shuffle过程涉及数据排序、重分区、网络传输时的序列化与反序列化,为了减少I/O带宽及磁盘I/O操作,还要对数据进行压缩。故而,shuffle的性能将直接spark的整体运算性能。
    因为shuffle文件数(M(Map数) * R(Reduce数))将会非常大。故而,这是性能损失的关键所在。折衷方案:压缩输出文件。spark默认的是Snappy,但也支持选择lz4、lzf。
    reduce阶段,内存问题异常突出。对于一个reducer而言,被shuffle的所有数据都必须放到内存中。若内存不够,则会因内存溢处而导致job失败。同时,这也是为何reducer数量如此重要的原因。reducer增加时,理应及时减少每个reducer对应的数据量。
    Hadoop与Spark的对比:hadoop中,map与reduce阶段存在交叠,mapper把输出数据推送到reducer;spark中,只有map阶段结束,reduce阶段才启动工作,reducer将拉取shuffle后的数据。
    在Spark中,引入了shuffle file consolidation机制,尽量输出少一点但大一些的文件。map阶段为每个分区输出一个shuffle文件。shuffle文件数是每个核的reducer数,而不是每个mapper的reducer数。原有运行在相同CPU核上的map任务都将输出相同的shuffle文件,每个reduc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值