Help us understand the problem. What is going on with this article?

SparkSQL を YARN 上で動作させる

More than 5 years have passed since last update.

本日は 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)がある場所をポイントします.

spark-env.sh
# 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-defaults.conf
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 に一日の長がありまそうです.
どちらが普及してくるのか,見るのが楽しみな状況にありますので,適宜共有できればと思います.

oza_x86
A programmer.
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away