如何在追加新数据时避免从S3读取旧文件?

时间:2016-11-27 14:40:49

标签: amazon-s3 emr amazon-emr parquet bigdata

在2小时内,火花作业正在运行,将一些tgz文件转换为镶木地板。 该工作将新数据附加到s3中的现有镶木地板中:

df.write.mode("append").partitionBy("id","day").parquet("s3://myBucket/foo.parquet")

在spark-submit输出中,我可以看到花在阅读旧镶木地板文件上的大量时间,例如:

  

16/11/27 14:06:15 INFO S3NativeFileSystem:Opening's3://myBucket/foo.parquet/id=123/day=2016-11-26/part-r-00003-b20752e9-5d70- 43f5-b8b4-50b5b4d0c7da.snappy.parquet'供阅读

     

16/11/27 14:06:15 INFO S3NativeFileSystem:密钥流   'foo.parquet / ID = 123 /天= 2016年11月26日/部分-R-00003-e80419de-7019-4859-bbe7-dcd392f6fcd3.snappy.parquet'   寻求定位'149195444'

看起来这个操作每个文件只需不到1秒,但文件数量会随着时间的推移而增加(每个附加内容会添加新文件),这让我觉得我的代码无法扩展。

如果我只需要添加新数据,如何避免从s3中读取旧的镶木地板文件?

我使用EMR 4.8.2和DirectParquetOutputCommitter:

sc._jsc.hadoopConfiguration().set('spark.sql.parquet.output.committer.class', 'org.apache.spark.sql.parquet.DirectParquetOutputCommitter')

1 个答案:

答案 0 :(得分:3)

我通过将数据帧写入EMR HDFS然后使用s3-dist-cp将parquets上传到S3来解决了这个问题