合理的并行度
减少批处理所消耗时间的常见方式还有提高并行度。有以下三种方式可以提高并行度:
1.增加接收器数目
有时如果记录太多导致单台机器来不及读入并分发的话,接收器会成为系统瓶颈。这时你就需要通过创建多个输入DStream(这样会创建多个接收器)来增加接收器数目,然后使用union 来把数据合并为一个数据源。
2.将收到的数据显式地重新分区
如果接收器数目无法再增加,你可以通过使用DStream.repartition 来显式重新分区输入流(或者合并多个流得到的数据流)来重新分配收到的数据。
3.提高聚合计算的并行度
对于像reduceByKey() 这样的操作,你可以在第二个参数中指定并行度,我们在介绍RDD 时提到过类似的手段。
并行度要合理
控制reduce 数量,太多的reducer, 造成很多的小任务, 以此产生很多启动任务的开销。太少的reducer, 任务执行行慢!
减少任务启动开销
使任务更小(更好的序列化,Kryo序列化)
输入数据序列化
RDD 序列化
TASK 序列化
在Standalone 及coarse-grained 模式下的任务启动要比fine-grained 省时(spark on yarn只支持coarse-grained)
1.粗粒度模式(Coarse-grained Mode):每个应用程序的运行环境由一个Dirver和若干个Executor组成,其中,每个Executor占用若干资源,内部可运行多个Task(对应多少个“slot”)。应用程序的各个任务正式运行之前,需要将运行环境中的