我是 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
,我们是否仍然利用 Spark 并行性?后跟一个 mapGroups/mapGroupsWithState
职能 ? 更新:
内
gDataset.mapGroupsWithState
是我处理每个键/值并将结果存储在 HDFS 的地方。因此,输出接收器仅用于在控制台中输出一些统计信息。
最佳答案
For every Batch (pull from the Kafka), will the pulled items be divided among the number of
spark.sql.shuffle.partitions
?
一旦到达
groupByKey
就会被分割这是一个洗牌边界。第一次检索数据时,分区数将等于 Kafka 分区数Considering the snippet code provided, do we still leverage in the Spark parallelism due to the groupByKey followed by a mapGroups/mapGroupsWithState functions
通常是的,但这也取决于您如何设置 Kafka 主题。尽管您从代码中看不到,但 Spark 会在内部将不同阶段的数据拆分为更小的任务,并将它们分配到集群中可用的执行程序中。如果您的 Kafka 主题只有 1 个分区,则意味着在
groupByKey
之前,您的内部流将包含一个分区,该分区不会被并行化,而是在单个执行程序上执行。只要您的 Kafka 分区计数大于 1,您的处理就会并行。在shuffle边界之后,Spark将重新分区数据以包含spark.sql.shuffle.partitions
指定的分区数量。 .
关于apache-spark - 理解 Spark 结构化流并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48239970/