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()