Apache Sparkで追加のパッケージ(Mavenリポジトリにあるもの)を利用したいときに、configの設定が必要になるときがあるので自分用にメモ。
1. Mavenパッケージ
Mavenリポジトリ上のパッケージ情報はgroupId
、artifactId
、version
の3つの要素からなるらしい。(Maven coordinatesというらしい)
Sparkのconfigに渡すときはこれらを:
でつないで、groupId:artifactId:version
の文字列にしたものを用意する。
複数のパッケージを渡したいときはこれらを,
でつないで、groupId1:artifactId1:version1,groupId2:artifactId2:version2,groupId3:artifactId3:version3
のようにする。
2. configの設定
設定ファイルに書いておいて常に適用されるようにしておくとか、コードの中で呼び出すなど様々な方法がある。
自分がやったことのある方法について記す。
2-1. コードの中でSparkSessionに渡す
例1:
from pyspark.sql import SparkSession
# configメソッドを使い、"spark.jars.packages"の項目を設定する
spark = SparkSession \
.builder \
.config("spark.jars.packages", "graphframes:graphframes:0.8.0-spark3.0-s_2.12") \
.getOrCreate()
例2(複数パッケージを指定):
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.config(
"spark.jars.packages",
"graphframes:graphframes:0.8.0-spark3.0-s_2.12,org.postgresql:postgresql:42.2.14"
) \
.getOrCreate()
簡易的に使ってみるときや設定ファイルを汚したくないときによくやる。
Spark UI(ローカルで動かしているときは http://localhost:4040 など)の'Environment'などを確認すると、jarファイルが追加されているのが確認出来る。
2-2. spark-defaults.confに記入
Apache Sparkのインストール場所を$SPARK_HOME
とすると、おそらく$SPARK_HOME/conf/spark-defaults.conf
に以下の設定を追記すればOK
(なお、同じディレクトリ上にspark-defaults.conf.default
みたいなテンプレートファイルがあるはず)
# 以下を追記
spark.jars.packages graphframes:graphframes:0.8.0-spark3.0-s_2.12,org.postgresql:postgresql:42.2.14
こうしておくと、SparkSession生成時にconfigを設定しなくてもデフォルトで設定される。
2-3. その他
やったことがあるのは主に上記の2つだが、
Sparkはconfigの設定方法が色々あるようなので、他のやり方もある。
アプリケーションとしてspark-submit
を使って実行するような場合はここなどを参考に、spark-submit
のオプション:--packages
を使って設定出来るはず。
あるいは、bashなどのCLIでpyspark --packages groupId:artifactId:version
とかspark-shell --packages groupId:artifactId:version
などとすると、configにpackage情報を渡した状態でpyspark
やspark-shell
のセッションを開始出来る。
Sparkは多機能でカバーできていない部分がまだ沢山あるので、他にもやりようがあるかもしれない。
あとがき
2-1と2-2はjarの追加方法というより、一般的なconfigの設定方法な気がしてきた