2小時後,spark工作正在運行,將一些tgz文件轉換爲實木複合地板。 作業新數據追加到現有的實木複合地板在S3:如何避免在追加新數據時從S3中讀取舊文件?
df.write.mode("append").partitionBy("id","day").parquet("s3://myBucket/foo.parquet")
在火花提交輸出,我可以看到顯著的時間花費在閱讀舊地板的文件,例如:
16/11/27 14:06:15信息S3NativeFileSystem:打開'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信息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')