夜行録 - 酔歩.net

Calendar

< January 2016 >
MonTueWedThuFriSatSun
123
45678910
11121314151617
18192021222324
25262728293031

Sunday, 31.01.16

osx で spark を動かす

必要なもの

jdk
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html から拾ってきてインストール(8u72 (1.8.0_72))
spark
http://spark.apache.org/downloads.html からダウンロードして、適当なところに展開(spark-1.6.0-bin-without-hadoop.tgz)。
hadoop
https://hadoop.apache.org/releases.html からダウンロードして、適当なところに展開(hadoop-2.7.1.tar.gz)。

環境変数

## Hadoop
export PATH=$HOME/data/hadoop-2.7.1/bin:${PATH}
export JAVA_HOME=`/usr/libexec/java_home`

## Spark
export PATH=$HOME/data/spark-1.6.0-bin-without-hadoop/bin:${PATH}
export SPARK_DIST_CLASSPATH=`hadoop classpath`
export HADOOP_CONF_DIR=$HOME/data/hadoop-2.7.1/etc/hadoop

osxでJAVA_HOMEを適切に設定するには、/usr/libexec/java_homeを用いると簡便で良い。 うっとおしいので、spark-1.6.0-bin-without-hadoop/conf/log4j.propertiesを作成し、 log4j.rootCategory=WARN, consoleとしておく。

osxの場合、普通に実行すると snappy が云々という例外投げられて死ぬ。これは

  1. Sparkは通信の為にデータを圧縮する
  2. 幾つかのコーデックが使えるがデフォルトがsnappy
  3. osxのjava環境にはこれがない(pure javaではなくnative libraryが必要)

pyspark --driver-java-options -Dspark.io.compression.codec=lzfとするとエラーとならない

env PYSPARK_PYTHON=ipython-2.7 pyspark --driver-java-options -Dspark.io.compression.codec=lzf --master 'local[*]'として、iPython-2.7 をフロントエンドに、pythonから4並列でデータ処理ができた。

sparkが面白い

話題になってから半年遅れくらいだが、やっと時間が取れて試してみた。

python のフロントエンドがあるわけだが、これをむしろ spark のフロントエンドではなく python に対して spark の RDD が追加されたものと考えると大変使いやすくてよい。

もともと python で分散処理させようと思ったら multiprocssing あたりで明示的に書いてやらないとだめだったところが、 見かけ上一つのオブジェクトである RDD に処理を割り当てて実行すれば、勝手に裏で分散処理される。
しかもノード間でも分散できる、と考えると python で上手くできてなかったところをきれいに埋めてるように見える。

R も分散処理苦手だった気がするけど、 python + RDD でデータ解析環境とすると今時点では最強なんじゃないだろうか?

  1. hadoopのクラスライブラリは必要だが、hadoop自体は動いている必要はない
  2. yarnに投げなくても、sshが通れば自前でクラスタ構築できる(standalone mode)
  3. 1ノードでも、コアの数で分散処理ができる
  4. iPython とも連携できる