代码之家  ›  专栏  ›  技术社区  ›  Yu Chen little_birdie

Spark的默认分区是如何计算HadoAppartments的?

  •  1
  • Yu Chen little_birdie  · 技术社区  · 7 年前

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

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

    我对HDF不太熟悉,但我在复制这一声明时遇到了一些问题。我有一个叫 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_Smaller.csv 只有135MB,我的分区大小大大减小了:

    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
    

    不过,根据我的计算,应该有 ceiling(135 / 4) = 3 分区,不是4个。

    我在本地运行所有东西,在我的MacBook Pro上。有人能解释如何计算HDF的默认分区数吗?

    1 回复  |  直到 7 年前
        1
  •  4
  •   mazaneicha    7 年前

    Spark Programming Guide 以下内容:

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

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

    this excellent SO 有关如何确定HDFS文件拆分为的块数的方法。

    推荐文章