流查询用于执行多少卡夫卡使用者?

时间:2018-12-04 02:57:44

标签: apache-kafka spark-structured-streaming

令我惊讶的是,Spark仅通过一个Kafka使用者使用了来自Kafka的数据,并且该使用者在驱动程序容器中运行。我希望看到的是,Spark创建的使用者与主题中的分区数量一样多,并在执行程序容器中运行这些使用者。

例如,我有一个带有5个分区的主题事件。我启动了我的Spark结构化流应用程序,该应用程序从该主题开始使用,并在HDFS上写入Parquet。该应用程序有5个执行程序。 在检查由Spark创建的Kafka消费者组时,我看到只有一个消费者负责所有5个分区。该使用者正在使用驱动程序在计算机上运行:

kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group spark-kafka-source-08e10acf-7234-425c-a78b-3552694f22ef--1589131535-driver-0

TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                     HOST            CLIENT-ID
events          2          -               0               -               consumer-1-8c3d806d-eb1e-4536-97d5-7c9d19582942 /192.168.100.147  consumer-1
events          1          -               0               -               consumer-1-8c3d806d-eb1e-4536-97d5-7c9d19582942 /192.168.100.147  consumer-1
events          0          -               0               -               consumer-1-8c3d806d-eb1e-4536-97d5-7c9d19582942 /192.168.100.147  consumer-1
events          4          -               0               -               consumer-1-8c3d806d-eb1e-4536-97d5-7c9d19582942 /192.168.100.147  consumer-1
events          3          -               0               -               consumer-1-8c3d806d-eb1e-4536-97d5-7c9d19582942 /192.168.100.147  consumer-1

检查所有5个执行程序的日志后,我发现只有一个执行程序正在忙于将消耗的数据写入HDFS上的Parquet位置。其他4个闲置。

这很奇怪。我的期望是5个执行程序应该从5个Kafka分区并行使用数据,并在HDFS上并行写入。这是否意味着驱动程序会使用来自Kafka的数据并将其分发给执行者?看起来像瓶颈。

更新1 我试图将 repartition(5)添加到流数据帧:

spark.readStream
    .format("kafka")
    .option("kafka.bootstrap.servers", "brokerhost:9092")
    .option("subscribe", "events")
    .option("startingOffsets", "earliest")
    .load()
    .repartition(5)

在那之后,我看到所有5位执行者都将数据写入HDFS(根据他们的日志)。尽管如此,我在Kafka主题的所有5个分区上仅看到一个使用者(驱动程序)。

更新2 Spark版本2.4.0。这是提交申请的命令:

spark-submit \
--name "Streaming Spark App" \
--master yarn \
--deploy-mode cluster \
--conf spark.yarn.maxAppAttempts=1 \
--conf spark.executor.instances=5 \
--conf spark.sql.shuffle.partitions=5 \
--class example.ConsumerMain \
"$jar_file

1 个答案:

答案 0 :(得分:0)

根据结构化流的文档,我可以看到它被提及为在执行器上创建的使用者,Consumer Caching