新しいことにはウェルカム

技術 | 電子工作 | ガジェット | ゲーム のメモ書き

Spark(Google Dataproc)からMySQLにアクセスする方法

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ファイルをダウンロードしています。

クラスター作成

Spark(Google Dataproc)からMySQLにアクセスする方法

  • 初期化アクション
    • 先程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ファイルを読み込ませます

利用例

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以上にした方がいいです。

参考記事