0

我们正在尝试在 spark 中实现 Window 功能。Spark 通过 Kafka(有 5 个分区)接收数据,我们使用 Spark Java DStream 进行处理。一旦将来自 kafka 的逗号分隔数据映射到 Spark 中的对象,我们就会创建一个 20 秒的窗口,该窗口以 1 秒的速度滑动。在这个 Java DStream 上,我们计算并打印输出(实际上我们想做更多的处理,但为简单起见只应用了计数)。一切正常,直到处理时间出现峰值,处理一个任务大约需要 40 秒,然后发布,我们得到了一个很长的队列。集群详细信息: - 3 个节点集群 - 每个有 45 个核心(总共 135 个核心) - 每个有 256 GB RAM 测试设置:设置 1:- - 5 个 Kafka 分区 - 20 秒窗口,每个节点45 个执行器(总共 135 个执行器) - 为每个执行器分配1 GB 设置 3:- - 5 个 Kafka 分区 - 20 秒窗口,以 1 秒滑动 -每个节点15 个执行器(总共 45 个执行器) - 为每个执行器分配6 GB设置 4:- - 5 个 Kafka 分区 - 120秒窗口,以 1 秒滑动 - 每个节点 9 个执行器(总共 27 个执行器) - 为每个执行器分配 10 GB 设置 5:- (这是我们的实际场景) - 27个Kafka 分区 - 120秒窗口,以 1 秒滑动 - 每个节点 9 个执行器(总共 27 个执行器) - 为每个执行器分配 10 GB

在所有设置中,在某些时候处理需要太多时间(在大多数处理问题中接近 40 秒)。如果有人有解决方案或任何参数更改建议,那就太好了。

4

1 回答 1

0

如果您不想建立队列,您可以启用背压。这是通过将 spark.streaming.backpressure.enabled 设置为 true 并且它自 spark 1.5 起可用除此之外,了解生产者生成数据的速率以及您是否有足够的资源以该速率处理数据很重要. Spark-UI 将让您对此有所了解。还有其他因素需要考虑会影响性能,例如您是使用基于接收器的方法还是 kafka-direct,有或没有复制,有或没有检查点等。

于 2017-07-14T10:47:31.077 回答