【Hadoop】macOS に YARN 上の Spark 実行環境を構築

今回は macOS で Standalone Mode ではない YARN上の Spark 実行環境を構築するメモです。

  • macOS: 10.12.1
  • Java: 1.8.0_111
  • Apache Hadoop: 2.7.3
  • Apache Spark: 2.0.2

Apache Hadoop 2.7.3

JDKがなければインストールする。

$ java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode) 

Hadoop2.7.3 をインストールする。

$ wget https://apache.mirrors.tds.net/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz
$ tar zxvf ~/tmp/hadoop-2.7.3.tar.gz -C /usr/local/

source からビルドする場合は以下。

$ brew update
$ brew install bzip2 lz4 snappy openssl

環境変数をセットする。

export OPENSSL_ROOT_DIR=$(brew --prefix openssl)
export OPENSSL_INCLUDE_DIR=$OPENSSL_ROOT_DIR/include/
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
export HADOOP_HOME=/usr/local/hadoop-2.7.3
export HADOOP_PREFIX=$HADOOP_HOME
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_COMMON_LIB_NATIVE_DIR"

source を取得しビルドする。数回エラーが起きたが対応した。 (対応の詳細はこのページの最後に)

$ git clone https://github.com/apache/hadoop.git
$ cd hadoop
$ git checkout rel/release-2.7.3
$ mvn package -Pdist,native -DskipTests -Dtar -Dmaven.javadoc.skip=true

...
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:56 min
[INFO] Finished at: 2016-11-23T11:56:10+09:00
[INFO] Final Memory: 85M/755M
[INFO] ------------------------------------------------------------------------

$ cp -r ~/tmp/hadoop/hadoop-dist/target/hadoop-2.7.3 /usr/local/

native hadoop の確認。 bzip2 が false になっているが取り敢えず先に進む。

$ hadoop checknative -a
2016-11-23 20:10:42,375 WARN  [main] bzip2.Bzip2Factory (Bzip2Factory.java:isNativeBzip2Loaded(73)) - Failed to load/initialize native-bzip2 library system-native, will use pure-Java version
2016-11-23 20:10:42,406 INFO  [main] zlib.ZlibFactory (ZlibFactory.java:(49)) - Successfully loaded & initialized native-zlib library
Native library checking:
hadoop:  true /usr/local/hadoop-2.7.3/lib/native/libhadoop.dylib
zlib:    true /usr/lib/libz.1.dylib
snappy:  true /usr/local/lib/libsnappy.1.dylib
lz4:     true revision:99
bzip2:   false
openssl: false build does not support openssl.
2016-11-23 20:10:42,463 INFO  [main] util.ExitUtil (ExitUtil.java:terminate(124)) - Exiting with status 1

この時点で /usr/local/ 以下に hadoop-2.7.3 が展開されている状態とする。念のため設定ファイルを hadoop-backup に移しておく。

$ mv /usr/local/hadoop-2.7.3/etc/hadoop /usr/local/hadoop-2.7.3/etc/hadoop-backup
$ mkdir /usr/local/hadoop-2.7.3/etc/hadoop
$ cp /usr/local/hadoop-2.7.3/etc/hadoop-backup/core-site.xml /usr/local/hadoop-2.7.3/etc/hadoop/
$ cp /usr/local/hadoop-2.7.3/etc/hadoop-backup/hdfs-site.xml /usr/local/hadoop-2.7.3/etc/hadoop/
$ cp /usr/local/hadoop-2.7.3/etc/hadoop-backup/yarn-site.xml /usr/local/hadoop-2.7.3/etc/hadoop/
$ cp /usr/local/hadoop-2.7.3/etc/hadoop-backup/capacity-scheduler.xml /usr/local/hadoop-2.7.3/etc/hadoop/
$ cp /usr/local/hadoop-2.7.3/etc/hadoop-backup/hadoop-env.sh /usr/local/hadoop-2.7.3/etc/hadoop/

試しに起動するための設定を書く。

$ vim /usr/local/hadoop-2.7.3/etc/hadoop/core-site.xml
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
</property>

$ vim /usr/local/hadoop-2.7.3/etc/hadoop/hdfs-site.xml
<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>

$ vim /usr/local/hadoop-2.7.3/etc/hadoop/yarn-site.xml
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>

HDFS の NameNode が管理するメタデータを初期化する。

$ hdfs namenode -format

Hadoop を起動する。

/usr/local/hadoop-2.7.3/sbin/hadoop-daemon.sh --config /usr/local/hadoop-2.7.3/etc/hadoop start datanode
/usr/local/hadoop-2.7.3/sbin/hadoop-daemon.sh --config /usr/local/hadoop-2.7.3/etc/hadoop start namenode
/usr/local/hadoop-2.7.3/sbin/yarn-daemon.sh --config /usr/local/hadoop-2.7.3/etc/hadoop start resourcemanager
/usr/local/hadoop-2.7.3/sbin/yarn-daemon.sh --config /usr/local/hadoop-2.7.3/etc/hadoop start nodemanager
/usr/local/hadoop-2.7.3/sbin/mr-jobhistory-daemon.sh --config /usr/local/hadoop-2.7.3/etc/hadoop start historyserver

プロセスを確認する。

$ jps
83763 NameNode
83971 Jps
83938 JobHistoryServer
83879 NodeManager
83702 DataNode
83822 ResourceManager

localhost:50070にアクセスすると HDFS の状態を確認できる。

hadoop-web-ui

Apache Spark 2.0.2

Spark 2.0.2 をダウンロードして展開する。

$ wget https://d3kbcqa49mib13.cloudfront.net/spark-2.0.2-bin-hadoop2.7.tgz
$ tar zxvf ~/tmp/spark-2.0.2-bin-hadoop2.7.tgz -C /usr/local/

spark-env.sh に 先ほどの Hadoop 設定を指定しておく。

$ vim /usr/local/spark-2.0.2-bin-hadoop2.7/conf/spark-env.sh
#!/usr/bin/env bash

HADOOP_CONF_DIR=/usr/local/hadoop-2.7.3/etc/hadoop

master に YARN を指定して起動する。

$ /usr/local/spark-2.0.2-bin-hadoop2.7/bin/pyspark --master yarn
Python 2.7.12 (default, Nov 19 2016, 15:10:12)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel).
16/11/23 19:39:25 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
16/11/23 19:39:43 WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.0.2
      /_/

Using Python version 2.7.12 (default, Nov 19 2016 15:10:12)
SparkSession available as 'spark'.
>>>

localhost:8088 にアクセスすると YARN 上で動いている Spark などの Applications が確認できる。

spark-on-yarn

Sparkのログレベルがインストール時は INFO に設定されている。好み次第ではあるが, 共有環境でなければ以下で書き換えログ出力を抑えた方が良いかもしれない。

$ cat $SPARK_HOME/conf/log4j.properties.template | sed 's/INFO/WARN/' > $SPARK_HOME/conf/log4j.properties

共有環境の場合でも別途 log4j.properties を作っておき, spark-submit 実行時に渡すこともできる。

$ spark-submit --driver-java-options '-Dlog4j.configuration=file:"/home/user/tmp/log4j.properties"'

A. Hadoop の build 時の対応

対応するバージョンの Protocol buffers のインストール。

$ brew tap homebrew/versions
$ brew install protobuf250
$ brew link --force --overwrite protobuf250
$ protoc --version
libprotoc 2.5.0

cmake を DL しインストール。

$ sudo ln -s "/Applications/CMake.app/Contents/bin/cmake" /usr/local/bin/cmake
$ cmake --version
cmake version 3.8.0


[1] Spark Quick Start
[2] OSXで擬似分散モードのApacheHadoop2.7.0を動かす
[3] Hadoop native libraries not found on OS/X