web-dev-qa-db-ja.com

Spark parquet partitioning:多数のファイル

sparkパーティショニングを活用しようとしています。私は次のようなことをしようとしていました

data.write.partitionBy("key").parquet("/location")

ここでの問題は、パーティションごとに膨大な数の寄木細工ファイルを作成するため、ルートディレクトリから読み取ろうとすると読み取りが遅くなります。

それを避けるために私は試しました

data.coalese(numPart).write.partitionBy("key").parquet("/location")

ただし、これにより、各パーティションにnumPart個の寄木細工ファイルが作成されます。今、私のパーティションサイズは異なります。 SO理想的には、パーティションごとに個別の合体を行いたいと思います。ただし、これは簡単なことではありません。すべてのパーティションを特定の数に合体して、別の場所に保存する必要があります。

書き込み後に多くのファイルを避けるために、どのようにパーティションを使用する必要がありますか?

26

最初にcoalesceの使用を実際に避けます。これはしばしば変換のチェーンでさらに押し上げられ、ジョブの並列性を破壊する可能性があるためです(この問題についてここで質問しました: どのようにSpark最適化

寄木細工のパーティションごとに1つのファイルを書き込むことは、実際には簡単です( 多数の小さなファイルを書き込むSparkデータフレームの書き込み方法 を参照)。

data.repartition($"key").write.partitionBy("key").parquet("/location")

任意の数のファイル(またはすべて同じサイズのファイル)を設定する場合は、使用できる別の属性を使用してデータをさらにパーティション分割する必要があります(これがあなたのケースに何があるかはわかりません)。

data.repartition($"key",$"another_key").write.partitionBy("key").parquet("/location")

another_keyは、データセットの別の属性、または既存の属性に対してモジュロ演算または丸め演算を使用した派生属性にすることができます。 row_number over keyでウィンドウ関数を使用して、次のように丸めることもできます。

data.repartition($"key",floor($"row_number"/N)*N).write.partitionBy("key").parquet("/location")

これにより、Nレコードが1つの寄せ木細工ファイルになります。

orderByを使用

データフレームを適切に並べ替えることで、再パーティション化せずにファイルの数を制御することもできます。

data.orderBy($"key").write.partitionBy("key").parquet("/location")

これにより、すべてのパーティションで合計spark.sql.shuffle.partitionsになります(デフォルトでは200)。寄木細工はデータフレームの順序を記憶し、それに応じて統計情報を書き込むため、$keyの後に2番目の順序列を追加することも有益です。たとえば、IDで注文できます。

data.orderBy($"key",$"id").write.partitionBy("key").parquet("/location")

これはファイルの数を変更しませんが、特定のkeyおよびidの寄木細工ファイルを照会するときのパフォーマンスを改善します。例参照 https://www.slideshare.net/RyanBlue3/parquet-performance-tuning-the-missing-guide および https://db-blog.web.cern.ch/blog/luca-canali/2017-06-diving-spark-and-parquet-workloads-example

Spark 2.2 +

Spark 2.2以降では、新しいオプションmaxRecordsPerFileを使用して、ファイルごとのレコード数を制限することもできます。 N個のパーティションがある場合でも、少なくともN個のファイルを取得できますが、1つのパーティション(タスク)によって書き込まれたファイルをより小さいチャンクに分割できます。

df.write
.option("maxRecordsPerFile", 10000)
...

例参照 http://www.gatorsmile.io/anticipated-feature-in-spark-2-2-max-records-written-per-file/ and spark write with disk with N Nパーティション未満のファイル

38
Raphael Roth