2017-07-28 40 views
0

隨着像 df.write.csv("s3a://mybucket/mytable")df.write.csv("s3a://mybucket/mytable") 我很明白知道哪裏寫文件/對象,但由於S3的最終一致性保證,我不能100%確定從該位置獲取列表將返回所有(甚至是任何)剛剛寫入的文件。如果我能得到剛纔寫的文件/對象列表,那麼我可以爲Redshift COPY命令準備一個清單文件,而不用擔心最終的一致性。這是可能的 - 如果是這樣的話?是否有可能在DataFrame寫入時檢索文件列表,或者是否有火花將其存儲在某個地方?

回答

1

spark-redshift庫可以爲您處理此問題。如果你想自己做,你可以看看他們是如何在這裏做到這一點:https://github.com/databricks/spark-redshift/blob/1092c7cd03bb751ba4e93b92cd7e04cffff10eb0/src/main/scala/com/databricks/spark/redshift/RedshiftWriter.scala#L299

編輯:我避免對一致性的更多擔心通過df.coalesce(fileCount)輸出已知數量的文件部分(紅移你想多您的羣集中的切片)。然後,您可以檢查Spark代碼中列出了多少個文件,以及Redshift stl_load_commits中加載了多少個文件。

+0

這仍在調用FileSystem.listStatus(),因此易受S3列表不一致性的影響。 –

+0

添加關於使用'coalesce()'輸出已知文件數的注意事項 –

+1

擔心spark-redshift庫選擇忽略問題,但需要一些有趣的解決方法。感覺Spark應該真的有一個功能,可以通過驅動程序寫出一個清單 - 一個文件,而不是工作人員的目錄;那將解決這個問題。 – SourceSimian

0

很好意識到一致性風險;您可以通過延遲創建可見性和已找到的已刪除對象在列表中找到它。 AFAIK,無法獲取創建的文件列表,因爲它的任務可以在任務中生成他們想要的任何內容到任務輸出目錄,然後將其編組(通過列表和複製)到最終輸出目錄中,

在S3上面沒有一致性層(S3mper,s3guard等)的情況下,您可以讀&旋轉「稍微」一點,以便讓分片追上。我對「一點點」的好價值不知道。

但是,如果您打電話給fs.write.csv(),可能是因爲在用於將任務輸出傳播到作業目錄的提交程序中列出不一致而被捕獲;這是通過列表+複製在S3A中完成的,請參閱。

+0

爲什麼選票?我錯了什麼?如果我告訴細節,我會糾正它。 –

+0

我不知道爲什麼你得到了downvote,你提供了很多關於我不知道存在的一致性層的很好的信息(我只知道EMRFS)。儘管你最後一句話看起來像是在句子中間結束了。 – SourceSimian

相關問題