在文件名前缀中使用随机散列在 S3 中持久保存 Spark df

Persist Spark df in S3 with random hash in file name prefix

AWS best practices 用于优化 Amazon S3 中的性能的方法是在文件名之前或作为文件名的一部分使用三个或四个字符的随机哈希前缀。

我想在 S3 中保留 Parquet 或 ORC 格式的数据帧,我目前正在使用 df.write() 方法。我正在寻找一种在 spark 中为每个 part 文件生成随机前缀的方法,该文件是为每个分区编写的。

你可以这样做:

import scala.util.Random

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

当树中有字段值时,它会变得复杂,例如

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

你真的想要每年以上的随机性=,月=也许日=这样事情就会分散得更多 visits/_34ac_year=2017/_aba1_month=08/_13df_day=22 visits/_76a3_year=2016/_bc00_month=08/_7f02_day=22

您不仅需要在保存时更改分区结构,还需要在加载时对其进行处理,这样当您在 year=2017 month=08 上进行查询时,这些随机字符将被删除。问题不是在保存时产生随机性:而是那些查询。

截至 2017 年 9 月,据我所知,在原始火花中没有这样做;也许 Qubole 那里有故事。

老实说,如果您真的达到了极限,我会感到惊讶,因为 AWS 的反应方式是发回 503 异常。如果您使用的是 S3a 客户端,您会看到堆栈跟踪,因为它不会对这些进行退避和重试(尚未)[更新:2017 年 9 月 8 日:显然已达到限制]