読者です 読者をやめる 読者になる 読者になる

なんとかInstallbattle(つづき

KVM仮想マシン上に開発用Hadoopクラスタを構築する話の続きです。
http://karahiyo.hatenablog.com/entry/2013/04/16/070121


CDH3 Hadoopディストリビューションを対象とします。

クラスタ構成
OS CentOS 6.4 x86_64
メモリ 2048MB
コア 1
HDD 60GB~40GB

の計5台

主にpsshで作業します。

環境構築手順

1. Javaインストール
2. Hadoopインストール
3. hadoopユーザ追加と、ssh公開鍵の配布
4. 構成記述
5. テスト動作



1. Javaインストール

# pssh -t 0 -i yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel

psshの接続がタイムアウトしてしまうため、 -tオプションで"0"を指定しタイムアウトをしないようにする。


2. CDH3レポジトリの登録
Cloudera のinstallation guideを参考に

    # pssh -t 0 -i sudo yum --nogpgcheck install http://archive.cloudera.com/redhat/cdh/cdh3-repository-1.0-1.noarch.rpm -y
    # pssh -i sudo rpm --import http://archive.cloudera.com/redhat/cdh/RPM-GPG-KEY-cloudera
CDH3の各種パッケージをインストール

マスター

    # pssh -t 0 -h master -i sudo yum install -y hadoop-0.20 hadoop-0.20-native hadoop-0.20-namenode hadoop-0.20-jobtracker

スレーブ

    # pssh -h ~/.pssh/slaves -t 0 -i sudo yum -y install hadoop-0.20 hadoop-0.20-native hadoop-0.20-datanode hadoop-0.20-tasktracker


3. hadoopユーザ、ssh公開鍵配布

    # pssh -h ~/.pssh/all -i sudo useradd -m -g hadoop hadoop
    # sudo su hadoop
    # ssh-keygen -t rsa -N "" -f /home/hadoop/.ssh/id_rsa
>

$ cat id_rsa.pub >> authorized_keys
|

4. Hadoop設定
空の設定ファイルをコピー

    # pssh -h ~/.pssh/all -i sudo cp -dpR /etc/hadoop/conf.empty /etc/hadoop/conf.cluster

構成ファイルの優先順位を設定

    # alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf /etc/hadoop-0.20/conf.cluster 50
    # alternatives --display hadoop-0.20-conf

4.1 NFSインストール
設定ファイルはマスターのものを各スレーブにNFSマウントして読み込ませる

    # yum install nfs-utils
    # mkdir /mnt/nfs
    # chown nfsnobody. /mnt/nfs

/etc/exportsの設定

    # vi /etc/exports
        /mnt/nfs 192.168.1.0/24(ro,root_squash)
    #exportfs -ra
        /mnt/nfs        192.168.1.0/24(ro,wdelay,root_squash,no_subtree_check)
        /etc/hadoop 192.168.1.0/24(ro,root_squash)

ipv6は使用しないためコメントアウト

    # vi /etc/netconfig
    #udp6       tpi_clts      v     inet6    udp     -       -
    #tcp6       tpi_cots_ord  v     inet6    tcp     -       -
NFSで使用するポートを固定
    # vi /etc/sysconfig/nfs
    MOUNTD_NFS_V2="no"
    MOUNTD_NFS_V3="yes" <- noから
    # TCP port rpc.lockd should listen on.
    LOCKD_TCPPORT=32803
    # UDP port rpc.lockd should listen on.
    LOCKD_UDPPORT=32769
    # Port rpc.mountd should listen on.
    MOUNTD_PORT=892
    # Port rpc.statd should listen on.
    STATD_PORT=662
    # vi /etc/sysconfig/iptables
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT
    -A INPUT -m state --state NEW -m udp -p udp --dport 111 -j ACCEPT

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 662 -j ACCEPT
    -A INPUT -m state --state NEW -m udp -p udp --dport 662 -j ACCEPT

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 892 -j ACCEPT
    -A INPUT -m state --state NEW -m udp -p udp --dport 892 -j ACCEPT

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT
    -A INPUT -m state --state NEW -m udp -p udp --dport 2049 -j ACCEPT

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 32803 -j ACCEPT
    -A INPUT -m state --state NEW -m udp -p udp --dport 32769 -j ACCEPT
NFSサーバー側起動
    # service rpcbind start
    rpcbind を起動中:                                          [  OK  ]
    # service nfslock start
    NFS statd を起動中:                                        [  OK  ]
    # service nfs start
    NFS サービスを起動中:                                      [  OK  ]
    NFS mountd を起動中:                                       [  OK  ]
    NFS デーモンを起動中:                                      [  OK  ]

    # chkconfig rpcbind on
    # chkconfig nfslock on
    # chkconfig nfs on

NFSクライアント側

    # pssh -h ~/.pssh/slaves -i sudo yum install -y rpcbind nfs-utils

    [yu_ke@opx]
    02:08:03 + pssh -h ~/.pssh/slaves -i sudo service rpcbind start
    [1] 02:09:05 [SUCCESS] gabriel
    rpcbind を起動中: [  OK  ]
    [2] 02:09:05 [SUCCESS] michael
    rpcbind を起動中: [  OK  ]
    [3] 02:09:05 [SUCCESS] raphael
    rpcbind を起動中: [  OK  ]
    [4] 02:09:05 [SUCCESS] uriel
    rpcbind を起動中: [  OK  ]
    [yu_ke@opx]
    02:09:06 + pssh -h ~/.pssh/slaves -i sudo service netfs start
    [1] 02:09:12 [SUCCESS] uriel
    その他のファイルシステムをマウント中:  [  OK  ]
    [2] 02:09:12 [SUCCESS] michael
    その他のファイルシステムをマウント中:  [  OK  ]
    [3] 02:09:12 [SUCCESS] raphael
    その他のファイルシステムをマウント中:  [  OK  ]
    [4] 02:09:12 [SUCCESS] gabriel
    その他のファイルシステムをマウント中:  [  OK  ]


!


Hadoopの設定ファイルである/etc/hadoopを、
スレーブの/nfs_hadoopとNFSで同期する。

    # pssh -h ~/.pssh/slaves -i sudo mkdir /nfs_hadoop
    # mount -t nfs 192.168.1.80:/etc/hadoop /nfs_hadoop -o rsize=4096,wsize=4096,hard,intr,noatime
    (pssh -h ~/.pssh/slaves -i sudo mount -t nfs 192.168.1.80:/etc/hadoop /nfs_hadoop -o rsize=4096,wsize=4096,hard,intr,noatime)

確認

    # df -h
    Filesystem            Size  Used Avail Use% マウント位置
    /dev/mapper/vg_gabriel-lv_root
                           36G  1.4G   32G   5% /
    tmpfs                 939M     0  939M   0% /dev/shm
    /dev/vda1             485M   52M  408M  12% /boot
    192.168.1.80:/mnt/nfs
                           50G  1.7G   46G   4% /nfs
    192.168.1.80:/etc/hadoop
                           50G  1.7G   46G   4% /nfs_hadoop

NFSで共有するconfファイルを読み込み先としてリンクする。

    # pssh -h ~/.pssh/slaves -i sudo mv /etc/hadoop-0.20 /etc/hadoop-0.20_def
    # pssh -h ~/.pssh/slaves -i sudo ln -s /nfs_hadoop-0.20  /etc/hadoop-0.20
  • リンクの貼り方でミス。

#pssh -h ~/.pssh/slaves -i sudo ln -s /nfs_hadoop /etc/hadoop
としたところhadoop起動する際にエラー。
リンク先の読み間違え。
/etc/hadoopはalternativesで選択しているファイルへの単なるリンクであるから、
上記のコマンドではHadoopの構成は結局/etc/hadoop-0.20のものとなってしまう。

rpm -q --scripts hadoop-0.20-0.20.2+923.479-1.noarch

で中身を確認してみる。

(中略)

preinstall scriptlet (using /bin/sh):
getent group hadoop >/dev/null || groupadd -r hadoop
getent group hdfs >/dev/null   || groupadd -r hdfs
getent group mapred >/dev/null || groupadd -r mapred

# Upgrade

postinstall scriptlet (using /bin/sh):
**alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf /etc/hadoop-0.20/conf.empty 10**
alternatives --install /usr/bin/hadoop hadoop-default /usr/bin/hadoop-0.20 20 \
  --slave /var/log/hadoop hadoop-log /var/log/hadoop-0.20 \
  --slave /usr/lib/hadoop hadoop-lib /usr/lib/hadoop-0.20 \
  --slave /etc/hadoop hadoop-etc /etc/hadoop-0.20 \
  --slave /usr/share/man/man1/hadoop.1.gz hadoop-man /usr/share/man/man1/hadoop-0.20.1.gz


(中略)
slave /etc/hadoop hadoop-etc /etc/hadoop-0.20 \

という記述のあるとおり。


5. 構成ファイル設定



その他準備

   # pssh -h ~/.pssh/all -i sudo mkdir -p /hadoop/mapred
    # pssh -h ~/.pssh/all -i sudo mkdir -p /hadoop/dfs
    # pssh -h ~/.pssh/all -i sudo chown -R hdfs:hadoop /hadoop
    # pssh -h ~/.pssh/all -i sudo chown -R mapred:hadoop /hadoop/mapred


6. HDFS起動

    # su - hdfs
    $ hadoop namenode -format
    $ hadoop namenode -format
    13/04/18 03:27:40 INFO namenode.NameNode: STARTUP_MSG:
    /************************************************************
    STARTUP_MSG: Starting NameNode
    STARTUP_MSG:   host = jesus.csl.ec.t.kanazawa-u.ac.jp/192.168.1.80
    STARTUP_MSG:   args = [-format]
    STARTUP_MSG:   version = 0.20.2-cdh3u6
    STARTUP_MSG:   build = file:///data/1/tmp/topdir/BUILD/hadoop-0.20.2-cdh3u6 -r efb405d2aa54039bdf39e0733cd0bb9423a1eb0a; compiled by 'root' on Wed Mar 20 13:09:22 PDT 2013
    ************************************************************/
    13/04/18 03:27:40 INFO util.GSet: VM type       = 64-bit
    13/04/18 03:27:40 INFO util.GSet: 2% max memory = 19.33375 MB
    13/04/18 03:27:40 INFO util.GSet: capacity      = 2^21 = 2097152 entries
    13/04/18 03:27:40 INFO util.GSet: recommended=2097152, actual=2097152
    13/04/18 03:27:41 INFO namenode.FSNamesystem: fsOwner=hdfs (auth:SIMPLE)
    13/04/18 03:27:41 INFO namenode.FSNamesystem: supergroup=supergroup
    13/04/18 03:27:41 INFO namenode.FSNamesystem: isPermissionEnabled=true
    13/04/18 03:27:41 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=1000
    13/04/18 03:27:41 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
    13/04/18 03:27:41 INFO common.Storage: Image file of size 110 saved in 0 seconds.
    13/04/18 03:27:41 INFO common.Storage: Storage directory /tmp/hadoop-hdfs/dfs/name has been successfully formatted.
    13/04/18 03:27:41 INFO namenode.NameNode: SHUTDOWN_MSG:
    /************************************************************
    SHUTDOWN_MSG: Shutting down NameNode at jesus.csl.ec.t.kanazawa-u.ac.jp/192.168.1.80
    ************************************************************/
    # pssh -H master -i sudo service hadoop-0.20-namenode start
        [1] 03:33:31 [SUCCESS] jesus
        Starting Hadoop namenode daemon (hadoop-namenode): starting namenode, logging to /usr/lib/hadoop-0.20/logs/hadoop-hadoop-namenode-jesus.out
HDFS
    [root@master]# su - hdfs
    [hdfs@master]$ hadoop namenode -format
    [hdfs@master]$ exit
マスターノードの NameNode、スレーブノードの DataNode を起動する。
マスターノード:
    [root@master]# service hadoop-0.20-namenode start
スレーブノード:
    [root@slave]# service hadoop-0.20-datanode start
NameNode、DataNode が稼働しているかどうかは、ブラウザーで以下の URL にアクセスすることで確認できる。
http://master:50070/
![起動画面]
[f:id:karahiyo:20130421170123p:plain]

MAPRED

    [root@jesus hadoop]# su - hdfs
    -bash-4.1$ hadoop fs -mkdir /mapred/system
    -bash-4.1$ hadoop fs -chown -R mapred:supergroup /
    -bash-4.1$ hadoop fs -chmod -R 0700 /mapred
    -bash-4.1$ exit


    [root@jesus hadoop]# service hadoop-0.20-jobtracker start
    Starting Hadoop jobtracker daemon (hadoop-jobtracker): starting jobtracker,  logging to /usr/lib/hadoop-0.20/logs/hadoop-hadoop-jobtracker-jesus.out
    [root@jesus hadoop]#                                       [  OK  ]

    04:14:49 + pssh -h ~/.pssh/slaves -i sudo service hadoop-0.20-tasktracker start
    [1] 04:22:34 [SUCCESS] michael
    Starting Hadoop tasktracker daemon (hadoop-tasktracker): starting tasktracker,  logging to /usr/lib/hadoop-0.20/logs/hadoop-hadoop-tasktracker-michael.out
    [2] 04:22:34 [SUCCESS] uriel
    Starting Hadoop tasktracker daemon (hadoop-tasktracker): starting tasktracker,  logging to /usr/lib/hadoop-0.20/logs/hadoop-hadoop-tasktracker-uriel.out
    [3] 04:22:34 [SUCCESS] gabriel
    Starting Hadoop tasktracker daemon (hadoop-tasktracker): starting tasktracker,  logging to /usr/lib/hadoop-0.20/logs/hadoop-hadoop-tasktracker-gabriel.out
    [4] 04:22:34 [SUCCESS] raphael
    Starting Hadoop tasktracker daemon (hadoop-tasktracker): starting tasktracker,  logging to /usr/lib/hadoop-0.20/logs/hadoop-hadoop-tasktracker-raphael.out

JobTracker、TaskTracker が稼働しているかどうかは、ブラウザーで以下の URL にアクセスすることで確認できる。
http://master:50030/
f:id:karahiyo:20130424141802p:plain

    # su - mapred
    $ cd /usr/lib/hadoop
    $ hadoop jar hadoop-examples.jar pi 4 10

    [yu_ke@~]
    04:22:34 + pssh -h ~/.pssh/all -i sudo jps
    [1] 05:10:35 [SUCCESS] jesus
    14066 JobTracker
    13578 NameNode
    14399 Jps
    [2] 05:10:36 [SUCCESS] gabriel
    12310 TaskTracker
    12571 Jps
    12200 DataNode
    [3] 05:10:36 [SUCCESS] michael
    12295 Jps
    12141 TaskTracker
    12030 DataNode
    [4] 05:10:36 [SUCCESS] raphael
    11855 DataNode
    11966 TaskTracker
    12119 Jps
    [5] 05:10:36 [SUCCESS] uriel
    12001 TaskTracker
    12153 Jps
    11889 DataNode


!










!



番外


# wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm
# rpm -ivh epel-release-5-4.noarch.rpm

  • moshを入れたい
    # sudo yum install -y mosh

Cloudera Managerでインストール


Hadoopクラスタを関しするための便利な管理画面があるということで、 はじめはCloudera ManagerでHadoopのインストールをしようと考えていました。


[f:id:karahiyo:20130421170119p:plain]

1. Cloudera Manager Freeをダウンロード

       # wget http://archive.cloudera.com/cm4/installer/latest/cloudera-manager-installer.bin
       # chmod +x cloudera-manager-installer.bin
       # ./cloudera-manager-installer.bin

![インストーラ起動画面]
f:id:karahiyo:20130421170120p:plain

あぁっ、jdkまでインストールされた!?
jdk,cloudera-manager-server,cloudera-manager-server-db,etc..


2. Cloudera ManagerのWeb管理画面にアクセス
http://jesus:7180
f:id:karahiyo:20130424141833p:plain

adminでadmin。


えっこれ全部入っちゃうのか(´・_・`)

3. そしてアンインストール

# sudo /usr/share/cmf/uninstall-cloudera-manager.sh

私の開発環境には、そこまで潤沢なリソースはありませんので、
必要最低限のものだけ入れたい。

© karahiyo