「なぜ Spark は遅いのですか??」という目を引くタイトルから始まりますが、Spark を「遅い」と呼ぶことはさまざまな意味を持つことに注意することが重要です。集計では遅いですか?データ読み込み?さまざまなケースが存在します。また、「Spark」は広義の用語であり、そのパフォーマンスはプログラミング言語や使用状況などの要素に依存します。それでは、本題に入る前に、より正確になるようにタイトルを調整しましょう。
私は主に Databricks 上の Python で Spark を使用するため、範囲をさらに絞り込みます。
洗練されたタイトルは次のようになります:
「Spark の第一印象: 「速いと聞いていたのに、なぜ遅く感じるの?」初心者の視点」
パンダ、NumPy、機械学習ライブラリを幅広く使っている私は、並列分散処理でビッグ データを処理できる Spark の機能の魅力に感心していました。ようやく仕事で Spark を使用できるようになったとき、パンダよりも遅いように見えるシナリオに困惑しました。何が問題だったのかよくわかりませんでしたが、いくつかの洞察を発見したので、それらを共有したいと思います。
Spark の基本アーキテクチャについて簡単に説明しましょう。
(クラスターモードの概要)
Spark クラスターは、実際の処理を実行する ワーカー ノード と、実行を調整および計画する ドライバー ノード で構成されます。このアーキテクチャは、以下で説明するすべてに影響を与えるため、覚えておいてください。
それでは、本題に入ります。
Spark は大規模なデータ処理用に最適化されていますが、小規模なデータセットも処理できます。ただし、このベンチマークを見てください:
(単一ノードマシンでの Apache Spark のベンチマーク)
結果は、15 GB 未満のデータセットでは、集計タスクにおいて pandas が Spark よりも優れていることを示しています。なぜ?一言で言えば、Spark の最適化によるオーバーヘッドが、小規模なデータセットの利点を上回ります。
リンクには、Spark が遅くないケースが示されていますが、これらは多くの場合 ローカル クラスター モード です。スタンドアロン設定の場合、ノード間のネットワーク通信のオーバーヘッドにより、データセットが小さいと不利になる可能性があります。
Spark は 遅延評価 を採用しています。これは、変換がすぐには実行されず、アクション (収集、カウント、表示など) が計算をトリガーするまで延期されることを意味します。
例 (パンダ):
df = spark.read.table("tpch.lineitem").limit(1000).toPandas() df["l_tax_percentage"] = df["l_tax"] * 100 for l_orderkey, group_df in df.groupby("l_orderkey"): print(l_orderkey, group_df["l_tax_percentage"].mean())
実行時間: 3.04 秒
Spark での同等物:
from pyspark.sql import functions as F sdf = spark.read.table("tpch.lineitem").limit(1000) sdf = sdf.withColumn("l_tax_percentage", F.col("l_tax") * 100) for row in sdf.select("l_orderkey").distinct().collect(): grouped_sdf = sdf.filter(F.col("l_orderkey") == row.l_orderkey).groupBy("l_orderkey").agg( F.mean("l_tax_percentage").alias("avg_l_tax_percentage") ) print(grouped_sdf.show())
実行時間: 3 分経ってもまだ実行中です。
なぜ?
Spark コードは、これをパンダで効果的に実行します。
for l_orderkey, group_df in df.groupby("l_orderkey"): df["l_tax_percentage"] = df["l_tax"] * 100 print(l_orderkey, group_df["l_tax_percentage"].mean())
Spark の キャッシュ を使用するか、ロジックを再構築して計算の繰り返しを最小限に抑えることで、このようなパターンを回避します。
https://spark.apache.org/docs/latest/rdd-programming-guide.html#shuffle-operations
シャッフルは、通常、groupByKey、結合、再分割などの操作中にデータがワーカー間で再分散されるときに発生します。シャッフルは次の理由で遅くなる可能性があります:
たとえば、ワーカーの数が増えても、シャッフル中のパフォーマンスが必ずしも向上するとは限りません。
これは役に立ちましたか? Spark は、効果的に使用すると優れたツールです。 Spark は、大規模なデータ処理を高速化するだけでなく、特にクラウドにおけるスケーラブルなリソース管理でも優れています。
データの運用と管理を最適化するために Spark をお試しください!
以上がSpark が遅いのはなぜですか??の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。