我正在读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计算默认分区的数量?
答案 0 :(得分:4)
默认情况下,Spark为文件的每个块创建一个分区 (默认情况下,HDFS中的块为128MB),但您也可以要求 通过传递更大的值来分配更多的分区。注意你 分区不能少于块。
128MB仅是默认 HDFS块的大小,但对于任何文件而言实际上可以有所不同。在这种情况下,分区数意味着您使用非默认的块大小(或更可能是由多个较小的文件组成)写入文件。
有关确定HDFS文件分割为多少块的方法,请参见this excellent SO。