
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を使った場合の内部動作は以下の通りです
通信の確立
gRPCによりspark connect clientとspark serverとの接続を確立します。
Dataframeのクエリを未解決の論理プランに変更します
clientサイドでは、dataframe クエリを解析し、未解決の論理プランを作成します。
未解決の論理プランを、spark serverに送信します。
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に依存したコードは実行できないため、移行が必要になります。例えば、SparkContext やRDDなどの 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;
その他
contains、startsWith、endsWithなどの、照合順序が関わる便利な文字列関数も追加されています。
https://issues.apache.org/jira/browse/SPARK-47131
今回の紹介は以上です。後編では残りの変更点についても、紹介していこうと思います。ボリュームがありそうなので、中編、後編にわけるかもしれません。参考になれば幸いです。
参考情報