web-dev-qa-db-ja.com

寄木細工のファイルをSparkの多くのパーティションに分割する方法は?

Spark(SQLを使用)で読み込んでいる寄木細工のファイルが1つしかないため、100パーティションで処理したいのですが、spark.default.parallelismを100に設定してみました。また、寄木細工の圧縮をなし(gzipから)に変更してみました。sparkジョブの最初のステージで何をしても、(シャッフルが発生すると、 100に再分割され、その後は明らかにはるかに高速です)。

いくつかのソース(以下のような)によると、寄木細工は(gzipを使用している場合でも)分割可能である必要があるため、私は非常に混乱しており、いくつかのアドバイスが大好きです。

https://www.safaribooksonline.com/library/view/hadoop-application-architectures/9781491910313/ch01.html

私はspark 1.0.0を使用しており、どうやらspark.sql.shuffle.partitionsのデフォルト値は200であるため、それは不可能です。実際、並列処理のすべてのデフォルトは1よりもはるかに大きいため、何が起こっているのかわかりません。

16
samthebest

あなたはより小さなブロックサイズで寄木細工のファイルを書くべきです。デフォルトはブロックあたり128Mbですが、ライターでparquet.block.size構成を設定することで構成できます。

ParquetOuputFormatのソースはここにあります (詳細を調べたい場合)。

ブロックサイズは、論理的に読み取り可能な寄木細工のファイルから読み取ることができるデータの最小量です(寄木細工は円柱状であるため、行で分割することはできませんか、このような単純なものにすることはできません)。入力ブロックより。

9
C4stor

あなたは寄木細工への書き込み中に配布を制御したいと述べました。 RDDから寄木細工を作成すると、寄木細工はRDDのパーティションを保持します。そのため、RDDを作成し、100のパーティションを指定し、パーケット形式のデータフレームから指定すると、100の個別のパーケットファイルがfsに書き込まれます。読み取りの場合は、spark.sql.shuffle.partitionsパラメータを指定できます。

1
Ruslan Pelin

多分あなたの寄木細工のファイルは1つのHDFSブロックだけをとります。多くのHDFSブロックを持つ大きな寄木細工のファイルを作成し、それをロードします

val k = sc.parquetFile("the-big-table.parquet")
k.partitions.length

HDFSブロックと同じ数のパーティションが表示されます。これは私にとってはうまくいきました(spark-1.1.0)

1
suztomo

新しいやり方(Spark 2.x)が

spark.sql.files.maxPartitionBytes

ソース: https://issues.Apache.org/jira/browse/SPARK-17998 (公式ドキュメントはまだ正しくありません。sqlがありません)

私の経験から、Hadoop設定はもはや効果がありません。

1
F Pereira

これを実現するには、SparkContextを使用してHadoop構成(sc.hadoopConfiguration)プロパティmapreduce.input.fileinputformat.split.maxsize

このプロパティをhdfs.blockSizeよりも低い値に設定すると、分割数と同じ数のパーティションが取得されます。

例えば:
いつ hdfs.blockSize = 134217728(128MB)、
そして、ちょうど1つの完全なブロックを含む1つのファイルが読み込まれ、
およびmapreduce.input.fileinputformat.split.maxsize = 67108864(64MB)

次に、それらの分割が読み込まれる2つのパーティションがあります。

0
Prokod