Ubuntu 14.04でSparkを試してみた時のメモ

Spark 1.3.0がリリースされたらしいです。

Spark Release 1.3.0 | Apache Spark

でも、いかんせんSpark使ったことなくてよくわかりません。とりあえずインストールくらいはしてみるか、と思ってやったときのメモ。

※いろいろ試して動いたのをまとめてるだけなので、必要な手順が足りてなかったり、関係ない手順が入ってるかもです。あんまり理解できてません。。

Hadoopをインストールする

参考:Apache Hadoop 2.6.0 - Hadoop MapReduce Next Generation 2.6.0 - Setting up a Single Node Cluster.

何はともあれ、まずはHadoopをインストールしてsingle-nodeで動かします。この記事を書く時点での最新バージョンは2.6.0でした。

とりあえずJavaを入れます。

sudo apt-get install openjdk-7-jdk

ミラーのリストから近そうなところをえらんでアーカイブを落としてきます。

wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz

# 展開
tar xf hadoop-2.6.0.tar.gz
sudo mv hadoop-2.6.0 /usr/local/hadoop

# パスを通す
echo 'export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin' >> .bashrc
source .bashrc

hadoopを起動するときには環境変数JAVA_HOMEが参照されます。よくわかりませんが.bashrcとかに書いただけではうまく引き継がれず、/usr/local/hadoop/etc/hadoop/hadoop-env.shに書かないといけないっぽいです。

ということで、元々書いてある行をコメントアウトして書き加えます。(ここで固定のパスを書いてしまうとJavaのバージョンを変えた時にまずい、という話もありますがとりあえず試すだけなので気にしないことにします)

# The java implementation to use.
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/jre

あと、sshでログインするときパスワードを聞かれないように、鍵の設定をしておきます。

# すでに鍵があるなら不要。ないならつくる。
mkdir -p ~/.ssh
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

試しに動かしてみるために、/usr/local/hadoop/etc/hadoop/core-site.xml<configuration>タグの間に以下を書き加えます。

<property>
   <name>fs.default.name</name>
   <value>hdfs://localhost:9000</value>
</property>

で、hdfsを起動してみます。

start-dfs.sh

これがエラーなく起動すれば問題ないはずです。止めます。

stop-dfs.sh

Sparkを動かす

参考:Quick Start - Spark 1.3.0 Documentation

今回は、Hadoop 2.4以降用にビルドされたSparkを使います。ミラーサイトのリストから一番近そうなところを選んでダウンロードしてきます。

wget http://ftp.tsukuba.wide.ad.jp/software/apache/spark/spark-1.3.0/spark-1.3.0-bin-hadoop2.4.tgz

# 展開
tar xf spark-1.3.0-bin-hadoop2.4.tgz

このまま起動すると、INFOレベルのログが出まくって見づらいので、log4j.propertiesを用意します。テンプレートをコピーして書き換えるだけです。

cd /spark-1.3.0-bin-hadoop2.4

cp conf/log4j.properties.template log4j.properties
vi log4j.properties

この部分をINFOからWARNにします。

# Set everything to be logged to the console
#log4j.rootCategory=INFO, console
log4j.rootCategory=WARN, console

いよいよ起動してみます。Scalaよく分からないのでPythonの方を使ってみます。

$ bin/pyspark
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
15/03/15 03:27:51 WARN Utils: Your hostname, test resolves to a loopback address: 127.0.1.1; using 10.0.3.70 instead (on interface eth0)
15/03/15 03:27:51 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
15/03/15 03:27:52 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 1.3.0
      /_/

Using Python version 2.7.6 (default, Mar 22 2014 22:59:56)
SparkContext available as sc, HiveContext available as sqlCtx.
>>> 

例にあるのを試してみます。

>>> textFile = sc.textFile("README.md")
>>> textFile.count()
98
>>> textFile.first()
u'# Apache Spark'
>>> textFile.map(lambda line: len(line.split())).reduce(lambda a, b: a if (a > b) else b)
14

なんか動いてるっぽいのでとりあえずよしとします。