在s3中持续使用SPARK DF,并在文件名前缀中随机哈希



AWS优化Amazon S3中性能的最佳实践是在文件名之前或作为一部分的三个或四个字符的随机哈希前缀。

我想在S3中持续使用Parquet或orc格式的数据框,并且目前正在使用df.write()方法。我正在寻找一种在Spark中生成每个 part 文件的随机前缀的方法。

在树上有字段值时,它会变得复杂,例如

visits/year=2017/month=08/day=22/.....orc.snappy visits/year=2016/month=08/day=22/.....orc.snappy 如果您要查询一个月或一天,您的所有工作都集中在同一S3碎片上。

您真的希望每年都有随机性=,月=也许= day =这样,事情就会散布更多 visits/_34ac_year=2017/_aba1_month=08/_13df_day=22 visits/_76a3_year=2016/_bc00_month=08/_7f02_day=22

您不仅需要更改保存上的分区结构,而且还需要在负载上进行处理,以便当您通过early year = 2017个月= 08进行查询时,这些随机炭被剥离。问题不是在保存上产生随机性:那是这些查询。

截至2017年9月,我不知道在Raw Spark中做到这一点;也许Qubole在那里有一个故事。

说实话,如果您真的达到极限,我会感到惊讶,因为AWS对它的反应方式正在向503个例外发送。如果您使用的是S3A客户端,则会看到堆栈跟踪,因为它不会做退缩&重试(尚未)[更新:8-sept-2017:显然已达到限制]

您可以做:

import scala.util.Random
df.write.format("com.databricks.spark.csv")
  .save(s"myFile_${Random.alphanumeric take 10 mkString("")}")

最新更新