Spark(SQLを使用)で読み込んでいる寄木細工のファイルが1つしかないため、100パーティションで処理したいのですが、spark.default.parallelism
を100に設定してみました。また、寄木細工の圧縮をなし(gzipから)に変更してみました。sparkジョブの最初のステージで何をしても、(シャッフルが発生すると、 100に再分割され、その後は明らかにはるかに高速です)。
いくつかのソース(以下のような)によると、寄木細工は(gzipを使用している場合でも)分割可能である必要があるため、私は非常に混乱しており、いくつかのアドバイスが大好きです。
私はspark 1.0.0を使用しており、どうやらspark.sql.shuffle.partitions
のデフォルト値は200であるため、それは不可能です。実際、並列処理のすべてのデフォルトは1よりもはるかに大きいため、何が起こっているのかわかりません。
あなたはより小さなブロックサイズで寄木細工のファイルを書くべきです。デフォルトはブロックあたり128Mbですが、ライターでparquet.block.size
構成を設定することで構成できます。
ParquetOuputFormatのソースはここにあります (詳細を調べたい場合)。
ブロックサイズは、論理的に読み取り可能な寄木細工のファイルから読み取ることができるデータの最小量です(寄木細工は円柱状であるため、行で分割することはできませんか、このような単純なものにすることはできません)。入力ブロックより。
あなたは寄木細工への書き込み中に配布を制御したいと述べました。 RDDから寄木細工を作成すると、寄木細工はRDDのパーティションを保持します。そのため、RDDを作成し、100のパーティションを指定し、パーケット形式のデータフレームから指定すると、100の個別のパーケットファイルがfsに書き込まれます。読み取りの場合は、spark.sql.shuffle.partitions
パラメータを指定できます。
多分あなたの寄木細工のファイルは1つのHDFSブロックだけをとります。多くのHDFSブロックを持つ大きな寄木細工のファイルを作成し、それをロードします
val k = sc.parquetFile("the-big-table.parquet")
k.partitions.length
HDFSブロックと同じ数のパーティションが表示されます。これは私にとってはうまくいきました(spark-1.1.0)
新しいやり方(Spark 2.x)が
spark.sql.files.maxPartitionBytes
ソース: https://issues.Apache.org/jira/browse/SPARK-17998 (公式ドキュメントはまだ正しくありません。sqlがありません)
私の経験から、Hadoop設定はもはや効果がありません。
これを実現するには、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つのパーティションがあります。