火花流中窗口的执行顺序

时间:2016-03-02 16:57:02

标签: apache-spark spark-streaming

背景

我有一个火花流应用程序,它从Kinesis读取数据 - >它上面的窗口 - >将数据保存到外部系统(通过foreachRDD)。

最近我发现,我的窗户被foreachRDD一个接一个地消耗掉了。这意味着如果我的应用程序中突然出现数据突发(因此窗口的foreachRDD需要很长时间),那么窗口将在处理之前堆叠在队列中(而我的群集中的大多数机器都处于空闲状态)。 / p>

问题

这是一个火花流的语义,窗口是一个一个一个地处理?如果是,是否有任何方法可以在spark中并行执行“窗口化”操作,以便窗口由foreachRDD同时使用?

1 个答案:

答案 0 :(得分:0)

找出你的kinesis流有多少分片,并通过调用KinesisUtils Scala类中定义的createStream来创建那么多接收器。

blog post from Amazon解释得很好......

  

每个输入DStream都与接收器相关联,在这种情况下   还有一名KCL工作人员。理解这一点的最好方法是参考   在KinesisUtils Scala类中定义的createStream方法。

     

每次调用KinesisUtils.createStream都会实例化Spark Streaming   接收器和Spark执行器上的KCL工作进程。第一次   创建一个KCL工作者,它连接到Amazon Kinesis流和   为它管理的每个分片实例化一个记录处理器。对于   每次后续调用,都会创建一个新的KCL工作人员和记录   处理器在所有可用的KCL工作人员之间重新平衡。 KCL   工作人员从分片中提取数据,并将它们路由到接收器,   它反过来将它们存储到相关的DStream中。