我正在努力提高Spark Streaming应用程序的性能。
我想知道分区在流环境中如何工作。与将文件加载到spark中相同。
或者一直都只创建一个分区,使其只能在执行程序的一个核心中工作?
答案 0 :(得分:3)
在Spark Streaming(非结构化)中,分区的工作原理与您使用RDD
所知道的完全相同。您可以轻松地通过
rdd.getNumPartitions
正如您还标记了 spark-streaming-kafka 一样,值得一提的是,输入DStream中的分区数将与您使用的Kafka主题中的分区数匹配。
通常,对于RDD,有HashPartitioner和RangePartitioner用于重新分配策略。您可以通过{p>使用HashPartitioner
rdd.partitionBy(new HashPartitioner(2))
其中rdd
是成对的键值 RDD,而2
是分区的数量。
与结构化API相比,RDD还具有应用自定义分区的优势。为此,您可以扩展Partitioner
类并重写方法numPartitions
和getPartitions
,如下面的示例所示:
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
}
}