DirectFileOutputCommitterはSpark 2.2.0で使用できなくなりました。これは、S3への書き込みに非常に長い時間がかかることを意味します(3時間対2分)。FileOutputCommitterのバージョンをに設定することでこれを回避できます。 2 in spark-これを行うことでシェル、
spark-Shell --conf spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2
同じことはspark-sqlでは機能しません
spark-sql --conf spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2
上記のコマンドはversion = 2を設定しているようですが、クエリを実行してもバージョン1の動作が表示されます。
2つの質問、
1)spark-sqlでFileOutputCommitterバージョン2の動作を取得するにはどうすればよいですか?
2)spark 2.2.0)でDirectFileOutputCommitterを引き続き使用できる方法はありますか?[データが欠落する可能性がゼロ以外でも問題ありません]
関連商品:
私はこの問題に見舞われました。 Sparkは、競合状態の場合にデータが失われる可能性があるため、DirectFileOutputCommitterの使用を推奨していません。アルゴリズムバージョン2はあまり役に立ちません。
いくつかの利点をもたらしたスナップ圧縮の代わりに、gzipを使用してデータをs3に保存しようとしました。
ここでの本当の問題は、sparkがs3://<output_directory>/_temporary/0
最初に、データを一時から出力にコピーします。このプロセスはs3ではかなり遅いです(通常6MBPS)。したがって、大量のデータを取得すると、かなりの速度低下が発生します。
別の方法は、最初にHDFSに書き込み、次にdistcp/s3distcpを使用してデータをs3にコピーすることです。
また、解決策を探すこともできます Netflix提供 。
私はそれを評価していません。
編集:
新しいspark2.4バージョンは、s3の書き込みが遅いという問題を解決しました。最新のEMRバージョン(5.24)でのhadoop 2.8を使用したspark2.4のs3書き込みパフォーマンスは、HDFS書き込みとほぼ同等であることがわかりました。
ドキュメントを見る