1.降低批次处理时间:
①数据接收并行度。
(1)增加DStream:接收网络数据(如Kafka,flume,Socket等)时会对数据进行反序列化再存储在Spark,由于一个DStream只有Receiver对象,如果成为瓶颈可考虑增加DStream。
(2)设置”spark.streaming.blockInterval”参数:接受的数据被存储在Spark内存前,会被合并成block,而block数量决定了task数量;举例,当批次时间间隔为2秒且block时间间隔为200毫秒时,Task数量约为10;如果Task数量过低,则浪费了cpu资源;推荐的最小block时间间隔为50ms。
(3)显式对Input DStream重新分区:再进行更深层次处理前,先对输入数据进行重新分区。
②数据处理并行度:reduceByKey,reduceByKeyAndWindow等operation可通过设置”spark.default.parallelism”参数或显式设置并行度方法参数控制。
③数据序列化:可配置更高效的kryo序列化。
2.设置合理批次时间间隔:
①原则:处理数据的速度应大于或等于数据输入的速度,即批次处理时间大于或等于批次时间间隔。
②方法:
(1)先设置批次时间间隔为5~10秒数据输入速度;
(2)再通过查看log4j日志中的”Total delay”,逐步调整批次时间间隔,保证”Total delay”小于批次时间间隔。
3.内存调优:
①持久化级别:开启压缩,设置参数”spark.rdd.compress”;
②GC策略:在Driver和Executor上开启CMS(Content Management System 内容管理系统)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。