Spark 高性能算子

Spark 高性能算子

1. map 与 mapPartitions

1.优缺点

mapPartition的优点:

普通的map执行一个partition中有1.2万条数据。ok,那么function要执行和计算1.2万次。

如果使用MapPartitions操作之后,一个task仅仅会执行一次function,function一次接收所有的partition数据。只要执行一次就可以了,性能比较高。

mapPartition的缺点:

普通的map操作一次function的执行就处理一条数据。那么如果内存不够用的情况下,回收内存就OK,一般来说普通的map操作通常不会导致内存的OOM异常。

但是MapPartitions操作,对于大量数据来说,比如甚至一个partition,200万数据,一次传入一个function以后,那么可能一下子内存不够,可能导致OOM,内存溢出。

2.使用场景

在项目中先要预估一下每个partition中rdd的数量,同时了解内存大小,当分析的数据量不是特别大的时候且不会出现OOM,选择MapPartitions。

2. foreach 与 foreachPartition

1.优缺点

foreachPartition的优点:

foreachPartition一般是用来将处理好的数据保存到数据库,使用它有三大好处:

  • 调用一次func函数,一次传入一个partition所有的数据
  • 一个分区创建一个数据库连接(数据库连接的创建和销毁,都是非常非常消耗性能的)
  • 只需要向数据库发送一次SQL语句和多组参数即可(多次发送SQL语句,非常消耗性能)。

3. filter过后使用coalesce减少分区数量

1.原因

rdd经过filter之后,rdd中的每个partition的数量可能不一样,原本每个partition的数量差不多,但处理后,会导致后面的task处理partition的时候,要处理的数据量就不同,这样就会导致有些task运行的速度很快,有些task运行的速度很慢。如果partition数量少的就浪费了task计算资源,这就是传说中的数据倾斜。

2.解决方案

调用coalesce算子,用于在filter操作之后,针对每个partition的数据量各不相同的情况,来压缩partition的数量,而且让每个partition的数据量都尽量均匀紧凑。从而便于后面的task进行计算操作,在某种程度上,能够一定程度的提升性能。

4. persist\cache数据复用的时候使用持久化算子

cache()是使用persist()的快捷方法,cache()方法使用了默认的存储级别—StorageLevel.MEMORY_ONLY

  • StorageLevel.MEMORY_ONLY(),纯内存,无序列化,那么就可以用cache()方法来替代

  • StorageLevel.MEMORY_ONLY_SER() ,将RDD作为非序列化的Java对象存储jvm中,如果RDD不合适存在内存中,将这些不合适在内存中的分区存储在磁盘中,每次需要时读取它们。

  • StorageLevel.MEMORY_AND_DISK() 将RDD作为序列化的Java对象存储,这种方式比非序列化方式更节俭空间,快速序列化会比较耗费CPU资源

  • StorageLevel.MEMORY_AND_DISK_SER(), 与MEMORY_ONLY_SER()类似,但不是每次需要时重复计算这些不合适存储到内存中的分区,而是将这些分区存储到磁盘中。

  • StorageLevel.DISK_ONLY() ,仅仅将RDD分区存储到磁盘中

  • 如果内存充足,要使用双副本高可靠机制,选择后缀带_2的策略,StorageLevel.MEMORY_ONLY_2()

5. reduceByKey和aggregateByKey取代groupByKey

1.原因
groupByKey不会进行Mapper的聚合操作,groupByKey不会进行Mapper端的aggregate的操作,所有的数据会通过网络传输传到Reducer端,性能会比较差.

2.aggregateByKey取代groupByKey
aggregateByKey的时候,可以自定义Mapper端的操作和Reducer端的操作

6.repartition解决Spark SQL低并行度的性能问题

并行度是设置的:spark.default.parallelism,在生产环境中,是最好设置一下并行度。官网有推荐的设置方式,根据你的application的总cpu core数量(在spark-submit中可以指定),自己手动设置spark.default.parallelism参数,指定为cpu core总数的2~3倍

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值