見出し画像

Spark 4.0では何が変わるのか? (前編)

Spark 4系のpreview release

2024/06/03 に spark 4.0 preview releaseがありました。

正式リリースの時期はまだわかりませんが、spark 3系と4系の何が違うのか、全然理解していないのでこの機会に整理したいと思います。

ちなみにspark 3系の時は、約7ヵ月後に正式releaseでした。

preview release - v1 : November 6, 2019
preview release - v2 : December 23, 2019
release : June 18, 2020
https://spark.apache.org/news/index.html

今回の前編では、

  • Spark Connect GA

  • ANSI SQL準拠機能のデフォルト有効化. 照合順序のサポート

に対する理解を深めたいと思います。
残りの変更点についても、後編以降で説明できればと思います。

Spark Connect

spark Connectは、クライアントアプリケーション毎に異なる方法で行っていたSpark サーバとの通信を、すべてspark Connect client API経由で行えるようにするためのプロトコルです。なお、Spark Connect自体は、3.4以降で利用可能であるため、4系で初めて利用できるようになる機能ではないです。
Spark Connectのネットワーク通信(client - server間通信)には、gRPCが使用されています。

spark connectを使った場合の内部動作は以下の通りです

  1. 通信の確立

    1. gRPCによりspark connect clientとspark serverとの接続を確立します。

  2. Dataframeのクエリを未解決の論理プランに変更します

    1. clientサイドでは、dataframe クエリを解析し、未解決の論理プランを作成します。

  3. 未解決の論理プランを、spark serverに送信します。

  4. spark server側では、これまでと同様に未解決の論理プランを最適化し、実行します。

今回のspark connectにより、1~3を特定の言語に依存しない形で、未解決の論理プランを生成し、論理プランをAPI経由でやり取りする方式をとっているため、spark serverとclientとの依存関係が切り離されています。そのため、Spark Connectを使用することで次のメリットが得られます。

  • clientとserver側のsparkのソフトウェアバージョンを別々に管理できる

    • 例えば、scala 2.13にserver側が対応した場合でも、client側のscala 2.12プロジェクトを更新せずに、実行することができます。プロジェクト内に、scala 2.13に対応したJARがないようなケースで、scala 2.13対応が難しいケースでも対応できます。

  • JVM以外の言語でSpark Connectクライアントを構築できる

    • そもそもclientとserver(spark driver)が分離しているため、pythonや、go、rustのspark connectクライアントが、Javaやsparkに依存せずに、spark connectクライアント経由でアプリケーションを実装できます。

例えば、pythonでsparkを扱う場合、これまではpysparkを使ってきましたが、spark connectでは、pysparkパッケージの代わりに、pyspark-connectパッケージを使います。

pip install pyspark-connect

まず驚きなのは、pyspark(約350MB)と比べて、pyspark-connect(1.5MB)は圧倒的に軽いです。pyspark-connectは、Pure python packageであり、JVMに依存しないためです。より具体的な使い方については、公式サイトにチュートリアルがあるので、参考にしてみてください。

  • その他のメリットとして、Spark connect経由でのリモート接続が容易になり、手元のIDEからのインタラクティブ実行やデバッグが容易になります。

一方で、デメリットも存在します。

  • 一部のSpark JVM APIに依存したコードは実行できないため、移行が必要になります。例えば、SparkContextRDDなどの APIについては、非推奨になっており、コードの移行が必要になります。

    • とはいえ、RDD APIなどの低レイヤのAPIは、特にデータ分析を業務として行う人にとっては、spark 固有の知識に依存した実装であり、コードの可読性、保守性も悪くなりがちのため、そうしたコードを一掃し、spark connectへ移行するのはとても良い機会ではないかと思います。

ANSI SQL準拠機能のデフォルト有効化. 照合順序のサポート

Spark 4.0ではANSI SQL準拠機能がデフォルトでオンになります。また、照合順序がサポートされています。

■spark.sql.ansi.enabled オプション

spark 3.5.1 では、default false (Hive準拠)でしたが、spark 4.0.0 からはdefault  true(ANSI SQL準拠)になります。spark 4.0.0に移行する際には、明示的に falseを指定するか、ANSI準拠に書き換える必要があるため注意してください。


■Collation support
https://issues.apache.org/jira/browse/SPARK-46830

  • 文字列の順序
    通常
    A < Z < a < z < Ā
    と認識しますが、以下の通り`COLLATE unicode`を使うことで、
    Ā < a <A < z < Z
    と認識されるようになります。

 SELECT name FROM names ORDER BY name COLLATE unicode; 
  • 大文字小文字を区別しない
    COLLATE unicode_ciを使用すると、'a'を大文字と小文字を区別せずに扱うことができます。

SELECT name FROM names WHERE startswith(name COLLATE unicode_ci, 'a') 
ORDER BY name COLLATE unicode_ci;
  • 拡張文字(ラテン文字など)を含めて、文字列を判定
    例)AtoZだけでなく、ラテン文字等も含めて、とにかく文字列で始まるレコードを抽出したい場合

SELECT name FROM names WHERE startswith(name COLLATE unicode_ci_ai, 'a') 
ORDER BY name COLLATE unicode_ci_ai;


今回の紹介は以上です。後編では残りの変更点についても、紹介していこうと思います。ボリュームがありそうなので、中編、後編にわけるかもしれません。参考になれば幸いです。

参考情報

 



いいなと思ったら応援しよう!