2016年6月24日金曜日

Ubuntu14.04にHadoop2.6.0を導入する

分散処理のフレームワークHadoopをUbuntuに導入するため方法を備忘録として。

実行環境
Ubuntu 14.04
Hadoop 2.6.0

環境構築
Javaのインストール
Hadoopに必要なJavaを入れます。
root$ sudo apt-get update
root$ sudo apt-get install openjdk-7-jdk
root$ java -version
java version "1.7.0_101"
OpenJDK Runtime Environment (IcedTea 2.6.6) (7u101-2.6.6-0ubuntu0.14.04.1)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)
Hadoopのインストール
Hadoopの環境を構築していくにあたって、今後完全分散モードを実行する必要がある人は、Hadoop用に別のユーザを作ることをオススメします。
まずはrootユーザからhadoopユーザを作る。
root$ sudo adduser hadoop
初めに聞かれるパスワードだけ設定して、あとはEnter連打。
ついでに、hadoopユーザがsudoできるようにroot権を与えておくと良いかも。
root$ sudo gpasswd -a hadoop sudo
root$ sudo su - hadoop
上記の下側のコマンドでhadoopユーザに入る。

hadoop側で設定を行っていく。まず、Hadoopはネットからダウンロードしてくる必要があるので、公式のミラーサイトから落としてくる。ここでは、山形大学?の2.6.0バージョンを落としてきた。
hadoop$ wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz
hadoop$ tar zxvf hadoop-2.6.0.tar.gz
hadoop$ sudo mv ./hadoop-2.6.0 /usr/local/hadoop
hadoop$ sudo chown hadoop:hadoop -R /usr/local/hadoop
Hadoopのフォルダの設置は完了したので、パスを通すために.bashrcの最下部にパスを書く。
hadoop$ emacs ~/.bashrc
...
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export HADOOP_INSTALL=/usr/local/hadoop
export PATH=$HADOOP_INSTALL/bin:$JAVA_HOME/bin:$PATH
export PATH=$HADOOP_INSTALL/sbin:$JAVA_HOME/bin:$PATH

hadoop$ source .bashrc
hadoop$ hadoop version
Hadoop 2.6.0
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r e3496499ecb8d220fba99dc5ed4c99c8f9e33bb1
Compiled by jenkins on 2014-11-13T21:10Z
Compiled with protoc 2.5.0
From source with checksum 18e43357c8f927c0695f1e9522859d6a
This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-2.6.0.jar
バージョンがきちんと出力されれば、Hadoopへのパスが通っていることが確認できる。

スタンドアローンモードで実行確認
スタンドアローンモードはhdfsを使用せずにローカルファイルシステムを使います。そのため、デフォルトの設定であれば設定ファイルをいじることなく実行の確認ができます。サンプルの円周率を求めるプログラムを動かしてみます。
hadoop$ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar pi 10 10000
Number of Maps  = 10
Samples per Map = 10000
Wrote input for Map #0
Wrote input for Map #1
Wrote input for Map #2
Wrote input for Map #3
Wrote input for Map #4
Wrote input for Map #5
Wrote input for Map #6
Wrote input for Map #7
Wrote input for Map #8
Wrote input for Map #9
Starting Job
...
(省略)
...
Job Finished in 16.526 seconds
Estimated value of Pi is 3.1415844000000000
どうやって円周率を求めているのかわかりませんが、モンテカルロ法を用いて計算しているようです。
piの次にある2つの引数は10がMapの数で10000がサンプル数です。このサンプル数をもっと増やせば円周率の結果の精度が高くなります。

擬似分散モード
擬似分散モードは、1台のPCでmasterとslaveを担い、hdfsを利用して擬似的に分散処理を行うことです。
本来の分散処理は、他のPCとsshで接続し通信を行います。この擬似分散モードは、自身のPCにssh接続することで1台のPCで分散処理を行うことができるようにしています。

sshキーの生成
では、まず自身のPCにパスなしでssh接続するための公開鍵を生成します。
hadoop$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): 
/home/hadoop/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
...
-tオプションで鍵の種類を指定しています。実行するといろいろ聞かれますが、基本はそのままEnterで。一度作っていたらOverwrite?って聞かれますが、とりあえずyにして上書きしときましょう。
本当に生成されているか見てみましょう。
hadoop$ ls -la ~/.ssh/
合計 32
drwx------  2 hadoop hadoop 4096  6月 24 12:51 .
drwxr-xr-x 26 hadoop hadoop 4096  6月 23 17:05 ..
-rw-------  1 hadoop hadoop  616  6月 19 16:12 authorized_keys
-rw-------  1 hadoop hadoop 1679  6月 24 12:52 id_rsa
-rw-r--r--  1 hadoop hadoop  408  6月 24 12:52 id_rsa.pub
-rw-r--r--  1 hadoop hadoop 3996  6月 23 15:35 known_hosts
id_rsaとid_rsa.pubが生成されていればok。
hadoop$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
hadoop$ chmod 600 ~/.ssh/authorized_keys
localhostにパス無しでssh接続
これで鍵の登録ができたので、ssh接続できるか試してみましょう。
hadoop$ ssh localhost
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.13.0-83-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

Last login: Fri Jun 24 13:30:08 2016 from localhost
hadoop$ exit
ログアウト
パス無しで上記の表示が出されればログインできており、ssh設定完了です。exitでログアウトします。
ついでに今後のためにhostsにIPアドレスを記述しておきましょう。事前にIPを固定しているとして話を進めます。
まずは、自分のIPを確認します。
hadoop$ ifconfig
...
eth0   inetアドレス:192.168.0.XXX
...
このIPアドレスをPCに記憶させます。hostsファイルはLANで接続された各ホスト名とIPアドレスを記述することにより、いちいちIPアドレスを打たなくてもホスト名を用いて指定することができます。
hadoop$ sudo emacs /etc/hosts
127.0.0.1      localhost
192.168.0.XXX  HOGE

# The following lines are desirable for IPv6 capable hosts                      
...
ここで用いているHOGEはホスト名であり、端末などでhadoop@@HOGE:~$とあるときの、HOGEの部分になります。
これを設定することで、以下は同じ意味になります。
hadoop$ ssh 192.168.0.XXX
hadoop$ ssh HOGE

設定ファイルの編集
擬似分散モードで動作するようにHadoopの設定ファイルを書き換えます。
それぞれのファイル内の~の間に書き足していきます。
  1. core-site.xml
  2. hadoop$ emacs /usr/local/hadoop/etc/hadoop/core-site.xml
    
      
        fs.default.name
        hdfs://localhost:9000
      
    
    
  3. mapred-site.xml
  4. デフォルトではmapred-site.xml.templateとなっているので、mapred-site.xmlを作成してから編集する。
    hadoop$ cp /usr/local/hadoop/etc/hadoop/mapred-site.xml.template /usr/local/hadoop/etc/hadoop/mapred-site.xml
    hadoop$ emacs /usr/local/hadoop/etc/hadoop/mapred-site.xml
    
      
        mapred.job.tracker
        localhost:9001
      
    
    
  5. hdfs-site.xml
  6. hadoop$ emacs /usr/local/hadoop/etc/hadoop/hdfs-site.xml
    
      
        dfs.replication
        1
      
    
    
  7. hadoop-env.sh
  8. hadoop$ emacs /usr/local/hadoop/etc/hadoop/hadoop-env.sh
    ...
    # The java implementation to use.
    #export JAVA_HOME=${JAVA_HOME} #コメントアウト
    export JAVA_HOME=/usr #追加記述
    ...
    

ファイルシステムのフォーマット
設定ファイルをいじったら毎回HDFSをフォーマットする必要があります。
Nodeが停止している状態で次のコマンドでフォーマットします。
hadoop$ hdfs namenode -format
16/06/24 14:05:09 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = PC-NAME/192.168.0.XXX
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 2.6.0
...
(省略)
...
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at PC-NAME/192.168.0.XXX
************************************************************/

擬似分散で実行
まずは、Nodeを立ち上げます。
hadoop$ start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Starting namenodes on [localhost]
localhost: namenode running as process 6345. Stop it first.
localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hadoop-datanode-PC-NAME.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: secondarynamenode running as process 6557. Stop it first.
starting yarn daemons
resourcemanager running as process 6713. Stop it first.
localhost: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-hadoop-nodemanager-PC-NAME.out
jpsコマンドを使って、Nodeが起動しているか確認します。
hadoop$ jps
8176 DataNode
6345 NameNode
6557 SecondaryNameNode
8651 Jps
6924 JobHistoryServer
6713 ResourceManager
8553 NodeManager
webでも確認してみます。
アドレスバーに下記を打ってアクセスします。XXXは実行しているサーバのIPアドレスです。
192.168.0.XXX:50070


サンプルの実行
hadoop$ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar pi 10 10000
Number of Maps  = 10
Samples per Map = 10000
Wrote input for Map #0
Wrote input for Map #1
Wrote input for Map #2
Wrote input for Map #3
Wrote input for Map #4
Wrote input for Map #5
Wrote input for Map #6
Wrote input for Map #7
Wrote input for Map #8
Wrote input for Map #9
Starting Job
...
(省略)
...
Job Finished in 2.428 seconds
Estimated value of Pi is 3.14120000000000000000
HDFSの状態をチェックしてみましょう
hadoop$ hdfs dfsadmin -report
Configured Capacity: 48447275008 (45.12 GB)
Present Capacity: 15826509824 (14.74 GB)
DFS Remaining: 15826477056 (14.74 GB)
DFS Used: 32768 (32 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0

-------------------------------------------------
Live datanodes (1):

Name: 127.0.0.1:50010 (localhost)
Hostname: PC-NAME
Decommission Status : Normal
Configured Capacity: 48447275008 (45.12 GB)
DFS Used: 32768 (32 KB)
Non DFS Used: 32620765184 (30.38 GB)
DFS Remaining: 15826477056 (14.74 GB)
DFS Used%: 0.00%
DFS Remaining%: 32.67%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Sat Jun 25 23:51:16 JST 2016
また、yarnの状態は
hadoop$ yarn node -list
で確認できます。

最後に、Nodeを閉じる際は
hadoop$ stop-all.sh
です。


以上、Hadoopでスタンドアローンと擬似分散でした。
次回は完全分散モードへ。



0 件のコメント :

コメントを投稿