サナギわさわさ.json

サナギさんとキルミーベイベーとプログラミングが好きです

Sparkでjarファイルからプログラムを実行する

前回 でSparkの擬似分散環境構築とインタラクティブシェル上からのプログラム実行まで行ったので、今回はjarファイルからのプログラム実行を行います。

環境

参考サイト

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を実用できるところまで持って行きたいです。

参考サイト

環境

  • 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
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'

終わり

以上です。次回があったらキルミーベイベーから神を引いたらどうなるかを試します。