了解Spark结构化流式并行性

时间:2018-01-13 12:42:27

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

我是Spark世界的新手,并且在努力学习一些概念。

使用Kafka的Spark Structured Streaming源时,并行性如何发生?

让我们考虑以下代码段:

SparkSession spark = SparkSession
          .builder()
          .appName("myApp")
          .getOrCreate();   

Dataset<VideoEventData> ds = spark
  .readStream()
  .format("kafka")
  ...

gDataset = ds.groupByKey(...)

pDataset = gDataset.mapGroupsWithState(
      ...
      /* process each key - values */
      loop values
        if value is valid - save key/value result in the HDFS
      ... 
)

StreamingQuery query = pDataset.writeStream()
          .outputMode("update")
          .format("console")
          .start();

//await
query.awaitTermination();

我读过并行性与数据分区的数量有关,数据集的分区数基于spark.sql.shuffle.partitions参数。

  1. 对于每一批(从卡夫卡拉出来),拉出的项目是否会被分配到spark.sql.shuffle.partitions的数量?例如,spark.sql.shuffle.partitions=5Batch1=100行,我们最终会得到5个分区,每个分区有20行吗?

  2. 考虑到提供的代码段代码,由于groupByKey后跟mapGroups/mapGroupsWithState函数,我们是否还会利用Spark并行性?

  3. 更新

    gDataset.mapGroupsWithState内部,我处理每个键/值并将结果存储在HDFS中。因此,输出接收器仅用于在控制台中输出一些统计信息。

1 个答案:

答案 0 :(得分:5)

  

对于每个批次(从卡夫卡拉出),拉出的物品都是   除以IN

的数量

一旦达到spark.sql.shuffle.partitions这是一个洗牌边界,它们就会被分开。首先检索数据时,分区数将等于Kafka分区数

  

考虑到提供的代码段,我们是否还会利用   由于groupByKey后跟一个Spark的并行性   mapGroups / mapGroupsWithState函数

通常是的,但这也取决于您如何设置Kafka主题。尽管您从代码中看不到,但Spark会在内部将数据的不同阶段拆分为较小的任务,并将它们分布在集群中的可用执行程序中。如果您的Kafka主题只有1个分区,这意味着在groupByKey之前,您的内部流将包含一个分区,该分区不会被分区化,而是在单个执行程序上执行。只要您的Kafka分区计数大于1,您的处理将是并行的。在shuffle边界之后,Spark将重新分区数据以包含groupByKey指定的分区数量。