Hadoop

Hadoop/Atom-Server


Atom Serverを使用し、Hadoopを完全分散モード(クラスタ)で構築します。大きな項目は以下のとおりです。

・Hadoopについて
・Atom Serverのマシンスペック
・CentOS5.5-x86_64のインストールと各設定
・CDH3beta4のインストール
・Hadoopの設定と各ノードの起動
・サンプルプログラムの実行
・Ganglia(サーバ監視ソフトウェア)の導入
atomcloud.jpg

(使用するAtom-Server。Atom-Serverの詳細な写真はこちら)

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

Hadoop について

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や、HBaseをご覧ください。

HadoopのソフトウェアはCommon、HDFS、MapReduceから構成されています。CommonはHadoopプロジェクトのサポートユーティリティです。HDFS、MapReduceの役割とそれぞれのMasterサーバ、Slaveサーバの各ノード名称を以下に記載します。

名称役割MasterSlave
HDFSHadoop Distributed File System の略称、分散、複製の機能を備えた大規模ファイルシステムNameNodeDataNode
MapReduce大規模分散システム上でのプロセス並列化のフレームワークJobTrackerTaskTracker


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

  • HDFS
    名称概略Master or Slave
    NameNodeDataNode上の情報をメタデータで管理、複製の配置や整合性の管理Master
    DataNode実データの保存、状態の報告Slave
    Secondarynamenode障害対策の1つ、一定の間隔でNamenodeのバックアップを取得Master

Note
本手順では実行していませんがHadoopではMasterが単一障害点になるため、その対策として一定の間隔でNamenodeのバックアップを取るためのサービスSecondarynamenodeがあります。

  • MapReduce
    名称概略Master or Slave
    JobTrackerjobの受付、処理の割当、管理Master
    TaskTrackerJobTrackerから割当てられた処理を実行するワーカーSlave

それぞれの詳細についてはCommonHDFSMapReduceをご覧ください。

また動作モードとしてローカルモード、擬似分散モード(pseudo)、完全分散モードがあります。ここでは完全分散モードについて記載しています。それぞれの概略は以下のとおりです。

名称概略
ローカルモード1台での実行、Hadoopとしての機能は使わずJavaの機能を使用
擬似分散モード1台でMasterとSlaveの実行
完全分散モード複数台でMasterとSlaveの実行

各動作モードの詳細についてはGetting Startedをご覧ください。

CDHについて

CDHはCloudera社提供されている『Cloudera Distribution for apache Hadoop』の略称です。CDHではHadoopとHadoopの関連プロジェクト(以降、コンポーネントと記載)であるHbase、Pig、Hiveなどとの整合性をある程度とりリリースされています。このためHadoopおよびコンポーネントの導入が比較的容易になっています。

本手順ではCDH3beta4(2011年4月1日当時の最新)で記載しています。2011年4月14日にCDH3がリリースされました。詳細についてはCDH3+InstallationDistribution Detailsをご覧ください。

Hadoopのバージョンについて

CDH3beta4に含まれるhadoop-0.20.2を使用しています。またhadoop.apache.orgで公開されているHadoopの最新版は0.21.0です。0.20.xと0.21.xでは機能やAPIなどに変更があります。詳細についてはrelease 0.21.0 available をご覧ください。

Hadoopサーバについて

AtomServerの各マシンにCentOS5.5-x86_64をインストールし設定を行います。CentOSのインストール後CDH3beta4のリポジトリを追加しHadoopと主要コンポーネントをインストール、設定を行います。一部の設定(固定IP設定、Master、Slaveの各サービス)以外はすべてのマシンで同じ設定を行います。

Note
本手順でのHadoopと主要コンポーネントとはCommon、HDFSとMapReduceのコンポーネントを指しています。

Atom Server構成

今回使用しているマシンの構成は、同型Atomボード8枚1組で構成されています。

  • Atom Server
    atomcloud.jpg atomcloud2.jpg

    (このAtomサーバは東京エレクトロンデバイス様のご好意によりお借りしております。)
    様々な角度からAtom Serverを撮影しました。Atom-Serverの各画像 をご覧ください。
  • スペック(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の設定

インストールはCentOS-5.6-x86_64-LiveCD.isoを使用します。isoファイルはこちらからダウンロードをします。

CentOS-5.5-x86_64のインストール

インストールパッケージの選択は以下のとおりです。

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

アカウント設定

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

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

その他のインストール時の設定

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

ネットワーク設定

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の設定

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の設定

時刻を確認し日本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を設定しています。

環境変数設定

予め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が正しく設定されているかの確認をしてください。

不要なサービスの停止

  • 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のインストール

以下のサイトから最新の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設定の制限事項

  • 今回のテストでは意識してセキュリティに関する事象を除外しています(sshdのrootログインなど)。

CDH3beta4のリポジトリ追加

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』をご覧ください。

# 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がリリースされました。詳細についてはこちらをご覧ください。

Hadoopのインストール

先ほど更新した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

主要コンポーネントのインストール

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

名称HDFS or MapReduceMaster or Slave概略
hadoop-0.20-namenodeHDFSMasterDataNode上の情報をメタデータで管理、複製の配置や整合性の管理
hadoop-0.20-datanodeHDFSSlave実データの保存、Namenodeへの状態報告
hadoop-0.20-secondarynamenodeHDFSMaster障害対策の1つ、一定の間隔でNamenodeのバックアップを取得
hadoop-0.20-jobtrackerMapReduceMasterjobの受付、処理の割当、管理
hadoop-0.20-tasktrackerMapReduceSlaveJobTrackerから割当てられた処理を実行するワーカー


# 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に変更されています。

その他のコンポーネント

本手順では使用しませんが、設定参考のため擬似分散モード用設定をインストールします。

# yum install hadoop-0.20-conf-pseudo -y

また端末上でのブラウジングのためテキストブラウザをインストールします。

# yum install w3m -y

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

コンポーネント名パッケージ名概略参照URL
FlumeFlumeデータローディングインフラhttp://archive.cloudera.com/cdh/3/flume/Cookbook/index.html
SqoopSqoopMySQLからHadoopへのデータインポートツールhttp://archive.cloudera.com/cdh/3/sqoop/SqoopDevGuide.html
HueHueHadoop User Experience(HadoopのUI)http://archive.cloudera.com/cdh/3/hue/
Pighadoop-pigデータセットを探索するための対話的インターフェースhttp://archive.cloudera.com/cdh/3/pig/
Hivehadoop-hiveSQLライクな言語http://hive.apache.org/
HBasehadoop-hbaseBigtable Storage System。HDFSとは逆に細かい大量のデータを扱うためのHDFS上に作成するFile Systemhttp://hbase.apache.org/
ZooKeeperhadoop-zookeeper設定情報、名前付けなどの設定、保守サービスhttp://zookeeper.apache.org/
Oozie serverOozieワークフローエンジンhttp://archive.cloudera.com/cdh/3/oozie/
Oozie clientoozie-clientワークフローエンジンhttp://archive.cloudera.com/cdh/3/oozie/
WhirrWhirrAmazonEC2のようなクラウドとの連携APIhttp://archive.cloudera.com/cdh/3/whirr/index.html


Hadoopの設定

Hadoopのモードは完全分散モード(クラスタ)設定を使用します。Hadoopの完全分散モード用の設定、確認について記載しています。以下の設定は各マシン同じです。1台分の完全分散モード用設定完了後、設定ディレクトリをscpなどでコピーすることで作成時間を短縮できます。

hadoop-0.20-conf.bc_clusterの設定

完全分散モードに必要な設定ディレクトリを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内のcore-site.xmlhdfs-site.xmlmapred-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の設定

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ディレクトリ

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に設定しています。


完全分散モードでの起動・停止

Hadoopの各ノードの停止

Hadoopの各ノードの起動する前に必要のないHadoopの各サービス起動していればサービスを停止します。以下のコマンドはhadoo-0.20-に関連づいているノード全てを停止するコマンドになります。

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

hdfsのフォーマット

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
************************************************************/

各ノードの起動と停止

各ノードの起動順は大きく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のスクリーンショット
    namenode.jpg

  • Map/Reduce Administrationのスクリーンショット
    mapreduce.jpg

Examples and Test

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の設定

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

Gangliaのインストール

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設定

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設定

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サービスの起動

各マシンでGangliaサービスのgmondを起動します。

# /etc/init.d/gmond start

Monitor gmetad.conf設定

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サービスの起動

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のスクリーンショット
    ganglia.jpg

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

参考URL


添付ファイル: filemapreduce.jpg 1600件 [詳細] filenamenode.jpg 1655件 [詳細] fileatomcloud2.jpg 1580件 [詳細] fileatomcloud.jpg 1757件 [詳細] fileganglia.jpg 1755件 [詳細]

BC::labsへの質問は、bc9-dev @ googlegroups.com までお願い致します。
トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2011-04-18 (月) 14:41:59 (4757d)