2017-07-28 3 views
0

df.write.csv("s3a://mybucket/mytable") 私は明らかにファイル/オブジェクトが書かれている場所を知っていますが、S3の最終的な一貫性の保証のために、その場所からリストを取得するとすべての(または任意の)作成したばかりのファイルの私がファイル/オブジェクトのリストを手に入れたら、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)を使用して既知の数のファイル部分を出力することで、一貫性についてさらに心配する必要はありません(Redshiftの場合、複数のクラスタ内のスライスの数)。次に、Sparkコードに表示されているファイルの数と、Redshift stl_load_commitsにロードされているファイルの数を確認できます。

+0

。 –

+0

注() '出力に知られているファイルは –

+1

が火花赤方偏移ライブラリは、問題を無視することを選択したことを心配、しかし、いくつかの興味深いの回避策カウント'合体の使用に関する追加しました。それは、スパークが実際にマニフェストを書くことができる機能を持っているように思えます - ドライバを介して単一のファイルに、ワーカーからのディレクトリではなく、それはこの問題を解決するだろう。 – SourceSimian

0

これは、一貫性のリスクを認識することが良いことです。遅れて作成された可視性と削除されたオブジェクトがまだ見つかっているリストでそれを得ることができます。

AFAIK、タスクの出力ディレクトリに必要なものをタスクが生成できる場所として、作成されたファイルのリストを取得することはできません。リストアおよびコピーによってマーシャリングされ、最終出力ディレクトリ

になります。 S3(S3mper、s3guard、など)の上の一貫性層が存在しない場合には

、あなたは破片が追いつくことを可能にするために、「ビット」の&スピンを読むことができます。私は「ちょっと」の良い価値が何であるかについて、良い考えを持っていません。

しかし、fs.write.csv()を呼び出すと、タスク出力をジョブディレクトリに伝播するために使用されたコミッタ内の不整合をリストすることで捕捉された可能性があります。それはS3Aでリスト+コピーを介して行われています。まだ、)(S3リスト矛盾するので、脆弱FileSystem.listStatusを呼んだ

+0

なぜ投票?どうしたの?私は詳細を伝えれば修正します。 –

+0

あなたはdownvoteを得た理由を私は知らない、私は(私はEMRFSのだけ知っていた)は考えが存在しなかった一貫性層についての良い多くの情報を提供しました。あなたの最後の文章では、あなたが中文を終えたように見えます。 – SourceSimian

関連する問題