背景
我有一个火花流应用程序,它从Kinesis读取数据 - >它上面的窗口 - >将数据保存到外部系统(通过foreachRDD)。
最近我发现,我的窗户被foreachRDD一个接一个地消耗掉了。这意味着如果我的应用程序中突然出现数据突发(因此窗口的foreachRDD需要很长时间),那么窗口将在处理之前堆叠在队列中(而我的群集中的大多数机器都处于空闲状态)。 / p>
问题
这是一个火花流的语义,窗口是一个一个一个地处理?如果是,是否有任何方法可以在spark中并行执行“窗口化”操作,以便窗口由foreachRDD同时使用?
答案 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中。