「start_pyspark_shell」コマンドを使用して Spark シェルを開始し、cli オプションを - 4 つのエグゼキューター、エグゼキューターあたり 2 コア、ワーカー ノード用に 4 GB のメモリ、マスター用に 4 GB として指定しています。
ストレージ: HDFS
入力ファイル: サイズ 221.3 MB (HDFS では 2 ブロック) の圧縮 .csv.gz ファイル &
Spart バージョン: 2.4.0
当面のタスクは、ファイル内のレコード数をカウントする単純なものです。唯一の問題は、圧縮ファイルであることです。を使用してファイルをロードしました
df = spark.read.format("com.databricks.spark.csv").load(hdfs_path)
私が実行したときdf.count()
、単一のエグゼキュータ タスクがあり、おそらく期待されている (?) ことがわかりました。これは、分割可能ではなく、単一のパーティションで操作される圧縮ファイルで作業しているためですか?
パーティションの数を確認したdf.rdd.getNumPartitions()
ところ、おそらく予想どおり 1 が返されました。
同じコマンドを複数回実行した場合、処理時間は約 15 ~ 17 秒でした。
ここで、上記の処理にはあまり並列性がなかったと結論付けることができると思いますか?
df.repartition(10).count()
データが 10 個の新しいパーティションに再分割され、おそらく複数のワーカー ノードに分割されることを期待して、試してみました。TASKS の数が、指定したパーティションの数に従っていることがわかりました。実行時間の面でパフォーマンスが向上することを期待していました。25〜26秒になりました。
を使用.repartition(20)
したときは、4 分以上実行されていたため、強制終了する必要がありました。
パフォーマンスが低下します。何か間違ったことをしたり、パフォーマンスを向上させるためのステップを逃したりしませんでしたか?
注:これに関するいくつかの優れた既存の投稿を見ましたが、まだ明確にはなりませんでした. したがって、新しいクエリを投稿します。