HadoopでPython使ってテストしてみた - その1
だいぶ乗り遅れた感はあるけどHadoopを試してみた。
サンプルは使用せずにmapperとreducerはPythonで書いてみました。
まず準備。
mochi@ubuntu-vm:~$ java -version
java version "1.6.0_0"
OpenJDK Runtime Environment (IcedTea6 1.6.1) (6b16-1.6.1-3ubuntu1)
OpenJDK Client VM (build 14.0-b16, mixed mode, sharing)
次、ユーザ作成。グループもhadoopにしてログイン。
mochi@ubuntu-vm:~$ sudo adduser hadoop
・
・
・
mochi@ubuntu-vm:~$ su - hadoop
hadoopでログインしたまま公開鍵の設定。パス無しで作成する。
hadoop@ubuntu-vm:~$ ssh-keygen -t rsa -P ""
・
・
hadoop@ubuntu-vm:~$ cat .ssh/id_rsa.pub >> .ssh/authorized_keys
hadoop@ubuntu-vm:~$ chmod 600 .ssh/authorized_keys
hadoop@ubuntu-vm:~$ ssh localhost
・
・
hadoop@ubuntu-vm:~$ exit
hadoop@ubuntu-vm:~$ exit
上記でパス聞かれずにログインできればOK。
次、hadoopをここから落としてテスト。
http://ftp.riken.jp/net/apache/hadoop/core/stable/
mochi@ubuntu-vm:~$ mkdir work
mochi@ubuntu-vm:~$ cd work
mochi@ubuntu-vm:~$ wget http://ftp.riken.jp/net/apache/hadoop/core/stable/http://ftp.riken.jp/net/apache/hadoop/core/stable/hadoop-0.20.1.tar.gz
mochi@ubuntu-vm:~$ tar zxvf hadoop-0.20.1.tar.gz
mochi@ubuntu-vm:~$ sudo mv hadoop-0.20.1 /usr/local/hadoop
mochi@ubuntu-vm:~$ sudo chown -R hadoop:hadoop /usr/local/hadoop
ここで/etc/passwdを編集してhadoopユーザのhomeを
/usr/local/hadoopに変更しました。
shellはbashなので$HOME/.bashrcにJAVA_HOMEを追記しておきます。
また、コマンドパスについても同様にexport PATH=$PATH:$HOME/binとかしてあげます。
再度ユーザの変更。
mochi@ubuntu-vm:~$ su - hadoop
・
hadoop@ubuntu-vm:~$
設定ファイルにJAVA_HOMEの環境変数を設定してあげます。
自身の環境に合わせて設定して下さい。
hadoop@ubuntu-vm:~$ vim conf/hadoop-env.sh# Set Hadoop-specific environment variables here.
# The only required environment variable is JAVA_HOME. All others are
# optional. When running a distributed configuration it is best to
# set JAVA_HOME in this file, so that it is correctly defined on
# remote nodes.# The java implementation to use. Required.
# export JAVA_HOME=/usr/lib/j2sdk1.5-sun
export JAVA_HOME=/usr/lib/jvm/****
設定はだいたいここまで。
次に処理するファイルを用意してあげます
hadoop@ubuntu-vm:~$ mkdir input
hadoop@ubuntu-vm:~$ vim input/example.tsv
1 test
2 mochi
3 aaaa
4 aaaa
5 test
6 bbbbb
7 test
8 mochi
9 hagaeru3sei
10 hagaeru3sei
11 test
こんな感じのtsvファイルを用意しました。
次にこれを処理する[mapper]と[reducer]を用意してあげます。
今回はpythonで書いてみました。
[mapper]
hadoop@ubuntu-vm:~$ mkdir work hadoop@ubuntu-vm:~$ mkdir work/python hadoop@ubuntu-vm:~$ vim work/python/map.py #!/usr/bin/env python # coding:utf-8 import sys def main(): line = sys.stdin.readline() try: while line: line = line[:-1] fields = line.split("\t") print "%s\t%s" % (fields[0], fields[1]) line = sys.stdin.readline() except Exception, e: print e if __name__ == "__main__": main()
[reducer]
hadoop@ubuntu-vm:~$ vim work/python/reduce.py #!/usr/bin/env python # coding: utf-8 import sys cnt = {} def main(): global cnt line = sys.stdin.readline() try: while line: line = line[:-1] # del \n key, value = line.split("\t") if not cnt.has_key(value): cnt[value] = 0 cnt[value] += 1 line = sys.stdin.readline() except Exception, e: print(e) if __name__ == "__main__": main() for k, v in cnt.iteritems(): print "[ "+ str(k) +" ]\t:\t"+ str(v)
それぞれ単体テスト。
hadoop@ubuntu-vm:~$ chmod 755 work/python/map.py work/python/reduce.py
hadoop@ubuntu-vm:~$ work/python/map.py < input/example.tsv
1 test
2 mochi
3 aaaa
4 aaaa
5 test
6 bbbbb
7 test
8 mochi
9 hagaeru3sei
10 hagaeru3sei
11 testhadoop@ubuntu-vm:~$ work/python/reduce.py < input/example.tsv
[ test ] : 4
[ aaaa ] : 2
[ bbbbb ] : 1
[ hagaeru3sei ] : 2
[ mochi ] : 2
OK。
長くなったので記事を分割します。
続きはここから。