spark streaming性能优化

spark streaming去重中,有解决思路固然重要,但实现以后却发现会有性能问题,其处理时间大于interval,导致delay越来越大,产生堆积。因此,spark streaming性能调优,基本是必不可少的一步。

通过在网上查阅资料,及自己总结,有以下一些经验。

优化程序

  1. 能过滤则优先filter,以减少处理的数据量。不要按平常习惯在后面的步骤进行if判断。
  2. 尽量减少带来shuffle的操作,如reduce、group等。
  3. 使用高效算子,如subtractByKey代替leftOuterJoin、reduceByKey/aggregateByKey代替groupByKey,网上还有使用mapPartitions替代普通map、foreachPartitions替代foreach、filter之后进行coalesce操作、repartitionAndSortWithinPartitions替代repartition与sort类操作等未予验证使用。

函数可以并行

spark会将函数发到各个executor,分别在本地并行执行。如果函数无法支持并行,就会积压到一个executor,从而达不到平均分发任务的效果,造成瓶颈。

一般问题会产生在最后的foreach中,比如在写入数据库或Hbase时不是并行方式等。

这个可以通过在Spark UI中的Executors中通过观察task在各个executor的分配情况判断。正常情况下,各个executor的active tasks和total tasks都是平均分布。

提高并行度

在保证函数可以支持并行情况下,就可以提高并行度了。

  • 提高executors的数目
  • 提高每个executor的cpu数目

存储和序列化

  • 不使用带序列化的持久化策略时,数据的序列化和反序列化会带来性能消耗。
  • 使用Kryo对函数和对象等进行序列化,减少网络传输量。spark2.0.2中,会对可序列化进行强制检查,可通过下面的方式支持序列化:
conf.registerKryoClasses(new Class[] { MyClass.class });

spark参数(详见doc

  • spark.default.parallelism:设置task的并行数
  • spark.streaming.blockInterval:设置生成Block的时间间隔
  • spark.locality.wait:设置等待时长
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值