您的位置:首页 > 其它

spark streaming性能优化

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

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

优化程序

能过滤则优先filter,以减少处理的数据量。不要按平常习惯在后面的步骤进行if判断。

尽量减少带来shuffle的操作,如reduce、group等。

使用高效算子,如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:设置等待时长
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spark 性能优化
相关文章推荐