web-dev-qa-db-ja.com

EMR / Sparkからの非常に遅いS3書き込み時間

Spark EMRでの実行からS3書き込み時間を高速化する方法を誰かが知っているかどうかを確認するために書いています。

My Sparkジョブの完了には4時間以上かかりますが、クラスターは最初の1.5時間だけ負荷がかかります。

enter image description here

Sparkがこの間ずっとやっていたことを知りたい。ログを見て、各ファイルに1つずつ、多くのs3 mvコマンドを見つけた。それからS3 Iを直接見てすべてのファイルが_ temporaryディレクトリにあることを確認してください。

第二に、クラスタコストが心配です。この特定のタスクのために2時間のコンピューティングを購入する必要があるようです。しかし、私は5時間まで購入することになります。 EMR AutoScalingがこのような状況でコストを削減できるかどうか、私は興味があります。

ファイル出力コミッタアルゴリズムの変更についての記事もありますが、私はそれでほとんど成功していません。

sc.hadoopConfiguration.set("mapreduce.fileoutputcommitter.algorithm.version", "2")

ローカルHDFSへの書き込みは迅速です。 hadoopコマンドを発行してデータをS3にコピーする方が速いのではないかと思っています。

enter image description here

21
jspooner

表示されているのは、outputcommitterとs3の問題です。コミットジョブは_temporaryフォルダーに_fs.rename_を適用します。S3は名前変更をサポートしていないため、単一の要求が_temporaryからすべてのファイルを最終的な宛先にコピーおよび削除することを意味します。

sc.hadoopConfiguration.set("mapreduce.fileoutputcommitter.algorithm.version", "2")は、hadoopバージョン> 2.7でのみ機能します。コミットタスクではなく_temporaryから各ファイルをコピーし、ジョブをコミットしないので、分散されて非常に高速に動作します。

Hadoopの古いバージョンを使用する場合、Spark 1.6を使用し、以下を使用します。

_sc.hadoopConfiguration.set("spark.sql.parquet.output.committer.class","org.Apache.spark.sql.parquet.DirectParquetOutputCommitter")
_

*スペキュレーションをオンにしたり、追加モードで書き込んだりすると機能しません。

**また、Spark 2.0(algorithm.version = 2に置き換えられました)で廃止されていることに注意してください。

私のチームでは、実際にSpark= HDFSに書き込み、実稼働環境でDISTCPジョブ(特にs3-dist-cp)を使用してファイルをS3にコピーしますが、これはいくつかの他の理由(一貫性、フォールトトレランス)ので、それは必要ありません。

14
Tal Joffe

ダイレクトコミッターは、障害に対して回復力がないため、sparkから引き出されました。使用することを強くお勧めします。

Hadoop、s3guardでは、0 =名前変更コミッターを追加する作業が進行中です。これはO(1)およびフォールトトレラントです; HADOOP-13786 に注意してください。

今のところ「マジックコミッター」を無視すると、Netflixベースのステージングコミッターが最初に出荷されます(hadoop 2.9?3.0?)

  1. これにより、タスクコミットでローカルFSに作業が書き込まれます
  2. コミットされていないマルチパートのput操作を発行してデータを書き込みますが、データを具体化しません。
  3. 元の「アルゴリズム1」ファイル出力コミッターを使用して、PUTをHDFSにコミットするために必要な情報を保存します
  4. HDFSのファイル出力コミットを使用して、完了するPUTとキャンセルするPUTを決定するジョブコミットを実装します。

結果:タスクのコミットにはデータ/帯域幅が数秒かかりますが、ジョブのコミットには、宛先フォルダーで1-4回のGETを実行する時間と、保留中のファイルごとにPOST 。

この作業のベースとなるコミッター、つまり netflix を選択し、おそらくspark今日。ファイルコミットアルゴリズムを1に設定する必要があります。デフォルトである)または実際にデータを書き込むことはありません。

6
Steve Loughran

spark=を使用してs3に書き込み、パフォーマンスの問題が発生しました。主な理由はsparkゼロバイトパーツファイルを大量に作成して置換することでした。一時ファイルを実際のファイル名にすると、書き込みプロセスが遅くなりました。

  1. spark=の出力をHDFSに書き込み、Hiveを使用してs3に書き込みます。Hiveが作成するパーツファイルの数が少ないため、パフォーマンスは大幅に向上しました。 、セキュリティ上の理由により、ポリシーの削除アクションがprod envで提供されませんでした。

  2. spark HDFSへの出力とローカルへのコピーされたhdfsファイルおよびs3へのデータのプッシュへのaws s3コピーの使用。このアプローチで2番目に良い結果が得られました。Amazonでチケットを作成し、これを使用することを提案しました1。

  3. S3 dist cpを使用して、HDFSからS3にファイルをコピーします。これは問題なく機能していましたが、パフォーマンスはありませんでした

5
Vikrame

spark出力に何が表示されますか?多くの名前変更操作が表示される場合は、 this を読んでください。

1
Niros

AzureでSparkを使用して同じことを経験しました。そうするツール:hadoop copyFromLocal hdfs:// wasb:// HDFSは、WASB(またはS3)にアーカイブする前の一時バッファーです。

0

あなたが書いているファイルもどれくらいの大きさですか? 1つのコアが非常に大きなファイルに書き込むと、ファイルを分割して複数のワーカーが小さなファイルを書き出すよりもはるかに遅くなります。

0
Ted