本日は Hive on Tez の話をしようと思いましたが,昨日の記事 の中でも触れられている Spark かつ SQL on Hadoop である SparkSQL on YARN の話に話題を変更してお届けします.
SparkSQL とは
名前通り,Spark をランタイムとした SQL インタフェースです.デザインの特徴として,SparkDSL との親和性と,Hive の Metastore, SerDe, UDF 互換性が保たれているという点があげられます.SparkSQL のドキュメントとしては,以下のものがあります:
Spark on YARN での HiveQL 互換クエリの動かし方
ここからは,Hadoop 2 クラスタを既に持っている方のために,Spark on YARN における Spark の動作のさせ方について説明します.なお,今回の説明ではディストリビューション固有の説明は行いません.
Spark 側の設定
あなたの利用している Hadoop2 系クラスタが Spark ダウンロードページに存在しない場合,Spark のソースコードをダウンロードしてきて Spark をビルドする必要があります.例えば,最新版である Hadoop 2.5.2 や 2.6.0 を利用しようとした場合は以下のような手順で Spark をビルドします.
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
tar xzvf spark-1.1.1.tgz
cd spark
./make-distribution.sh --tgz -Phadoop-2.4 -Pyarn,hive,hive-thriftserver -Dhadoop.version=2.5.2
すると,spark-.tgz が生成されるのでこれを解凍し,Spark の設定ファイル(conf/spark-env.sh, conf/spark-defaults.conf)を記述します.この設定ファイルには,Spark 起動時のデフォルトの設定を記述します.
spark-env.sh は,Spark on YARN 起動に必須の設定を行います.特に,HADOOP_CONF_DIR の設定は必須になるので気をつけてください.HADOOP_CONF_DIR は,YARN の設定ファイル(yarn-site.xml)および hdfs の設定ファイル(hdfs-site.xml)がある場所をポイントします.
# Options read in YARN client mode
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
# - SPARK_EXECUTOR_INSTANCES, Number of workers to start (Default: 2)
# - SPARK_EXECUTOR_CORES, Number of cores for the workers (Default: 1).
# - SPARK_EXECUTOR_MEMORY, Memory per Worker (e.g. 1000M, 2G) (Default: 1G)
# - SPARK_DRIVER_MEMORY, Memory for Master (e.g. 1000M, 2G) (Default: 512 Mb)
# - SPARK_YARN_APP_NAME, The name of your application (Default: Spark)
# - SPARK_YARN_QUEUE, The hadoop queue to use for allocation requests
# - SPARK_YARN_DIST_FILES, Comma separated list of files to be distributed with the job.
# - SPARK_YARN_DIST_ARCHIVES, Comma separated list of archives to be distributed with the job.
HADOOP_CONF_DIR=/home/ozawa/hadoop/etc/hadoop/
SPARK_EXECUTOR_INSTANCES=16
SPARK_EXECUTOR_MEMORY=4G
SPARK_DRIVER_MEMORY=2G
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.shuffle.manager SORT
spark.shuffle.consolidateFiles true
spark.shuffle.spill true
SparkSQL を起動する
SparkSQL を起動してみましょう.
$ bin/spark-sql --master yarn-client
--master yarn-client を渡すことで,YARN の設定を読み込み,Spark の Application Master が立ち上がります.
spark-sql >
SparkSQL 上では,Hive 互換クエリを実行することができます.external table を使ってデータをロードみましょう.
spark-sql > create external table if NOT EXISTS text100GB(text string) location 'hdfs:///user/ozawa/text';
ここまでで前準備は完了で,この table に対して,HiveQL クエリを実行することができるようになりました.あとは Hive と同じ要領で HiveQL を記述することが可能です.
SparkSQL の現状
Hive 0.12 ベースで作られていることも影響しているのか,Hive で動くクエリの一部は parse error になったりします.一方で,Hive on Spark という取り組みも行われており,互換性や既存ツールとの統合の面では Hive on SQL に一日の長がありまそうです.
どちらが普及してくるのか,見るのが楽しみな状況にありますので,適宜共有できればと思います.