带有镶木地板和分区的Spark DataFrames

时间:2015-09-15 14:29:55

标签: apache-spark apache-spark-sql parquet

我一直无法找到关于这个主题的更多信息,但是我们假设我们使用数据框来读取镶木地板文件10块火花自然会创建10个分区。但是当数据帧读入文件以处理它时,它不会处理大数据与分区的比率,因为如果它正在处理未压​​缩的文件,则块大小会大得多,这意味着分区也会更大。

所以让我澄清一下,镶木地板压缩(这些数字并不完全准确)。 1GB Par = 5 Blocks = 5个可以解压缩到5GB的分区,使其成为25个块/ 25个分区。但是,除非你重新分区1GB par文件,否则最好只有5个分区,它将是25个分区?或者我的逻辑是错误的。

重新分区以提高速度会有意义吗?或者我在想这个错误。任何人都可以对此有所了解吗?

假设:

  • 1 Block = 1 Spark for Partition
  • 1核心在1分区上运行

2 个答案:

答案 0 :(得分:5)

Spark DataFrame不会在内存中加载镶木地板文件。它使用Hadoop / HDFS API在每次操作期间读取它。因此,最佳分区数取决于HDFS块大小(与Parquet块大小不同!)。

Spark 1.5 DataFrame将镶木地板文件分区如下:

  • 每个HDFS块1个分区
  • 如果HDFS块大小小于Spark镶木地板块大小中的配置,则将为多个HDFS块创建分区,例如分区的总大小不小于镶木地板块大小

答案 1 :(得分:0)

我看到了另一个答案,但我想我可以在此澄清更多。如果您正在从posix文件系统中读取Parquet,那么您可以通过在Spark中拥有更多工作人员来增加分区读数的数量。

但是为了控制进入工作者的数据的平衡,可以使用Parquet文件的分层数据结构,稍后在工作者中可以指向Parquet文件的不同分区或部分。这将使您可以根据数据集的域来控制应该向每个工作人员传输多少数据(如果通过平衡工作人员中的数据,则表示每个工作人员的相同批处理数据效率不高)。