如何分别处理Kafka分区并与Spark执行程序并行处理?

问题描述:

我使用Spark 2.1.1。如何分别处理Kafka分区并与Spark执行程序并行处理?

我使用结构化流式处理从2个Kafka分区读取消息。我正在向Spark Standalone集群提交我的应用程序,其中包含一名工作人员和两名执行程序(每个2个核心)。

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

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

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

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

其中卡夫卡分区是Product_id

是否有任何方式来运行结构化查询平行相同的,但分开的数据,从卡夫卡分区到的执行器被映射?

+0

如何检查_“执行者分别读取和映射分区数据,但在映射所形成的*表之后,通常会使用这些表,并使数据来自这两个分区。你看执行计划吗?你能粘贴它吗?你还用什么来声明这个声明? –

+0

当我打印该exe文件时。计划,它显示**“没有实际计划”**。 _当我们打印计数查询的输出时我们看到了什么;它显示了跨分区的记录总数。 我们没有要求跨分区执行统一数据的查询。我们需要的是独立处理较小的数据集。 例如 卡夫卡分区 - P1,P2 P1包含产品1至10 P2包含产品11至20 当我们运行Spark流的两个执行器时,我们希望对每个10个记录的单个数据集进行操作。 – kadsank

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

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

确切的答案取决于您的查询。如果他们工作的记录组在多个主题分区上传播,因此分布在两个不同的Spark执行程序上,则必须特别小心您的算法/转换,以便在单独的分区上执行处理(仅使用可用的分区)并仅汇总结果。