如何单独处理Kafka分区并与Spark执行器并行处理?

时间:2017-06-02 06:16:08

标签: apache-spark apache-spark-sql spark-structured-streaming apache-spark-standalone

我使用Spark 2.1.1。

我使用Structured Streaming从2个Kafka分区读取消息。我将我的应用程序提交给Spark Standalone集群,其中包含一个worker和2个执行程序(每个2个核心)。

./bin/spark-submit \
  --class MyClass \
  --master spark://HOST:IP \
  --deploy-mode cluster \
  /home/ApplicationSpark.jar

我想要的功能是,来自每个Kafka分区的消息应该由每个单独的执行器独立处理。但现在发生的事情是,执行程序分别读取和映射分区数据,但是映射后形成的无界表通常被使用并且具有来自两个分区的数据。

当我在表上运行结构化查询时,查询必须处理来自两个分区的数据(更多数据量)。

select product_id, max(smr.order_time), max(product_price) , min(product_price) 
from OrderRecords
group by WINDOW(order_time, "120 seconds"), product_id

Kafka分区位于Product_id

有没有办法在数据上并行运行相同的结构化查询,而不是执行器映射到的Kafka分区?

1 个答案:

答案 0 :(得分:0)

  

但现在发生的事情是,执行程序分别读取和映射分区数据,但是映射后形成的无界表通常被使用并且具有来自两个分区的数据。因此,当我在表上运行结构化查询时,查询必须处理来自两个分区的数据(更多数据量)。

这是理解什么以及如何执行而不会导致混乱并跨分区发送数据的关键(可能甚至通过线路)。

明确的答案取决于您的查询。如果他们处理记录组,其中组分布在多个主题分区上,因此分布在两个不同的Spark执行器上,那么您必须格外小心算法/转换以在单独的分区上进行处理(仅使用& #39;在分区中可用)并仅汇总结果。