メインコンテンツへジャンプ

2023年のPySpark:1年を振り返って

Share this post

2023年にリリースされたApache Spark 3.4と3.5で、私たちはPySparkのパフォーマンス、柔軟性、使いやすさの改善に重点を置きました。 このブログ記事では、主な改善点をご紹介します。

2023年にApache Spark 3.4と3.5で追加された最も重要な機能の概要です:

  • Spark Connectは、任意のアプリケーションからSparkクラスタへのリモート接続を可能にする、クライアントとサーバーを分離したアーキテクチャを導入しています。 これにより、サービスとしてのSparkは、安定性、アップグレード可能性、可観測性を高めながら実現されます。
  • Arrowに最適化されたPythonユーザー定義関数(UDF)では、Arrowのカラムナーフォーマットを活用することで、通常のPython UDFの2倍のパフォーマンスを実現し、飛躍的な効率の向上を示しました。
  • Pythonのユーザー定義テーブル関数(UDTF)により、ユーザーはPySparkでネイティブにテーブルベースの変換を実行できるようになりました。
  • GROUP BY ALLやORDER BY ALLなどのSpark SQLの新機能が導入されました。これらはすべてPySparkからネイティブに使用できます。
  • Pythonの任意のステートフル処理は、ストリーミングクエリで任意の状態を維持する機能を提供します。
  • TorchDistributorは、Apache Sparkクラスタ上でのPyTorchの分散学習をサポートします。
  • 新しいテスト用APIは、PySparkアプリケーションの効果的なテストを可能にし、開発者が高品質なコードを作成できるようにします。
  • English SDKは、平易な英語による指示をPySparkやSQLに変換し、開発者の生産性を向上させる、LLMを利用したプログラミングへのアプローチです。

次のセクションでは、これらの各項目について検証し、さらに注目すべき改善点をいくつかご紹介します。

Apache Spark 3.5と3.4:機能ディープダイブ

Spark Connect:Apache Sparkのリモート接続

Spark ConnectはApache Spark 3.4でデビューし、クライアントとサーバーを分離したアーキテクチャを導入することで、任意の場所で実行されているアプリケーションからSparkクラスタへのリモート接続を可能にしました。 このようにクライアントとサーバーを分離することで、最新のデータアプリケーション、IDE、ノートブック、プログラミング言語がインタラクティブにSparkにアクセスできるようになります。 さらに、非結合アーキテクチャにより、安定性、アップグレード性、デバッグ性、可観測性が向上します。

Apache Spark 3.5ではScalaのサポートが完了し、Structured Streaming (SPARK-42938)、ML と PyTorch (SPARK-42471)、Pandas API on Spark (SPARK-42497) などの主要な Spark コンポーネントのサポートも完了しました。

Databricks Connectを使用してDatabricks上のSpark ConnectまたはApache Spark用のSpark Connectを直接開始します。

Arrow最適化Python UDF:Python UDFのパフォーマンス向上

Arrow-optimized Python UDFs (SPARK-40307)は、Arrowのカラムナーフォーマットを活用することで、パフォーマンスの大幅な最適化を可能にします。 例えば、同じクラスタ内でUDFを連鎖させた場合、32GBのデータセットでArrow最適化Python UDFはpickle Python UDFよりも1.9倍高速に実行されます。

Python UDTFs

Python UDTFs

Apache Spark 3.5では、PySparkのUDFサポートをユーザー定義テーブル関数で拡張しました。 一度登録されると、SQLクエリのFROM句に表示することができます。 例えば、以下のUDTF SquareNumbers は、入力とその2乗値を表として出力します:

from pyspark.sql.functions import udtf

@udtf(returnType="num: int, squared: int")
class SquareNumbers:
    def eval(self, start: int, end: int):
        for num in range(start, end + 1):
            yield (num, num * num)
from pyspark.sql.functions import lit

SquareNumbers(lit(1), lit(3)).show()

+---+-------+
|num|squared|
+---+-------+
|  1|      1|
|  2|      4|
|  3|      9|
+---+-------+

SQLの新機能

PySparkの大きな利点の1つは、Spark SQLがPySpark DataFramesとシームレスに動作することです。 2023年にSpark SQLは多くの新機能を導入し、PySparkはspark.sqlを介してGROUP BY ALL および ORDER BY ALL、一般的なテーブル値関数のサポート、INSERT BY NAME、PIVOTおよびMELT、ANSI コンプライアンスなどを直接活用できるようになりました。 以下はGROUP BY ALLと ORDER BY ALLの使用例です:

spark.sql("""
    SELECT name, firstname, level, sum(comp) as totalcomp 
    FROM {table}
    GROUP BY ALL
    ORDER BY ALL
""", table=df)

Pythonによる任意のステートフル処理

Structured StreamingにおけるPythonの任意のステートフル操作は、ストリーミングクエリの実行にまたがるステート処理を可能にすることで、PySparkにおける膨大な数のリアルタイム分析や機械学習のユースケースの障害を取り除きます。 次の例は、任意のステートフル処理を示しています:

# Group the data by word, and compute the count of each group
output_schema = "session STRING, count LONG"
state_schema = "count LONG"
sessions = events.groupBy(events["session"]).applyInPandasWithState(
    func,
    output_schema,
    state_schema,
    "append",
    GroupStateTimeout.ProcessingTimeTimeout,
)

# Start running the query that prints the windowed word counts to the console
query = sessions.writeStream.foreachBatch(
    lambda df, _: df.show()).start()

TorchDistributor:PyTorchのネイティブ統合

TorchDistributorはPySparkでPyTorchのネイティブサポートを提供し、Sparkクラスタ上でのディープラーニングモデルの分散学習を可能にします。 PyTorchのプロセスを開始し、配布の仕組みはPyTorchに任せ、プロセスが調整されていることを確認するためだけに機能します。

スパーククラスター

TorchDistributorの使い方は簡単で、いくつかの主な設定があります:

from pyspark.ml.torch.distributor import TorchDistributor

model = TorchDistributor(
    num_processes=2,
    local_mode=True, 
    use_gpu=True,
).run(<function_or_script>, <args>)

テストAPI:PySpark DataFramesのテストがより簡単に

pyspark.testing パッケージの新しいテスト API (SPARK-44042) は、PySpark アプリケーションをテストする開発者に大きな機能拡張をもたらします。詳細なエラーメッセージを含む、等式テストのためのユーティリティ関数を提供し、DataFrameスキーマとデータの不一致の特定を容易にします。 下の出力例はそれを示しています:

*** actual ***
  Row(name='Amy', languages=['C++', 'Rust'])
! Row(name='Jane', languages=['Scala', 'SQL', 'Java'])

*** expected ***
  Row(name='Amy', languages=['C++', 'Rust'])
! Row(name='Jane', languages=['Scala', 'Java'])

English SDK:プログラミング言語としての英語

English SDK for Apache Sparkは、ユーザーが平易な英語で指示を入力し、それをPySparkとSpark SQLのコードに変換することで、Apache Sparkの使用を簡素化します。 これにより、特にDataFrameの変換操作、データの取り込み、UDFに関連するコードでPySparkプログラミングがより身近になり、キャッシュのおかげで生産性がさらに向上します。 English SDKは、開発プロセスを合理化し、コードの複雑さを最小限に抑え、Sparkコミュニティの裾野を広げる大きな可能性を秘めています。 ご自身で試してみてください!

その他の注目すべき改善点

Apache Spark 3.4と3.5で導入されたその他の機能のうち、まだご存知でなければ調べてみると良いでしょう:

振り返りと今後

2023年、オープンソースコミュニティの活発なイノベーションにより、PySparkとApache Sparkの両方が大幅に強化され、データ専門家が利用できるツールキットの幅が広がり、分析ワークフローが合理化されました。 Apache Spark 4.0の登場を目前に控え、PySparkは新機能と性能の向上を通じてデータ処理にさらなる革命を起こす態勢を整え、データエンジニアリングとデータサイエンスのコミュニティにおけるデータ分析の推進へのコミットメントを再確認しています。

新機能のご紹介

この投稿では、PySparkの使いやすさ、パフォーマンス、柔軟性を強化するために2023年にApache Spark 3.4と3.5で行われた最も重要な改善の概要を簡単に説明しました。 これらの機能はすべてDatabricks Runtime 13および14で利用可能です。

Databricks 無料トライアル

関連記事

Apache Spark™ 3.5のご紹介

翻訳:Junichi Maruyama. - Original Blog Link 本日、Databricks Runtime 14.0の一部として、Databricks上でApache Spark™ 3.5が利用可能になったことを発表いたします。Spark 3.5のリリースに多大な貢献をしていただいたApache Sparkコミュニティに深く感謝いたします。 Sparkをこれまで以上にアクセスしやすく、多用途で効率的なものにするという我々のミッションに沿った今回のアップデートには、以下のような新機能と改良が盛り込まれています: The English SDK for Apache Spark enables users to...

Apache Spark™ 3.4 for Databricks Runtime 13.0の紹介

Original Blog : Introducing Apache Spark™ 3.4 for Databricks Runtime 13.0   (翻訳: junichi.maruyama ) 本日、 Databricks Runtime 13.0 の一部として、Databricks上で Apache Spark™ 3.4...
業界一覧へ