Spark(Google Dataproc)から、MySQLにアクセスする方法です。
JDBCを使ってアクセスするので、PostgreSQL等、他のRDBにも応用可能です。
手順
Spark設定
下記のSparkの設定をすると、SparkからMySQLのデータの読み書きができるようになります。
- MySQLのJDBCのjarファイルをダウンロードします
- SparkにJDBCのjarファイルを読み込みます
- 「spark-defaults.conf」の「spark.jars」にjarファイルのパスを設定します
- SparkのClassPathにJDBCのjarファイルを設定します
- 「spark-defaults.conf」の「spark.driver.extraClassPath」にjarファイルのパスを設定します
Dataproc設定
Dataproceはマネージドサービスのため、Sparkを直接いじることができません。
代わりに、Dataproceの「クラスタープロパティ」と「初期化アクション」を使って、 クラスター作成時にSparkの設定します。
事前に、MySQLのJDBCのjarファイルを、Google Cloud Storageにアップしておきます。
下記の初期化アクションを作って、Google Cloud Storageにアップします。
init_action.sh
#!/bin/bash JAR_PATH=/usr/local/lib/jars mkdir $JAR_PATH # JDBC MySQL JDBC_MYSQL=mysql-connector-java-8.0.16.jar gsutil cp gs://xxxx/xxxx/$JDBC_MYSQL $JAR_PATH/
初期化アクションでは、Sparkに追加するjarファイルの置き場所を作って、StorageにアップしたJDBCのjarファイルをダウンロードしています。
クラスター作成
- 初期化アクション
- 先程Google Cloud Storageにアップした初期化アクションファイルを指定します
- クラスター作成時に、このアクションが実行されます
- プロジェクトアクセス
- チェックを入れる
- 初期化アクションで、StorageからJDBCのjarファイルをダウンロードしているため、クラスターにStorageへのアクセス権限を付与します
- クラスタプロパティ
- [spark]:[spark.jars]:[/usr/local/lib/jars/*]
- 「spark」でSparkの設定「spark-defaults.conf」を設定します
- 「spark.jars」「/usr/local/lib/jars/*」で、SparkにJDBCのjarファイルを読み込ませます
- [spark]:[spark.driver.extraClassPath]:[/usr/local/lib/jars/*]
- 「spark」でSparkの設定「spark-defaults.conf」を設定します
- 「spark.driver.extraClassPath」「/usr/local/lib/jars/*」で、SparkにClassPass情報として、JDBCのjarファイルを読み込ませます
- [spark]:[spark.jars]:[/usr/local/lib/jars/*]
利用例
options = { "url":"jdbc:mysql://<server>:3306/<db_name>", "driver":"com.mysql.jdbc.Driver", "dbtable":"<table_name>", "user":"xxxx", "password":"xxxx" } df = spark.read.format("jdbc").options(**options).load() df.show()
その他感想等
読み書き両方が可能です。
タイムアウトになりやすいので、「spark-defaults.conf」の「spark.executor.heartbeatInterval」と「spark.network.timeout」を 長めに設定した方がいいかと思います。
Spark2.4以降なら、「dbtable」の代わりに「query」として、クエリでデータを取得できて便利なので、 イメージはSpark2.4が使えるバージョン1.4以上にした方がいいです。
参考記事
- https://stackoverflow.com/questions/32958311/spark-adding-jdbc-driver-jar-to-google-dataproc
- https://stackoverflow.com/questions/52046004/how-do-i-connect-spark-to-jdbc-driver-in-zeppelin
- http://mogile.web.fc2.com/spark/sql-data-sources-jdbc.html