Mac上でのspark-sqlのセットアップ手順
Mac上にspark-sqlをセットアップする手順のメモを残しておきます。
このメモは、以下手順でhiveのセットアップが完了している前提で説明します。
Mac上でのhiveセットアップ手順(mysql上にmetastoreを作成) http://takemikami.com/2016/04/20/Machivemysqlmetastore.html
このメモで説明する流れです。
- apache-sparkのセットアップ
- spark-sqlの実行
- spark-shellからのhql実行
apache-sparkのセットアップ
インストール
以下のコマンドでsparkをインストールします。
$ brew install apache-spark
以下のコマンドで、インストール出来たことを確認します。
$ spark-sql --help
metastoreの設定
sparkからhiveのmetastoreを参照するために、
以下のように、hiveの設定ファイル「hive-site.xml」をspark配下にコピーします。
$ cp $(brew --prefix hive)/libexec/conf/hive-site.xml $(brew --prefix apache-spark)/libexec/conf/hive-site.xml
spark-sqlの実行
spark-sqlの実行
以下のコマンドでapark-sqlを実行します。
metastoreにmysqlを利用するので、mysql-connectorのjarを指定します。
$ spark-sql --driver-class-path $(brew --prefix hive)/libexec/lib/mysql-connector-java-5.1.38-bin.jar
これでhiveと同じようにhqlを実行することができます。
driver-class-pathオプションの指定を省略
毎回「driver-class-path」オプションを指定するのも面倒なので、
sparkのdefaultパラメータにjarファイルのパスを指定します。
以下のようにして、「spark-defaults.conf」にjarファイルのパスを指定します。
$ echo "spark.driver.extraClassPath $(brew --prefix hive)/libexec/lib/mysql-connector-java-5.1.38-bin.jar" > $(brew --prefix apache-spark)/libexec/conf/spark-defaults.conf
これで、以下のようにオプション無しでspark-sqlを起動しても、
mysql上のmetastoreを参照できるようになります。
$ spark-sql
# spark.driver.extraClassPathオプションについては、以下を参照。
# Spark Configuration
# http://spark.apache.org/docs/latest/configuration.html
ログの出力を抑制する
デフォルトの状態だと、
コンソールに多数のログが出力され結果が見にくいので、ログの出力を抑制します。
以下のように、log4jの設定ファイルのテンプレートをコピーします。
$ cp $(brew --prefix apache-spark)/libexec/conf/log4j.properties.template $(brew --prefix apache-spark)/libexec/conf/log4j.properties
次に「log4j.properties」の以下の行を変更します。
log4j.properties 変更前:
log4j.rootCategory=INFO, console
log4j.properties 変更後:
log4j.rootCategory=WARN, console
この変更を行った後、spark-sqlを実行すると、ログ出力が抑制されているのが確認出来るはずです。
spark-shellからのhql実行
spark-shellから、hiveのクエリを実行してみます。
以下のように、spark-shellを起動します。
$ spark-shell
以下のように、spark-shell上でHiveContextを生成します。
scala> import org.apache.spark.sql.hive.HiveContext
scala> val hiveContext = new HiveContext(sc)
以下のように、HiveContextのsqlメソッドでHQLを与えるとdataframeが返却されます。
scala> val df = hiveContext.sql("select * from <テーブル名> limit 10")
scala> df.show()