在Spark Streaming中分区如何工作?

时间:2019-09-15 03:55:50

标签: scala apache-spark spark-streaming rdd spark-streaming-kafka

我正在努力提高Spark Streaming应用程序的性能。

我想知道分区在流环境中如何工作。与将文件加载到spark中相同。

或者一直都只创建一个分区,使其只能在执行程序的一个核心中工作?

1 个答案:

答案 0 :(得分:3)

在Spark Streaming(非结构化)中,分区的工作原理与您使用RDD所知道的完全相同。您可以轻松地通过

检查分区数
rdd.getNumPartitions

正如您还标记了 spark-streaming-kafka 一样,值得一提的是,输入DStream中的分区数将与您使用的Kafka主题中的分区数匹配。

通常,对于RDD,有HashPartitionerRangePartitioner用于重新分配策略。您可以通过{p>使用HashPartitioner

rdd.partitionBy(new HashPartitioner(2))

其中rdd是成对的键值 RDD,而2是分区的数量。

与结构化API相比,RDD还具有应用自定义分区的优势。为此,您可以扩展Partitioner类并重写方法numPartitionsgetPartitions,如下面的示例所示:

import org.apache.spark.Partitioner

class TablePartitioner extends Partitioner {
  override def numPartitions: Int = 2
  override def getPartition(key: Any): Int = {
    val tableName = key.asInstanceOf[String]
    if(tableName == "foo") 0 // partition count start at 0
    else 1
  }
}