我们正在尝试在spark中实现Window函数。 Spark通过Kafka(有5个分区)接收数据,我们正在使用Spark Java DStream进行处理。一旦将来自kafka的逗号分隔数据映射到Spark中的对象,我们就会创建一个20秒的窗口,该窗口以1秒的速度滑动。在这个Java DStream上,我们计算并打印输出(实际上我们想要做更多的处理,但为了简单起见,只应用count)。一切正常,直到处理时间出现尖峰,处理一个任务大约需要40秒,然后发布,我们得到一个长队列。 群集细节: - 3节点集群 - 每个有45个核心(总共135个核心) - 每个都有256 GB RAM 设置测试: 设置1: - - 5个Kafka分区 - 20秒窗口,1秒滑动 - 每个节点9个执行器(共27个执行器) - 为每个Executor分配10 GB 设置2: - - 5个Kafka分区 - 20秒窗口,1秒滑动 - 45 每个节点的执行程序(总共135个执行程序) - 为每个Executor分配 1 GB 设置3: - - 5个Kafka分区 - 20秒窗口,1秒滑动 - 15 每个节点的执行程序(共45个执行程序) - 为每个Executor分配 6 GB 设置4: - - 5个Kafka分区 - 120 秒窗口,以1秒为单位滑动 - 每个节点9个执行器(共27个执行器) - 为每个Executor分配10 GB 设置5: - (这是我们的实际场景) - 27 Kafka分区 - 120 秒窗口,以1秒为单位滑动 - 每个节点9个执行器(共27个执行器) - 为每个执行程序分配10 GB
在所有设置中,在某些时候处理需要花费太多时间(在大多数处理问题中接近40秒)。 如果某人有解决方案或任何参数更改建议,那将会很棒。
答案 0 :(得分:0)
如果您不想建立队列,可以启用背压。这是通过将spark.streaming.backpressure.enabled设置为true并从spark 1.5开始可用来完成的 除此之外,了解生产者生成的数据以及您是否有足够的资源以此速率处理数据非常重要。 Spark-UI将为您提供一些见解。 还有其他因素会影响性能,例如您是使用基于接收器的方法还是kafka-direct,有或没有复制,有或没有检查点等。