如何为HadoopPartitions计算Spark的默认分区?

时间:2018-12-01 17:44:14

标签: apache-spark hadoop

我正在读Jacek Laskowski's online book about Apache Spark,关于分区,他说

  

默认情况下,为每个HDFS分区创建一个分区,通过   默认为64MB

我对HDFS并不是很熟悉,但是我在复制此声明时遇到了一些问题。我有一个名为Reviews.csv的文件,它大约是330MB亚马逊食品评论的文本文件。给定默认的64MB块,我希望有ceiling(330 / 64) = 6个分区。但是,当我将文件加载到Spark Shell中时,会得到9个分区:

scala> val tokenized_logs = sc.textFile("Reviews.csv")
tokenized_logs: org.apache.spark.rdd.RDD[String] = Reviews.csv MapPartitionsRDD[1] at textFile at <console>:24

scala> tokenized_logs
res0: org.apache.spark.rdd.RDD[String] = Reviews.csv MapPartitionsRDD[1] at textFile at <console>:24

scala> tokenized_logs.partitions
res1: Array[org.apache.spark.Partition] = Array(org.apache.spark.rdd.HadoopPartition@3c1, org.apache.spark.rdd.HadoopPartition@3c2, org.apache.spark.rdd.HadoopPartition@3c3, org.apache.spark.rdd.HadoopPartition@3c4, org.apache.spark.rdd.HadoopPartition@3c5, org.apache.spark.rdd.HadoopPartition@3c6, org.apache.spark.rdd.HadoopPartition@3c7, org.apache.spark.rdd.HadoopPartition@3c8, org.apache.spark.rdd.HadoopPartition@3c9)

scala> tokenized_logs.partitions.size
res2: Int = 9

我确实注意到,如果我创建另一个名为Reviews.csv的{​​{1}}的较小版本,只有135MB,则会大大减小分区大小:

Reviews_Smaller.csv

但是,按照我的数学,应该有scala> val raw_reviews = sc.textFile("Reviews_Smaller.csv") raw_reviews: org.apache.spark.rdd.RDD[String] = Reviews_Smaller.csv MapPartitionsRDD[11] at textFile at <console>:24 scala> raw_reviews.partitions.size res7: Int = 4 个分区,而不是4个分区。

我正在MacBook Pro上本地运行所有程序。谁能帮助解释如何为HDFS计算默认分区的数量?

1 个答案:

答案 0 :(得分:4)

来自Spark Programming Guide

  

默认情况下,Spark为文件的每个块创建一个分区   (默认情况下,HDFS中的块为128MB),但您也可以要求   通过传递更大的值来分配更多的分区。注意你   分区不能少于块。

128MB仅是默认 HDFS块的大小,但对于任何文件而言实际上可以有所不同。在这种情况下,分区数意味着您使用非默认的块大小(或更可能是由多个较小的文件组成)写入文件。

有关确定HDFS文件分割为多少块的方法,请参见this excellent SO