Sparkでjarファイルからプログラムを実行する
前回 でSparkの擬似分散環境構築とインタラクティブシェル上からのプログラム実行まで行ったので、今回はjarファイルからのプログラム実行を行います。
環境
- CentOS6.6
- CDH 5
- IntelliJ IDEA 14
参考サイト
- http://qiita.com/imaifactory/items/823caa33639196f5459a
- http://kubotti.hatenablog.com/entry/2015/10/02/160104
Sparkアプリケーションの開発環境構築
SparkはIntelliJでの開発が推奨らしいので、今回はIntelliJを使います。IntelliJのインストール及びSBTプラグインのインストールは省略します。
SBTプロジェクト作成
- File->New->Project
- SBTを選択
sbt-assemblyのインストール
SparkでJARファイルを実行する場合は、単独ファイルで起動可能なJARにする事は推奨されています。なのでsbt-assemblyを使ってJARを作成します。
sbt 0.13.6以降なら以下の1行をplugin.sbtに追加するだけでOKです。それ以前の場合はhttps://github.com/sbt/sbt-assembly#setupを参考にしてください。
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.0")
build.sbtに依存ライブラリを記述
Sparkの依存ライブラリをbuild.sbtに記述します。注意点として同じライブラリの複数バージョンへの参照が発生した場合sbt assembly
実行時にエラーが出るので、Merge Strategyを記述する必要があります。自分の環境では以下のbuild.sbtで動きました。
プログラム及びJARファイル作成
プログラム作成
今回は、S3からファイルを取得してWordCountするシンプルなプログラムを書きました。
gzファイルも勝手に解凍してくれるのは便利ですね。あとアクセスキーは環境変数にExportしても動きます。
JARファイル生成
IntelliJのSBT Consoleを起動し、assemly
コマンドを実行。SUCCESSが出ればOK
> assembly . . . [success] Total time: 14 s, completed 2015/11/10 18:56:04
Spark上でJARファイルを実行
JARファイルを任意の場所に置き、以下のコマンドを実行。
sudo -u hdfs spark-submit --master "local" --class sample.Sample1 /path/to/YourProgram.jar
以下のように結果が出力されれば成功です。
. . . total lines: 4646 Lines with Dog: 3446, Lines with Cat: 567
ちなみにyarn-clientモードでの実行だと以下のようなコマンドになります。
sudo -u hdfs spark-submit \ --class sample.Sample1 \ --master yarn-client \ --driver-memory 1g \ --executor-memory 1g \ --executor-cores 1 \ /path/to/YourProgram.jar
終わり
今回はここまでにします。次回はyarn-clusterモードでの実行かSpark Streamingの実行を試す予定です。
CentOS+CDH5でSparkの擬似分散環境を作る
日本シリーズが終わってしまったのでSparkをやります。今年中に何とかSparkを実用できるところまで持って行きたいです。
参考サイト
- http://dmtolpeko.com/2015/02/06/installing-and-running-spark-on-yarn/
- http://datasciesotist.hatenablog.jp/entry/2014/05/10/225809
- http://stackoverflow.com/questions/27299923/how-to-load-local-file-in-sc-textfile-instead-of-hdfs
環境
- CentOS6.6
- CDH 5
Scalaのインストール
Javaのインストールは省略します。
wget http://downloads.typesafe.com/scala/2.11.7/scala-2.11.7.tgz tar xvf scala-2.11.7.tgz mv scala-2.11.7 /usr/local/share/scala
/etc/profileに以下の3行を追加
SCALA_HOME=/usr/local/share/scala PATH=$SCALA_HOME/bin:$PATH export PATH SCALA_HOME
環境変数が正しく設定できていることを確認
$ source /etc/profile $ scala -version #Versionが正しく出ればOK Scala code runner version 2.11.7 -- Copyright 2002-2013, LAMP/EPFL
CDH5及びSparkのインストール
リポジトリインストール
wget http://archive.cloudera.com/cdh5/one-click-install/redhat/6/x86_64/cloudera-cdh-5-0.x86_64.rpm rpm -i cloudera-cdh-5-0.x86_64.rpm rpm --import http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera
擬似分散モードでのインストール
yum install hadoop-conf-pseudo
HDFSの権限設定及びフォーマット
chown hdfs:hdfs /var/lib/hadoop-hdfs sudo -u hdfs hdfs namenode -format
HDFS系サービスの起動
service hadoop-hdfs-datanode start service hadoop-hdfs-namenode start service hadoop-hdfs-secondarynamenode start
関連ディレクトリ作成と権限設定
sudo -u hdfs hadoop fs -ls -R / sudo -u hdfs hadoop fs -mkdir -p /tmp/hadoop-yarn/staging/history/done_intermediate sudo -u hdfs hadoop fs -chown -R mapred:mapred /tmp/hadoop-yarn/staging sudo -u hdfs hadoop fs -chmod -R 1777 /tmp sudo -u hdfs hadoop fs -mkdir -p /var/log/hadoop-yarn sudo -u hdfs hadoop fs -chown yarn:mapred /var/log/hadoop-yarn sudo -u hdfs hadoop fs -ls -R /
YARN系サービスの起動
service hadoop-yarn-resourcemanager start service hadoop-yarn-nodemanager start service hadoop-mapreduce-historyserver start
Sparkのインストール
Hiveのインストールはspark-shell起動時にエラーが出ない場合は必要ありません。
yum install spark-core spark-master spark-worker spark-history-server spark-python yum install hive
Sparkの起動
service spark-master start service spark-worker start
Sparkシェルの起動とサンプル実行
spark-shell > val textFile = sc.textFile("file:///usr/lib/spark/LICENSE") > textFile.count() res0: Long = 859 > val linesWithSpark = textFile.filter(line => line.contains("Spark")) > linesWithSpark.count() res1: Long = 3
終わり
今回はここまでです。次回は対話環境ではなく外部プログラムの実行を行います。
CentOSにgensimを入れてWord2Vecを試す
超今更で恐縮ですがWord2Vecを試してみたくなりました。常に流行から2年ぐらい遅れてる気がします。キルミーベイベーの存在にもアニメ放映時に初めて気付いたぐらいです。
手軽そうなので、gensim上で動かします。gensimは自然言語処理系のモデルがいっぱい入った便利なpythonモジュールです。
環境
- CentOS6.6
- python2.6.6
gensimのインストール
- とりあえず必要そうな依存関係をインストール
yum install gcc gcc-c++ make git openssl-devel bzip2-devel zlib-devel readline-devel sqlite-devel patch
yum install blas-devel lapack-devel atlas-devel
- setuptools, pipをインストール
wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | python easy_install pip
- numpy, scipyの依存関係をインストール
sudo yum install numpy scipy python-matplotlib ipython python- pandas sympy python-nose
- NumPy, SciPy, Sphynx, nose, pydotをインストール(バージョンはhttps://radimrehurek.com/gensim/install.htmlを参照)
pip install numpy==1.7.1 pip install scipy==0.11.0 pip install sphinx pip install pydot
- Gensimをインストール
pip install --upgrade gensim
- テスト用スクリプトを実行
wget https://pypi.python.org/packages/source/g/gensim/gensim-0.12.2.tar.gz#md5=02f99fc1510bfef7e2e81b7fb38a2cf4 tar -xzvf gensim-0.12.2.tar.gz cd gensim-0.12.2 python setup.py test
最後のpython setup.py test
でエラーが出なければOK。
ちなみにRAM2GBで走らせたらエラーが出たのでRAM4GBにしました。
MeCabインストールとpythonバインディング
折角なので日本語のデータを対象に試したいです。というわけでフリーの日本語形態素解析エンジンMeCabをインストールして、pythonから使えるようにします。以下を参考にしてください。(手抜き)
CentOSにmecab-pythonをインストールする - Qiita
mecab-ipadic-neologdのインストール
MeCab用の新語辞書mecab-ipadic-neologdをインストールします。
yum install git make curl xz git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git cd mecab-ipadic-neologd/ ./bin/install-mecab-ipadic-neologd -n echo `mecab-config --dicdir`"/mecab-ipadic-neologd" #インストール先を確認
python実行
pythonで分かち書きデータを作成してWord2Vecの学習を行います。超簡単なサンプルプログラム置いておきます。
# -*- coding: utf-8 -*- import csv import MeCab import re from gensim.models import word2vec target_base_file = 'base.txt' #元テキストの読み取り用ファイル target_file = 'word_for_word2vec.txt' #分かち書きテキストの書き込み用ファイル tagger = MeCab.Tagger('-Owakati -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd') fo = file(target_file,'w') f = open(target_base_file) textdata = f.read() f.close() fo.write(tagger.parse(textdata)) fo.close() sentences = word2vec.Text8Corpus(target_file) model = word2vec.Word2Vec(sentences, size=200) model.save("sample.model")
作成したモデルを使って類似語を出します。
# -*- coding: utf-8 -*- from gensim.models import word2vec model = word2vec.Word2Vec.load("sample.model") try: for i,j in model.most_similar(positive=[u'人間'], negative=[]): print i.encode('utf-8'), j except KeyError: print 'keyword was not found'
終わり
以上です。次回があったらキルミーベイベーから神を引いたらどうなるかを試します。