Spark - 高效的密钥分区,您可以组合分区方法吗?

时间:2018-04-30 13:21:26

标签: apache-spark hdfs spark-dataframe parquet

我在HDFS中有一个木地板文件,大小约为1tb。目前,数据是通过默认方法进行分区的(不知道这是什么 - 我之前认为它是散列分区的)但是下一步需要使用“guid”列相互连接行,所以我正在寻找最佳的分区实现。我目前对低效率的定义是数据集的大量改组以进行上述连接,并且在1tb的镶木地板目录中有大约79k个文件,每个分区大约13mb。重新启动可能是一个简单的初始胜利(我继承了这个数据集 - 没有设置它)但我认为某种形式的guid分区会更好,因为我目前的分区工作知识

我对什么是一个好分区的理解:

  • 应在列密钥上对数据进行分区,该列密钥将用于进一步聚合以最小化混洗
  • 分区大小应该在128mb左右,因为它似乎被广泛认为是“甜蜜点”大小

数据是时间序列,因此按日期分区是一个好的开始,但我需要在其中进行分区以便以后的操作(使用guid)。我正在考虑按日期划分,并在guid上使用rangePartitioner。

我的问题:

  1. 这甚至可能吗?我现在正在设置rangePartition,但我在网上看不到组合partitionByKey和rangePartitioner的实例?
  2. guids不会进行偶数分区。有些人会有比其他人更多的行。我希望rangePartitioner会有所帮助,但不能保证。是否有任何可以在密钥上动态分区以最大限度地平衡分区大小的东西?我的目标是每个分区128mb,所以必须使用一些启发式/估计来尽可能接近。
  3. 最后 - 如果/当我将更多数据附加到分区文件时,该数据是否遵循相同的分区方法?
  4. 表格示例:

    //============[]======[]===========[]====================\\
    ||    Date    || Guid || SubGuidID || Misc Other columns ||
    |]============[]======[]===========[]====================[|
    || 2018-04-30 ||    1 ||         1 || x                  ||
    || 2018-04-30 ||    1 ||         2 || y                  ||
    || 2018-04-30 ||    2 ||         1 || z                  ||
    \\============[]======[]===========[]====================//
    

0 个答案:

没有答案