使用文件名前缀中的随机哈希在S3中保留Spark df

时间:2017-09-07 12:34:26

标签: apache-spark amazon-s3 amazon-emr

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

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

2 个答案:

答案 0 :(得分:1)

你可以这样做:

import scala.util.Random

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

答案 1 :(得分:1)

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

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

您不仅需要在保存时更改分区结构,还要在加载时对其进行处理,以便在查询年份= 2017月= 08时,删除这些随机字符。问题不是在保存上产生随机性:它是那些查询。

截至2017年9月,我所知道的任何事情都不会产生火花;也许Qubole有一个故事。

说实话,如果你真的达到极限,我会感到惊讶,因为AWS对它做出反应的方式是发回503例外。如果您使用的是S3a客户端,您将看到堆栈跟踪,因为它没有进行退避和放大。重试那些(还)[更新:2017年9月8日 - 显然达到了极限]