spark的分区设计

spark 的RDD中对应数据是分区的:
对于RDD来说,每个分片都会被一个计算任务处理,并决定并行计算的粒度。
一个task 处理一个分区
使用数组并行化生成RDD的时候,用户可以在创建RDD时指定RDD的分片个数,
如果没有指定,那么就会采用默认值。默认值就是程序所分配到的CPU Core的数目。
如下就是代码实现,当然rdd也可以采用partitionBy(partitioner)重新分区,只是groupBy 作用在kv 类型RDD上

scala> var rdd0 = sc.parallelize(List(1,2,0,3,5,9,7,8),8)
rdd0: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[25] at parallelize at <console>:24
scala> rdd0.partitions.size
res32: Int = 8
scala> var rdd1 = sc.parallelize(List(1,2,0,3,5,9,7,8))
rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[26] at parallelize at <console>:24
scala> rdd1.partitions.size
res33: Int = 3
scala> rdd1.partitioner
res34: Option[org.apache.spark.Partitioner] = None

读取hdfs 文件时候,一般一个block 读成RDD的一个分区
如果只有hdfs 中文件block=1, 那么spark设定了最小分区数量2
底层代码实现

 def textFile(
      path: String,
      minPartitions: Int = defaultMinPartitions): RDD[String] = withScope {
    assertNotStopped()
    hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text],
      minPartitions).map(pair => pair._2.toString).setName(path)
  }

  def defaultMinPartitions: Int = math.min(defaultParallelism, 2)
发布了53 篇原创文章 · 获赞 4 · 访问量 976

猜你喜欢

转载自blog.csdn.net/weixin_43548518/article/details/103403965