在s3上创建临时文件夹的Spark Dataset Parquet分区

时间:2018-02-01 23:51:43

标签: hadoop apache-spark amazon-s3 spark-dataframe apache-spark-dataset

Spark (version=2.2.0)没有DirectParquetOutputCommitter。作为替代方案,我可以使用

dataset
    .option("mapreduce.fileoutputcommitter.algorithm.version", "2")//magic here
    .parquet("s3a://...")

以避免在_temporary上创建S3文件夹。

在我将partitionBy设置为数据集

之前,一切正常
dataset
    .partitionBy("a", "b")
    .option("mapreduce.fileoutputcommitter.algorithm.version", "2")//magic stop working creating _temporary on S3
    .parquet("s3a://...")

还尝试添加但无法正常工作

spark.conf.set("mapreduce.fileoutputcommitter.algorithm.version", "2")

在Spark数据集中使用partitionBy,它将创建_temporary并移动文件,这将成为一个非常慢的操作。

有任何替代或缺失的配置吗?

2 个答案:

答案 0 :(得分:2)

Hadoop 3.1的s3a将内置零重命名提交者(va HADOOP-13786)。在此之前,您可以使用其前体is from netflix

请注意,“算法2”不是消除_temp目录的神奇步骤,只是在单个任务提交时将任务输出直接重命名为目标。如果目录列表中的延迟一致性仍然容易出错,并且仍然是O(数据)。您不能安全地直接使用S3的v1或v2提交者,而不能使用Hadoop 2.x中的S3A连接器

答案 1 :(得分:0)

替代方案(按推荐顺序+轻松 - 最佳排名):

  1. 使用Netflix的S3Committer:https://github.com/rdblue/s3committer/
  2. 写入HDFS,然后复制到S3(例如通过s3distcp)
  3. 不要使用partitionBy,而是迭代所有分区排列并将结果动态写入每个分区目录
  4. 编写自定义文件提交者