[[Hadoop]]~

#contents

* Hadoop/Atom-Server [#yc73dcc4]
~
Atom Serverを使用し、Hadoopを完全分散モード(クラスタ)で構築します。大きな項目は以下のとおりです。
 ・Hadoopについて
 ・Atom Serverのマシンスペック
 ・CentOS5.5-x86_64のインストールと各設定
 ・CDH3beta4のインストール
 ・Hadoopの設定と各ノードの起動
 ・サンプルプログラムの実行
 ・Ganglia(サーバ監視ソフトウェア)の導入
#ref(atomcloud.jpg,,30%);~
(使用するAtom-Server)~
(使用するAtom-Server。Atom-Serverの詳細な写真は[[こちら:http://labs.beatcraft.com/ja/index.php?Atom-Server#z8ef9cbc]])~

:Note|本手順では社内でHadoop完全分散モードを構築しHDFS、MapReduceの動作確認をする事を主な目的としています。セキュリティ設定への考慮など不足している箇所がありますのでご了承ください。

* Hadoop について [#u4c3fd3b]
Hadoopは大規模分散システムのOpen Source Projectの1つです。主な特徴はHDFS、MapReduceがあります。HDFSはブロックサイズがデフォルトで64MBと非常に大きく(ex3のデフォルトブロックサイズは4096バイト)、テラバイトからペタバイトのデータサイズを扱う分散ファイルシステムです。MapReduceは並列分散処理のためのフレームワークです。HDFS、MapReduceにはMasterサーバとSlaveサーバが存在しそれぞれにノードがあります。またHDFSではデータをメタデータで管理し実データの複製管理などを行っています。MapReduceではjobの並列分散管理などを行っています。~
~
またMapReduceはMap処理、Shuffle&Sort処理、Reduce処理に分けることができます。それぞれの処理の大まかな役割は以下のとおりです順に入力処理、中間処理、出力処理です。
~
ただし大量の小さいファイルの書き込みやファイルの更新には向いていません。この点についてはHBase(Hadoopの関連プロジェクト)や従来のRDBMSと組み合わせることで補うことも可能です。詳細については[[hadoop.apache.org>http://hadoop.apache.org/]]や、[[HBase>http://hbase.apache.org/]]をご覧ください。~
~
HadoopのソフトウェアはCommon、HDFS、MapReduceから構成されています。CommonはHadoopプロジェクトのサポートユーティリティです。HDFS、MapReduceの役割とそれぞれのMasterサーバ、Slaveサーバの各ノード名称を以下に記載します。~
|名称|役割|Master|Slave|h
|HDFS|Hadoop Distributed File System の略称、分散、複製の機能を備えた大規模ファイルシステム|NameNode|DataNode|
|MapReduce|大規模分散システム上でのプロセス並列化のフレームワーク|JobTracker|TaskTracker|
~

HDFS、MapReduceそれぞれのノードについての名称と概略を以下に記載します。~

- HDFS~
|名称|概略|Master or Slave|h
|NameNode|DataNode上の情報をメタデータで管理、複製の配置や整合性の管理|Master|
|DataNode|実データの保存、状態の報告|Slave|
|Secondarynamenode|障害対策の1つ、一定の間隔でNamenodeのバックアップを取得|Master|
~
:Note|本手順では実行していませんがHadoopではMasterが単一障害点になるため、その対策として一定の間隔でNamenodeのバックアップを取るためのサービスSecondarynamenodeがあります。~
~

- MapReduce~
|名称|概略|Master or Slave|h
|JobTracker|jobの受付、処理の割当、管理|Master|
|TaskTracker|JobTrackerから割当てられた処理を実行するワーカー|Slave|
~

それぞれの詳細については[[Common>http://hadoop.apache.org/common/]]、[[HDFS>http://hadoop.apache.org/hdfs/]]、[[MapReduce>http://hadoop.apache.org/mapreduce/]]をご覧ください。~
~
また動作モードとしてローカルモード、擬似分散モード(pseudo)、完全分散モードがあります。ここでは完全分散モードについて記載しています。それぞれの概略は以下のとおりです。~

|名称|概略|h
|ローカルモード|1台での実行、Hadoopとしての機能は使わずJavaの機能を使用|
|擬似分散モード|1台でMasterとSlaveの実行|
|完全分散モード|複数台でMasterとSlaveの実行|
各動作モードの詳細については[[Getting Started>http://hadoop.apache.org/common/docs/current/]]をご覧ください。

** CDHについて [#vce83e19]
CDHはCloudera社提供されている『Cloudera Distribution for apache Hadoop』の略称です。CDHではHadoopとHadoopの関連プロジェクト(以降、コンポーネントと記載)であるHbase、Pig、Hiveなどとの整合性をある程度とりリリースされています。このためHadoopおよびコンポーネントの導入が比較的容易になっています。~
~
本手順ではCDH3beta4(2011年4月1日当時の最新)で記載しています。2011年4月14日にCDH3がリリースされました。詳細については[[CDH3+Installation>https://docs.cloudera.com/display/DOC/CDH3+Installation]]、[[Distribution Details>http://www.cloudera.com/hadoop-details/]]をご覧ください。

*** Hadoopのバージョンについて [#c390c224]
CDH3beta4に含まれるhadoop-0.20.2を使用しています。また[[hadoop.apache.org>http://hadoop.apache.org/]]で公開されているHadoopの最新版は0.21.0です。0.20.xと0.21.xでは機能やAPIなどに変更があります。詳細については[[release 0.21.0 available >http://hadoop.apache.org/common/releases.html#23+August%2C+2010%3A+release+0.21.0+available]]をご覧ください。
~
* Hadoopサーバについて[#uab5ce76]
AtomServerの各マシンにCentOS5.5-x86_64をインストールし設定を行います。CentOSのインストール後CDH3beta4のリポジトリを追加しHadoopと主要コンポーネントをインストール、設定を行います。一部の設定(固定IP設定、Master、Slaveの各サービス)以外はすべてのマシンで同じ設定を行います。

:Note|本手順でのHadoopと主要コンポーネントとはCommon、HDFSとMapReduceのコンポーネントを指しています。
 
** Atom Server構成 [#pf78a073]
今回使用しているマシンの構成は、同型Atomボード8枚1組で構成されています。~
- Atom Server~
#ref(atomcloud.jpg,,25%);  #ref(atomcloud2.jpg,,25%);~
&ref(atomcloud.jpg,,25%); &ref(atomcloud2.jpg,,25%);~
~
(このAtomサーバは東京エレクトロンデバイス様のご好意によりお借りしております。)~
様々な角度からAtom Serverを撮影しました。[[Atom-Serverの各画像 >http://labs.beatcraft.com/ja/index.php?Atom-Server#z8ef9cbc]]をご覧ください。
~
- スペック(Atomボード1枚)~

 CPU:Atom D510 1.66GHz(Core 2個,HT Enable ,64bit Enable)
 Chipset :NM10
 Memory:2GB
 Hard Disk容量: 160GB
 Ethernet:1個(static IPを個別に設定)
 OS: CentOS-5.5-x86_64
 
** CentOS-5.5-x86_64の設定 [#o971c4a6]
インストールはCentOS-5.6-x86_64-LiveCD.isoを使用します。isoファイルは[[こちら>http://isoredirect.centos.org/centos/5/isos/x86_64/]]からダウンロードをします。

*** CentOS-5.5-x86_64のインストール[#m738e5e9]
インストールパッケージの選択は以下のとおりです。

- Server
- Server GUI(CUIのみ使用の場合は不必要です)
- 追加パッケージ
-- BASEから開発ツール、開発ライブラリ
- 削除パッケージ
-- Serverからsendmail、newsサーバ

*** アカウント設定 [#f4cf6cf4]
root のパスワードは『beatcraft』に設定しています。また一般ユーザアカウント設定は以下のとおりです。 ~

 ユーザ名:beat
 パスワード:beatcraft

*** その他のインストール時の設定 [#ce282a4e]
Firewall SELinux は共にDisableに設定しています。その他のインストール時の設定はデフォルトの設定を適用しています。再起動後ネットワークの設定を行います。

** ネットワーク設定 [#edffc5a2]
Hadoop完全分散モードでの動作確認のため各Atomボードに固定IPとhost名、FQDNでの名前解決の設定を行っています。本内容ではアドレスは192.168.0.211〜192.168.0.218、ホスト名atomcloud1〜8とそれぞれのAtomボードに設定しています。ご使用の環境に合わせて設定を適宜変更してください。

:Note|Hadoopのクラスタリングではマシン間の通信はFQDNが解決されていないとサービス起動時にディレクトリまたはパスが見つからないというエラーが起こります。 そのため固定IPと名前解決のネットワーク設定をしておく必要があります。

- 固定IPの設定 ~
固定IPの設定は/etc/sysconfig/network-scripts/ifcfg-eth0に記載されています。IPアドレス、Netmask、Gatewayを使用環境にそって適宜変更してください。以下は設定例です。
-- 設定例~

 # vi /etc/sysconfig/network-scripts/ifcfg-eth0
 
 ...<略>
 ONBOOT=yes              
 NETMASK=255.255.255.0   
 IPADDR=192.168.0.212    
 GATEWAY=192.168.0.xxx   
 ...<略>

- ホスト名の設定~
使用するAtomボードは8枚あるので8台分の設定を記載します。記載事項は設定例ですので使用環境にそって適宜設定を変更してください。
-- 設定例~

 # vi /etc/hosts
 
 # Do not remove the following line, or various programs
 # that require network functionality will fail.
 127.0.0.1 localhost.localdomain localhost
 ::1 localhost6.localdomain6 localhost6
 192.168.0.211 atomcloud1.beatcraft.co.jp atomcloud1
 192.168.0.212 atomcloud2.beatcraft.co.jp atomcloud2
 ...<略>
 192.168.0.218 atomcloud8.beatcraft.co.jp atomcloud8
 
設定完了後、再起動し自マシン(ここではatomcloud2)のホスト名宛のpingコマンドで設定しているFQDNとIPで応答があるかを確認します。~

 # ping atomcloud2
 
 PING atomcloud2.beatcraft.co.jp (192.168.0.212) 56(84) bytes of data.
 64 bytes from atomcloud2.beatcraft.co.jp (192.168.0.212): icmp_seq=1 ttl=64 time=0.041 ms
 64 bytes from atomcloud2.beatcraft.co.jp (192.168.0.212): icmp_seq=2 ttl=64 time=0.022 ms
 64 bytes from atomcloud2.beatcraft.co.jp (192.168.0.212): icmp_seq=3 ttl=64 time=0.025 ms

:Note|ping実行時にlocalhost.localdomainで応答がある場合、HDFS起動時にファイルパスが見つからないというエラーが起こることがあります。/etc/hostsの設定を確認してください。

** sshdの設定 [#ad0ea5ad]
Hadoopの完全分散モードでのマシン同士の通信はsshを用いて行います。各マシンのsshdの設定(sshd_config)を記載します。ここでは設定例としてパスワード認証、rootでのログインを許可する設定にしています。適宜使用環境およびセキュリティに考慮して設定を変更してください。~

 # vi /etc/ssh/sshd_config
 
 #LoginGraceTime 2m
 PermitRootLogin yes
 #StrictModes yes
 #MaxAuthTries 6

設定完了後sshdを再起動します。~

 # /etc/init.d/sshd restart

** ntpの設定 [#l6d47b36]
時刻を確認し日本ntpサーバと時刻あわせをします。またその情報をハードウェアに書き込みntpの設定に日本のntpサーバが含まれていない場合追加します。~

 # date
 # ntpdate -s ntp.nict.jp
 # clock -w

ntp/step-tickersに以下の3つの国内ntpサーバを追加します。~

 # vi /etc/ntp/step-tickers
 
 ntp.nict.jp
 ntp.jst.mfeed.ad.jp
 ntp.ring.gr.jp

完了後ntpを再起動し、時刻の確認をします。~

 # /etc/init.d/ntpd restart
 # date

:Note|標準インストールで日本時間を選んでも正しい時刻を取得していないことがあります。その際にファイルの時間が未来を指しているなどの問題がでるのを防ぐためにntpを設定しています。

** 環境変数設定 [#q9bfcb32]
予めJAVA_HOME,HADOOP_HOME、hadoopへのPATH、/sbinと/usr/sbinをPATHに追加します。/sbinと/usr/sbinにPATHを追加しているのはコマンド(ifconfig、alternatives)などのタイプ数を減らすためです。~

 # cat /etc/bashrc | tail -n 5 -f
 
 # vim:ts=4:sw=4
 export JAVA_HOME=/usr/java/latest
 export HADOOP_HOME=/usr/lib/hadoop
 export PATH=/sbin:/usr/sbin:$HADOOP_HOME/bin:$PATH
設定完了後、環境変数設定を再度読み込みます。
 # source /etc/bashrc

:Note|JAVAの実行時およびHadooのサービス起動時および実行時にエラーが発生した場合はJAVA_HOME、HADOOP_HOMEが正しく設定されているかの確認をしてください。
~

** 不要なサービスの停止 [#ld524810]
- runlevel~
runlevelはデフォルトで5(GUI起動)に設定しています。

- サービス~
使用しないサービスを停止します。以下chkconfigコマンドで登録されているサービス一覧を表示します。~

 # chkconfig --list
 NetworkManager  0:off   1:off   2:off   3:off   4:off   5:off   6:off
 acpid           0:off   1:off   2:on    3:on    4:on    5:on    6:off
 ...<略>

- sendmail~
この手順ではsendmailは使用しないのでsendmailの停止とサービス停止をし再起動後でもサービスとして起動しないようにします。~

 # /etc/init.d/sendmail stop
 sm-client を停止中: [ OK ]
 sendmail を停止中: [ OK ]
 # chkconfig sendmail off
 # chkconfig --list | grep sendmail
 sendmail        0:off   1:off   2:off   3:off   4:off   5:off   6:off

**JDKのインストール [#l36907f3]
以下のサイトから最新のJDK-64bit版 (jdk-6u24-linux-x64-rpm.bin)をダウンロードし、インストールを実行します。~
http://www.oracle.com/technetwork/java/javase/downloads/index.html ~

 # cd /home/beat/
 # ls
 Desktop jdk-6u24-linux-x64-rpm.bin
 # chmod u+x jdk-6u24-linux-x64-rpm.bin
 # ./jdk-6u24-linux-x64-rpm.bin
 # ls -l /usr/java/
 合計 4
 lrwxrwxrwx 1 root root 16 3月 22 20:30 default -> /usr/java/latest
 drwxr-xr-x 9 root root 4096 3月 22 20:30 jdk1.6.0_24
 lrwxrwxrwx 1 root root 21 3月 22 20:30 latest -> /usr/java/jdk1.6.0_24

上記で設定したJAVA_HOMEとディレクトリ位置があっているかを確認してください。~
以上でCentOS上での基本的な設定は完了です。

** CentOS-5.5-x86_64設定の制限事項 [#idc0d456]
- 今回のテストでは意識してセキュリティに関する事象を除外しています(sshdのrootログインなど)。
~

* CDH3beta4のリポジトリ追加 [#n16b2d43]
CDH3beta4のHadoopバージョンは0.20.2です。またCDH2およびstableバージョンではhadoop-0.18とhadoop-0.20の混在環境が一部含まれているため今回はCDHの2011年4月1日時点での最新版CDH3beta4を使用しています。~
~
CDH3beta4に含まれるHadoopをインストールするためCDH3beta4のリポジトリを追加します。詳細については[[『Documentation for Previous CDH Releases』の『Download CDH3 Beta 4 Documentation』>https://ccp.cloudera.com/display/DOCPREV/Documentation+for+Previous+CDH+Releases]]をご覧ください。~

 # vi /etc/yum.repos.d/cloudera-cdh3.repo
 
 [cloudera-cdh3]
 name=Cloudera's Distribution for Hadoop, Version 3
 mirrorlist=http://archive.cloudera.com/redhat/cdh/3/mirrors
 gpgkey = http://archive.cloudera.com/redhat/cdh/RPM-GPG-KEY-cloudera 
 gpgcheck = 0

追加したリポジトリを含めるようyumの更新をします。~

 # yum update yum

:Note|2011年4月14日にCDH3がリリースされました。詳細については[[こちら>https://ccp.cloudera.com/display/DOC/Documentation]]をご覧ください。
~
* Hadoopのインストール [#kab7f5a2]
先ほど更新したyumを使用しHadoop(hadoop-0.20)をインストールします。yum searchコマンドでHadoopのパッケージ情報を取得できていることを確認しインストールします。~

 # yum search hadoop-
 ...<略>
 ============================================ Matched: hadoop- ============================================
 hadoop-0.20.noarch : Hadoop is a software platform for processing vast amounts of data
 hadoop-0.20-conf-pseudo.noa
 ...<略>
 # yum install hadoop-0.20 -y

** 主要コンポーネントのインストール [#fbecc104]
yum searchコマンドを使って、Hadoop-0.20.2に対応する主要コンポーネントを確認しインストールします。~

|名称|HDFS or MapReduce|Master or Slave|概略|h
|hadoop-0.20-namenode|HDFS|Master|DataNode上の情報をメタデータで管理、複製の配置や整合性の管理|
|hadoop-0.20-datanode|HDFS|Slave|実データの保存、Namenodeへの状態報告|
|hadoop-0.20-secondarynamenode|HDFS|Master|障害対策の1つ、一定の間隔でNamenodeのバックアップを取得|
|hadoop-0.20-jobtracker|MapReduce|Master|jobの受付、処理の割当、管理|
|hadoop-0.20-tasktracker|MapReduce|Slave|JobTrackerから割当てられた処理を実行するワーカー|
~
 # yum install hadoop-0.20-namenode hadoop-0.20-datanode
 hadoop-0.20-secondarynamenode hadoop-0.20-jobtracker
 hadoop-0.20-tasktracker -y
 注:文書では改行していますが、実コマンドはyumから-yまで1行で実行しています。
:Note|本手順ではsecondarynamenodeのインストールはしていますがサービスとして実行はしていません。~
~
Hadoopインストール完了後、mapred,hdfsユーザが追加されていることを確認します。~

 # cat /etc/passwd
 
 <略>
 beat:x:500:500:xxxxx:/home/beat:/bin/bash
 mapred:x:101:107:Hadoop MapReduce:/usr/lib/hadoop-0.20:/bin/bash
 hdfs:x:102:106:Hadoop HDFS:/usr/lib/hadoop-0.20:/bin/bash
:Note|事前にhadoopユーザを作成していた場合CDH3beta4ではhadoopのインストール時にユーザ名がhadoopからhdfsに変更されています。
~
*** その他のコンポーネント [#g3d60327]
本手順では使用しませんが、設定参考のため擬似分散モード用設定をインストールします。~

 # yum install hadoop-0.20-conf-pseudo -y
また端末上でのブラウジングのためテキストブラウザをインストールします。~

 # yum install w3m -y

その他CDH3 beta4から入手できるコンポーネントとインストール時のパッケージ名の対応は以下の通りです。~

|コンポーネント名|パッケージ名|概略|参照URL|h
|Flume|Flume|データローディングインフラ|http://archive.cloudera.com/cdh/3/flume/Cookbook/index.html|
|Sqoop|Sqoop|MySQLからHadoopへのデータインポートツール|http://archive.cloudera.com/cdh/3/sqoop/SqoopDevGuide.html|
|Hue|Hue|Hadoop User Experience(HadoopのUI)|http://archive.cloudera.com/cdh/3/hue/|
|Pig|hadoop-pig|データセットを探索するための対話的インターフェース|http://archive.cloudera.com/cdh/3/pig/|
|Hive|hadoop-hive|SQLライクな言語|http://hive.apache.org/|
|HBase|hadoop-hbase|Bigtable Storage System。HDFSとは逆に細かい大量のデータを扱うためのHDFS上に作成するFile System|http://hbase.apache.org/|
|ZooKeeper|hadoop-zookeeper|設定情報、名前付けなどの設定、保守サービス|http://zookeeper.apache.org/|
|Oozie server|Oozie|ワークフローエンジン|http://archive.cloudera.com/cdh/3/oozie/|
|Oozie client|oozie-client|ワークフローエンジン|http://archive.cloudera.com/cdh/3/oozie/|
|Whirr|Whirr|AmazonEC2のようなクラウドとの連携API|http://archive.cloudera.com/cdh/3/whirr/index.html|
~
* Hadoopの設定 [#j1377439]
Hadoopのモードは完全分散モード(クラスタ)設定を使用します。Hadoopの完全分散モード用の設定、確認について記載しています。以下の設定は各マシン同じです。1台分の完全分散モード用設定完了後、設定ディレクトリをscpなどでコピーすることで作成時間を短縮できます。
~
** hadoop-0.20-conf.bc_clusterの設定 [#i10a8f15]
完全分散モードに必要な設定ディレクトリをconf.bc_clusterという名前で作成します。/etc/hadoop-0.20/conf.emptyから/etc/hadoop-0.20/conf.bc_clusterをコピーをします。~

 # cp -r /etc/hadoop-0.20/conf.empty hadoop-0.20/conf.bc_cluster

:Note|conf.emptyは設定が記載されていないテンプレートです。これを元に幾つかの設定を作成し、設定を切り替えてHadoopを起動するためにconf.emptyからコピーをしています。

- core-site.xml ~
core-site.xmlにはHadoopの共通設定を記載します。hadoop.tmp.dirはここでは/hadoopに設定しています。またfs.default.nameはatomcloud2:8020 です。本手順ではMasterにatomcloud2を設定しています。~

 # cat /etc/hadoop-0.20/conf.bc_cluster/core-site.xml
 
 <?xml version="1.0"?>
 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 <!-- Put site-specific property overrides in this file. -->
 
 <configuration>
   <property>
     <name>hadoop.tmp.dir</name>
     <value>/hadoop</value>
   </property>
 
   <property>
     <name>fs.default.name</name>
     <value>hdfs://atomcloud2:8020</value>
     <description>The name and URI of the default FS.</description>
   </property>
 
 </configuration>
~
- hdfs-site.xml ~
hdfs-site.xmlにはHDFSに関する設定を記載します。ここではdfs.permissionsをfalseにしhdfsユーザ以外でもHDFSを扱えるようにしています。また複製数の設定replicationを3にしています、適宜数値を変更してください。~

 # cat /etc/hadoop-0.20/conf.bc_cluster/hdfs-site.xml
 
 <?xml version="1.0"?>
 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
  
 <!-- Put site-specific property overrides in this file. -->
 	
 <configuration>
         <property>
                 <name>dfs.name.dir</name>
                 <value>${hadoop.tmp.dir}/dfs/name</value>
         </property>
         <property>
                 <name>dfs.data.dir</name>
                 <value>${hadoop.tmp.dir}/dfs/data</value>
         </property>
         <property>
                 <name>dfs.replication</name>
                 <value>3</value>
         </property>
         <property>
                  <name>dfs.permissions</name>
                  <value>false</value>
         </property>
 
 </configuration>
:Note|replicationは実データを複製する数です。Slaveが1台の場合はreplication数は1に設定します。
~
- mapred-site.xml ~
mapred-site.xmlはMapReduceに関する設定を記載しています。mapred.job.trackerのポートは上記core-site.xmlのポート+1に設定しています。~
ポート番号は変更する必要はありません。~

 # cat /etc/hadoop-0.20/conf.bc_cluster/mapred-site.xml
 
 <?xml version="1.0"?>
 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 
 <!-- Put site-specific property overrides in this file. -->
 
 <configuration>
         <property>
                 <name>mapred.job.tracker</name>
                 <value>atomcloud2:8021</value>
         </property>
 </configuration>
:Note|core-site.xml、hdfs-site.xml、mapred-site.xmlの詳細については[[clustter setup>http://hadoop.apache.org/common/docs/current/cluster_setup.html]]内の[[core-site.xml>http://hadoop.apache.org/common/docs/current/cluster_setup.html#core-site.xml]]、[[hdfs-site.xml>http://hadoop.apache.org/common/docs/current/cluster_setup.html#hdfs-site.xml]]、[[mapred-site.xml>http://hadoop.apache.org/common/docs/current/cluster_setup.html#mapred-site.xml]]をご覧ください。
~
- masters ~
mastersにはMasterの役割をもつホスト名を明記します。本手順ではmastersファイルにatomcloud2を設定します。~

 # cat /etc/hadoop-0.20/conf.mycluster/masters
 
 atomcloud2

- slaves ~
slavesにはSlaveの役割をもつホスト名を明記します。本手順ではatomcloud1、atomcloud3〜8にします。またSlaveの台数によって適宜増減し設定します。~

 # cat /etc/hadoop/conf.bc_cluster/slaves
 
 atomcloud1
 atomcloud3
 ...<略>
 atomcloud8

** hadoo-0.20-confの設定 [#r3045818]
hadoo-0.20-confの優先順位設定は/usr/sbin/alternativesを使用します。alternativesは設定ファイルとそのシンボリックリンクを切り替えるためのコマンドです。~

:Note| 使用法は『 alternatives --install <リンク> <名前> <パス> <優先度> 』です。その他にも明示的にパスを指定しその設定を反映させることもできます。~

hadoop-0.20-confの現在の設定の確認をします。~

 # alternatives --display hadoop-0.20-conf
 hadoop-0.20-conf -ステータスは自動です。
 リンクは現在 /etc/hadoop-0.20/conf.pseudo を指しています。
 /etc/hadoop-0.20/conf.empty - 優先項目 10
 /etc/hadoop-0.20/conf.pseudo - 優先項目 30
 現在の「最適」バージョンは /etc/hadoop-0.20/conf.pseudo です。
 
hadoop-0.20-confの優先度を変更します。conf.bc_clusterに優先度60を設定します。alternatives --installを使用し<リンク>の位置は/etc/hadoop-0.20/conf、<名前>はhadoop-0.20-conf、<パス>には/etc/hadoop/conf.bc_cluster、<優先度>は60を設定します。~

 # alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf
 /etc/hadoop/conf.bc_cluster 60  
 注:上記コマンドには改行が含まれていますが1行で実行します。
 # alternatives --display hadoop-0.20-conf
 hadoop-0.20-conf -ステータスは自動です。
 リンクは現在 /etc/hadoop/conf.bc_cluster を指しています。
 /etc/hadoop-0.20/conf.empty - 優先項目 10
 /etc/hadoop-0.20/conf.pseudo - 優先項目 30
 /etc/hadoop/conf.bc_cluster - 優先項目 60
 現在の「最適」バージョンは /etc/hadoop/conf.bc_cluster です 。

これでhadoop-0.20-confに/etc/hadoop/conf.bc_clusterを反映する設定は完了です。~

** /hadoopディレクトリ [#a37f64f5]
hadoopディレクトリを作成し、HDFS、MapReduceが動作する状態に設定します。~
~
core-site.xmlのhadoop.tmp.dirの設定で/hadoopを指定していまので/以下にhadoopディレクトリを作成しディレクトリ全体をフルアクセスにします。あわせてdfs,mapredディレクトリも作成し所有者とグループをそれぞれhdfs:hadoop、mapred:hadoopに設定します。~

 # mkdir /hadoop
 # mkdir /hadoop/dfs
 # mkdir /hadoop/mapred
 # chown -R hdfs:hadoop /hadoop/dfs/
 # chown -R mapred:hadoop /hadoop/mapred/
 # ls -l /hadoop/
 合計 8
 drwxr-xr-x 3 hdfs   hadoop 4096  3月 31 09:44 dfs
 drwxr-xr-x 3 mapred hadoop 4096  3月 31 09:44 mapred

:Note|namenode、jobtrackerの起動時に所有者に対するエラーが起こる事をふせぐためdfs、mapredディレクトリのユーザグループをhadoopに設定しています。~
~
~
* 完全分散モードでの起動・停止 [#q7883122]
** Hadoopの各ノードの停止 [#b88c15b6]
Hadoopの各ノードの起動する前に必要のないHadoopの各サービス起動していればサービスを停止します。以下のコマンドはhadoo-0.20-に関連づいているノード全てを停止するコマンドになります。~

 # for service in /etc/init.d/hadoop-0.20-*; do $service stop; done

** hdfsのフォーマット [#w4b811b9]
Master、Slaveともにhdfsのフォーマットをhdfsユーザで実行します。またこの作業はSlaveが1台増える毎に実行します。実行せずにSlaveのマシンを増やしてHadoopを起動すると整合性あわないというエラーが起こるためです。~

 # sudo -u hdfs hadoop-0.20 namenode -format
 
 11/03/30 22:26:16 INFO namenode.NameNode: STARTUP_MSG:
 /************************************************************
 STARTUP_MSG: Starting NameNode
 STARTUP_MSG:   host = atomcloud2/192.168.0.212
 STARTUP_MSG:   args = [-format]
 STARTUP_MSG:   version = 0.20.2-CDH3B4
 <略>
 11/03/30 22:26:19 INFO common.Storage: Storage directory /hadoop/dfs/name has been successfully formatted.
 11/03/30 22:26:19 INFO namenode.NameNode: SHUTDOWN_MSG:
 /************************************************************
 SHUTDOWN_MSG: Shutting down NameNode at atomcloud2/192.168.0.212
 ************************************************************/

** 各ノードの起動と停止 [#c28e99d7]
各ノードの起動順は大きくHDFS->MapReduceの順で起動します。以下に書くノードの起動の概略を記載します。~

 Master(namenode)->Slave(datanode)->Master(jobtracker)->Slave(tasktracker)

Master(atomcloud2)のnamenode起動後に各Slave(atomcloud1、3〜8)のdatanodeを起動します。今回はテスト版としてsecondarynamenodeは起動しません。~
~
Slaveのdatanode起動後、Masternにて/mapred/systemを作成し所有者の変更を行いmasterのjobtrackerを起動します。その後各Slaveのtasktrackerを起動します。停止の際はMasterからノードを停止し各Slaveのノードを停止します、以下に各ノードの起動時と停止時を記載します。

- 各ノードの起動順~

- Masster :namenodeを以下のコマンドで起動します。~

 # /etc/init.d/hadoop-0.20-namenode start

- 各Slave :datanodeを以下のコマンドで起動します。~

 # /etc/init.d/hadoop-0.20-datanode start

- Master :hdfsユーザに切り替えて/mapred/systemの作成します。~

 # hadoop-0.20 fs -mkdir /mapred/system
 # su hdfs
 % hadoop-0.20 fs -chown -R mapred:supergroup /mapred
:Note|hdfsユーザで/mapred/systemをhdfs上に作成しないとreplicationの作成に失敗し、rootユーザで実行すると権限により所有者が変更できませんのでhdfsユーザで実行しています。~
~
- Master :jobtrackerを以下のコマンドで起動します。~

 # /etc/init.d/hadoop-0.20-jobtracker start

- 各slave :tasktrackerを以下のコマンドで起動します。~

 # /etc/init.d/hadoop-0.20-tasktracker start

- 各ノードの停止順~

- Masterのノードをを以下のコマンドで停止します。~

 # /etc/init.d/hadoop-0.20-jobtracker stop
 # /etc/init.d/hadoop-0.20-namenode stop

- 各Slaveのノードを以下のコマンドで停止します。~

 # /etc/init.d/hadoop-0.20-tasktracker stop
 # /etc/init.d/hadoop-0.20-datanode stop

各ノードが起動するとNameNodeとMap/Reduce AdministrationのWebUIが以下のURIで閲覧することでサービスの確認ができます。Node数を確認することでSlaveが起動しているかの確認ができます。すべてのNodeが反映されるまで若干時間がかかることがあります。~

 NameNode:http://atomcloud2:50070
 Map/Reduce Administration:http://atomcloud2:50030

- NameNodeのスクリーンショット~
#ref(namenode.jpg,,30%);~
#ref(namenode.jpg,,40%);~
~
- Map/Reduce Administrationのスクリーンショット~
#ref(mapreduce.jpg,,30%);~
#ref(mapreduce.jpg,,40%);~
~
* Examples and Test [#f377b761]
HadoopにはHDFS、Map/Reduceの動作確認用のExamplesとHadoopのI/O性能を測るBenchMark
のサンプルが含まれています。以下のコマンドを実行するとより詳細なExamplesの例とTestの例が表示されます。~
- Examples~

 # hadoop jar /usr/lib/hadoop-0.20/hadoop-0.20.2-CDH3B4-examples.jar
 An example program must be given as the first argument.
  ...<略>
  pi: A map/reduce program that estimates Pi using monte-carlo method.
  randomtextwriter: A map/reduce program that writes 10GB of random textual data per node.
  ...<略>

- Test~

 # hadoop jar /usr/lib/hadoop-0.20/hadoop-0.20.2-CDH3B4-test.jar
 An example program must be given as the first argument.
 Valid program names are:
  DFSCIOTest: Distributed i/o benchmark of libhdfs.
  DistributedFSCheck: Distributed checkup of the file system consistency.
  MRReliabilityTest: A program that tests the reliability of the MR framework by injecting faults/failures
  TestDFSIO: Distributed i/o benchmark.
  ...<略>

ここではExamplesのpiとTestに含まれるTestDFSIOのwrite、readとcleanをサンプルとして実行します。Examplesのpiの引数は10と1000。TestDFSIOの引数は1個のfilesizeは10MBのファイルの読み書きです、最後の -cleanは作成したファイルを削除します。writeとread時のTestDFSIO_results.logには追記型で記載されるので、以下のスクリプトでは -cleanの際も追記するようにしています。

- piの実行例~

 hadoop jar /usr/lib/hadoop-0.20/hadoop-examples-0.20.2-CDH3B4.jar pi 10 1000
 Number of Maps  = 10
 Samples per Map = 1000
 Wrote input for Map #0
 ...<略>
 11/04/11 19:29:39 INFO mapred.FileInputFormat: Total input paths to process : 10
 11/04/11 19:29:40 INFO mapred.JobClient: Running job: job_201104102156_0041
 11/04/11 19:29:41 INFO mapred.JobClient:  map 0% reduce 0%
 ...<略>
 11/04/11 19:30:09 INFO mapred.JobClient:     Reduce input records=20
 Job Finished in 30.142 seconds
 Estimated value of Pi is 3.14080000000000000000

- TestDFSIO~
write、read、cleanを一度でテストするために以下のようなスクリプトで実行しています。~

 #!/bin/sh
 echo "--- Nr:10 FS:10M(10*10MB:100MB)---" > TestDFSIO_results.log
 hadoop jar /usr/lib/hadoop-0.20/hadoop-test-0.20.2-CDH3B4.jar TestDFSIO -write -nrFiles 10 -filesize 10000
 sleep 1
 hadoop jar /usr/lib/hadoop-0.20/hadoop-test-0.20.2-CDH3B4.jar TestDFSIO -read -nrFiles 10 -filesize 10000
 sleep 1
 echo "---- clean ----" >> TestDFSIO_results.log
 hadoop jar /usr/lib/hadoop-0.20/hadoop-test-0.20.2-CDH3B4.jar TestDFSIO -clean  2>&1 | tee -a TestDFSIO_results.log
 echo "---- clean ----" >> TestDFSIO_results.log
TestDFSIO_results.logは以下のように出力されます。
 --- Nr:10 FS:10M(10*10MB:100MB)---
 ----- TestDFSIO ----- : write
            Date & time: Sun Apr 10 22:57:02 JST 2011
        Number of files: 10
 Total MBytes processed: 10
      Throughput mb/sec: 2.1867483052700636
 Average IO rate mb/sec: 2.351172685623169
  IO rate std deviation: 0.661258472040145
     Test exec time sec: 29.263 
 
 ----- TestDFSIO ----- : read
            Date & time: Sun Apr 10 22:57:36 JST 2011
        Number of files: 10
 Total MBytes processed: 10
      Throughput mb/sec: 4.050222762251924
 Average IO rate mb/sec: 4.336997032165527
  IO rate std deviation: 1.0029312896197553
     Test exec time sec: 29.292 
 
 ---- clean ----
 TestDFSIO.0.0.4
 11/04/10 22:57:40 INFO fs.TestDFSIO: nrFiles = 1
 11/04/10 22:57:40 INFO fs.TestDFSIO: fileSize (MB) = 1
 11/04/10 22:57:40 INFO fs.TestDFSIO: bufferSize = 1000000
 11/04/10 22:57:41 INFO fs.TestDFSIO: Cleaning up test files
 ---- clean ---- 

以上で、完全分散モードの動作確認は完了です。以下のGangliaの設定は必須設定ではありません。各サーバの使用状況のモニタリングをするためにGangliaを設定しています。

* Gangliaの設定 [#cd694ea3]
HDFS、Map/Reduce AdministrationにWebUIがありますが、クラスタリングマシン各マシンの時系列を含めたCPU、メモリ、ディスクの使用頻度の可視化ツールとしてGangliaをインストールします。役割としてはMaster、Slave、Monitorがあります。ここではMasterとMonitorをatomcloud2、その他のマシンは全てSlaveとして設定しています。詳細は[[ganglia.info>http://ganglia.info/]]をご覧ください。

** Gangliaのインストール [#n71639df]
atomcloud2でrpmforge(サードパーティリポジトリ)からx86_64版rpmforge-release-0.5.2-2.el5.rf.x86_64.rpmをダウンロードしインストールします。~

 # wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
 # rpm -ivh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm

GangliaのDownload頁からganglia monitor coreの最新版3.17をダウンロードします。~

 # wget http://sourceforge.net/projects/ganglia/files/ganglia%20monitoring%20core/3.1.7/ganglia-3.1.7.tar.gz/download
ダウンロード後rpmパッケージ化するためにrpmbuildを行うと以下のようなエラーが出ます。~

 # rpmbuild -tb --target noarch,x86_64 ganglia-3.1.7.tar.gz
 ビルド対象プラットフォーム: noarch,x86_64
 ターゲット noarch 用にビルド中
 エラー: ビルド依存性の失敗:
         libconfuse-devel は ganglia-3.1.7-1.noarch に必要とされています
         pcre-devel は ganglia-3.1.7-1.noarch に必要とされています
         rrdtool-devel は ganglia-3.1.7-1.noarch に必要とされています
         apr-devel > 1 は ganglia-3.1.7-1.noarch に必要とされています
表示されている必要な依存パッケージをインストールします。~

 # yum install libconfuse-devel pcre-devel rrdtool-devel apr-devel -y
再度rpmbuildを実行すると/usr/src/redhat/RPMS/以下にgangliaの各rpmが作成されています。~

 # rpmbuild -tb --target noarch,x86_64 ganglia-3.1.7.tar.gz
 # cd /usr/src/redhat/RPMS/x86_64/
 # ls
 ganglia-debuginfo-3.1.7-1.x86_64.rpm  ganglia-gmetad-3.1.7-1.x86_64.rpm  ganglia-gmond-modules-python-3.1.7-1.x86_64.rpm
 ganglia-devel-3.1.7-1.x86_64.rpm      ganglia-gmond-3.1.7-1.x86_64.rpm   libganglia-3_1_0-3.1.7-1.x86_64.rpm
 # ls ../noarch/
 ganglia-web-3.1.7-1.noarch.rpm

Gangliaのインストール先のMaster(atomcloud2)とSlave(atomcloud1、atomcloud3~8)にはganglia-gmond-3.1.7-1.x86_64.rpmとlibganglia-3_1_0-3.1.7-1.x86_64.rpmを使用します。ファイルは適宜scpなどを用いて各マシンにコピーします。
~
またMonitor(atomcloud2)にはganglia-gmetad-3.1.7-1.x86_64.rpmとganglia-web-3.1.7-1.noarch.rpmを使用します。Slaveに必要なrpmはscpなどを用いてコピーします。~
~
また、atomcloud2以外のマシンではrpmforgeがインストールされていないためGanliaに必要なlibconfuse-develなどをインストールする必要があります。
- Master(atomclod2)~

 # yum install libconfuse -y
 # rpm -ivh libganglia-3_1_0-3.1.7-1.x86_64.rpm
 # rpm -ivh ganglia-gmond-3.1.7-1.x86_64.rpm

- Slave(atomcloud1、atomcloud3〜8)~

 # wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
 # rpm -ivh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
 # yum install libconfuse -y
 # rpm -ivh libganglia-3_1_0-3.1.7-1.x86_64.rpm
 # rpm -ivh ganglia-gmond-3.1.7-1.x86_64.rpm

- Monitor(atomcloud2)~
Monitorにはganglia-gmetad、ganglia-webgmetad、httpdとphp、php-gdをインストールします。~

 # rpm -ivh ganglia-gmetad-3.1.7-1.x86_64.rpm
 # yum install php php-gd
 # rpm -ivh ganglia-web-3.1.7-1.noarch.rpm
 # cd /etc/ganglia/
 # ls
 conf.d  gmetad.conf  gmond.conf

** Master gmond.conf設定 [#td75a6c1]
Gangliaの設定ファイルgmond.confを記載します。clusterのnameを "Master Servers"と記載しbind_hostname = yesのコメントはずします。~

 # vi /etc/ganglia/gmond.conf
 ...<略>
 cluster {
   name = "Master Servers"
   owner = "unspecified"
   latlong = "unspecified"
   url = "unspecified"
 }
 ...<略>
 udp_send_channel {
   bind_hostname = yes
   #bind_hostname = yes # Highly recommended, soon to be default.
                        # This option tells gmond to use a source address
                        # that resolves to the machine's hostname.  Without
                        # this, the metrics may appear to come from any
                        # interface and the DNS names associated with
                        # those IPs will be used to create the RRDs.
   mcast_join = 239.2.11.71
   port = 8649
   ttl = 1
 }
 
 /* You can specify as many udp_recv_channels as you like as well. */
 udp_recv_channel {
   mcast_join = 239.2.11.71
   port = 8649
   bind = 239.2.11.71
 }

** Slave gmond.conf設定 [#n6b1b82e]
Masterと同様にSlaveのgmond.confを以下のように記載します。clusterのnameとbind_hostname = yesのコメントをはずします。また、mcast_joinのアドレスをMasterのmcast_joinのアドレスと異なるように設定します。~

 # vi /etc/ganglia/gmond.conf
 ...<略>
 cluster {
   name = "Slave Servers"
   owner = "unspecified"
   latlong = "unspecified"
   url = "unspecified"
 }
 
 /* The host section describes attributes of the host, like the location */
 host {
   location = "unspecified"
 }
 
 /* Feel free to specify as many udp_send_channels as you like.  Gmond
    used to only support having a single channel */
 udp_send_channel {
   bind_hostname = yes # Highly recommended, soon to be default.
                        # This option tells gmond to use a source address
                        # that resolves to the machine's hostname.  Without
                        # this, the metrics may appear to come from any
                        # interface and the DNS names associated with
                        # those IPs will be used to create the RRDs.
   mcast_join = 239.2.11.72
   port = 8649
   ttl = 1
 }
 
 /* You can specify as many udp_recv_channels as you like as well. */
 udp_recv_channel {
   mcast_join = 239.2.11.72
   port = 8649
   bind = 239.2.11.72
 }

** Master、Slave のGangliaサービスの起動 [#w69f6c4d]
各マシンでGangliaサービスのgmondを起動します。~

 # /etc/init.d/gmond start

** Monitor gmetad.conf設定 [#vccdeb04]
MonitorのGangliaの設定ファイルgmetad.confを以下に記載します。clusterで指定したnameと対象マシンを以下のようにスペース区切りで記載しています。~

 # vi /etc/ganglia/gmetad.conf
 
 #data_source "my cluster" localhost
 data_source "Master Servers" atomcloud2
 data_source "Slave Servers" atomcloud1 atomcloud3 atomcloud4 atomcloud5 atomcloud6 atomcloud7 atomcloud8

** MonitorのGangliaサービスの起動 [#n8cafbb5]
Monitorマシン上でhttpdのサービスを登録します。サービスレベルの設定は使用環境に合わせて適宜変更してください。~

 # chkconfig --list | grep httpd
 httpd           0:off   1:off   2:off   3:off   4:off   5:off   6:off
 # chkconfig httpd on
 # chkconfig --list | grep httpd
 httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
httpdとMonitorのGangliaサービスgmetadを起動します。~

 # /etc/init.d/httpd start
 # /etc/init.d/gmetad start

GanliaのWebUIをatomcloud2に設定していますので以下のURLで確認できます。~
http://atomcloud2/ganglia/ ~
- Gangliaのスクリーンショット~
#ref(ganglia.jpg,,30%)~
#ref(ganglia.jpg,,40%)~

以上でGangliaの設定は完了です。~

* 参考URL [#yf483e42]
- Hadoop による分散データ処理: 第 1 回 導入編
-- http://www.ibm.com/developerworks/jp/linux/library/l-hadoop-1/


BC::labsへの質問は、bc9-dev @ googlegroups.com までお願い致します。
トップ   新規 一覧 単語検索 最終更新   最終更新のRSS