我是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
参数。
对于每一批(从卡夫卡拉出来),拉出的项目是否会被分配到spark.sql.shuffle.partitions
的数量?例如,spark.sql.shuffle.partitions=5
和Batch1=100
行,我们最终会得到5个分区,每个分区有20行吗?
考虑到提供的代码段代码,由于groupByKey
后跟mapGroups/mapGroupsWithState
函数,我们是否还会利用Spark并行性?
更新
在gDataset.mapGroupsWithState
内部,我处理每个键/值并将结果存储在HDFS中。因此,输出接收器仅用于在控制台中输出一些统计信息。
答案 0 :(得分:5)
对于每个批次(从卡夫卡拉出),拉出的物品都是 除以
的数量IN
?
一旦达到spark.sql.shuffle.partitions
这是一个洗牌边界,它们就会被分开。首先检索数据时,分区数将等于Kafka分区数
考虑到提供的代码段,我们是否还会利用 由于groupByKey后跟一个Spark的并行性 mapGroups / mapGroupsWithState函数
通常是的,但这也取决于您如何设置Kafka主题。尽管您从代码中看不到,但Spark会在内部将数据的不同阶段拆分为较小的任务,并将它们分布在集群中的可用执行程序中。如果您的Kafka主题只有1个分区,这意味着在groupByKey
之前,您的内部流将包含一个分区,该分区不会被分区化,而是在单个执行程序上执行。只要您的Kafka分区计数大于1,您的处理将是并行的。在shuffle边界之后,Spark将重新分区数据以包含groupByKey
指定的分区数量。