So-net無料ブログ作成
  • ブログをはじめる
  • ログイン

インフラエンジニアのためのHadoop情報 障害復旧その1 [Hadoop]

Hadoopの障害の中でも、あらかじめ復旧手順を確認しておかなければいけないとすれば、
やはりNameNodeでしょう。
PrimaryNameNodeが停止するとHadoopクラスタは利用できなくなります。
fsコマンドでエラーが返ってくるようなら、NameNodeに問題が発生している場合があります。
NameNodeの障害を放置しておくと、HDFS上のデータが破損してしまう恐れがあるので、異常を
見つけたら速やかに復旧しましょう。
以下の例は、PrimaryNameNodeが停止した場合のエラーです。
$ hadoop fs -ls
10/07/06 18:18:06 INFO ipc.Client: Retrying connect to server: srv1/192.168.1.1:8020.
 Already tried 0
time(s).
10/07/06 18:18:07 INFO ipc.Client: Retrying connect to server: srv1/192.168.1.1:8020.
 Already tried 1
time(s).

PrimaryNameNodeの障害を取り除くことが出来たなら、Hadoopクラスタの復旧手順に入ります。
NameNodeが起動中の場合は、停止します。
$ sudo /sbin/service hadoop-0.20-namenode stop

メタデータの状態を確認します。
$ cd /var/lib/hadoop-0.20/cache/hadoop/dfs/name/current/
$ ls -la
drwxrwxr-x 2 hadoop hadoop   4096  7月  6 18:18 .
drwxrwxr-x 4 hadoop hadoop   4096  7月  6 18:18 ..
-rw-rw-r-- 1 hadoop hadoop    101  7月  6 18:18 VERSION
-rw-rw-r-- 1 hadoop hadoop      4  7月  6 18:18 edits
-rw-rw-r-- 1 hadoop hadoop 833380  7月  6 18:18 fsimage
-rw-rw-r-- 1 hadoop hadoop      8  7月  6 18:18 fstime

editsファイルが4バイトを超えていたり、fsimageが小さすぎたりする場合は、SecondaryNameNode
との通信が途中で切断された場合があります。そのような状態のまま、クラスタの再起動をする
と、最悪HDFS上のファイルが見えなくなってしまいます。
SecondaryNameNodeから取得したメタデータのバックアップを使用して復旧させましょう。
$ tar cvf /mnt/backup/namenode-bak.tar *

メタデータが正常に戻ったらNameNodeを起動します。
$ sudo /sbin/service hadoop-0.20-namenode start

HDFSの状態を確認します。
$ hadoop fsck /
:
Over-replicated blocks:        0 (0.0 %)
Under-replicated blocks:       0 (0.0 %)
Mis-replicated blocks:         0 (0.0 %)
Default replication factor:    3
Average block replication:     3.0
Corrupt blocks:                0
Missing replicas:              0 (0.0 %)
Number of data-nodes:          4
Number of racks:               1


The filesystem under path '/' is HEALTHY


インフラエンジニアのためのHadoop情報 DataNodeの取り外し [Hadoop]

Hadoopに新しいノードを追加して、古いノードを退役させたり、メンテナンスで一時的にクラスタから外したりしたい場合の手順を示します。
DataNodeをHadoopクラスタからいきなり外す(サービス停止やIP断)と、レプリケーション数が足りなくなり、「Under replicate」エラーが出たり、MapReduceタスクがエラーで終了したりします。いずれはHadoopがノード障害として自動で解消しますが、無駄なエラーや想定外の複製トラフィックは避けたいものです。
Hadoopではそんな時のために、予め取り外すノードを指定しておき、担当ブロックを残りノードで引き継いだのち、安全に取り外す機能があります。
作業はPrimaryNameNodeで行います。
/etc/hadoop-0.20/conf.cluster/にhosts.excludeなるファイルを作成して、取り外すノードのアドレスを記入します。(srv3.example.comが取り外したいノード)
$ vi hosts.exclude
srv3.example.com

このhosts.excludeファイルをhdfs-site.xmlファイル内に指定します。
$ sudo vi hdfs-site.xml

   dfs.hosts.exclude
   /etc/hadoop-0.20/conf/hosts.exclude


ノード情報を更新します。
$ hadoop dfsadmin -refreshNodes

WebUI(http://srv1.example.com:50070/)画面の「Decommissioning Nodes」にexclude指定したサーバの数が表示されます。また、「Number of Under-Replicated Blocks」に再配置対象のブロック数が表示されます。
「Decommissioning Nodes」の欄が0になり、「Dead Node」となれば、DataNodeを取り外すことができます。

インフラエンジニアのためのHadoop情報 DataNodeの追加 [Hadoop]

PrimaryNameNode,SecondaryNameNode,JobTracker,TaskTracker,DataNodeが一揃い出来たところ
で、スケールアウトをしてみましょう。
具体的には、DataNode及び、TaskTrackerを担当するノードを増やします。
DataNode、TaskTrackerを1台追加する手順を示します。
まずは、擬似分散用に構築した手順に従って、1台でHadoopが動く環境を準備し、クラスタ構築手順に従って、alternativeの設定までやっておきます。
これをDataNode、TaskTrackerノードとして、今現在動いているクラスタ環境に登録します。
クラスタ環境用の設定は、動いているクラスタ環境のノードからコピーします。
srv1.example.comから、追加するノードへ設定をコピーする例です。
$ mkdir /tmp/conf
$ cd /tmp/conf
$ scp srv1.example.com:/etc/hadoop-0.20/conf/* .
$ sudo chown hadoop:hadoop *
$ cp * /etc/hadoop-0.20/conf/

設定ファイルがコピーできたら、サービスを起動します。
$ sudo /sbin/service hadoop-0.20-datanode start
$ sudo /sbin/service hadoop-0.20-tasktracker start

起動を確認します。
$ sudo /usr/java/jdk1.6.0_20/bin/jps
20836 DataNode
21720 TaskTracker

起動が完了したら、NameNodeとの通信が始まり、クラスタ環境へノードが追加されたことを確認できるはずです。
PrimaryNameNodeへログインしてfsckコマンドを使って確認します。fsckコマンドはHDFS上のファイルシステムの整合性を調べて結果を表示します。そのとき登録されているDataNodeの数も表示されます。
$ hadoop fsck /
 :
 Number of data-nodes:          4
 Number of racks:               1

また、HDFS用のWebUIでも確認できます。ブラウザで以下のURLを指定して確認してみましょう。
http://[PrimaryNameNodeのアドレス]:50070
こちらの画面では、追加されたDataNode上にあるHDFSブロック数も確認できます。(追加直後は0のはず)
サービスが起動しない場合は、まず起動ログを確認してください。
$ sudo cat /var/log/hadoop-0.20/hadoop-hadoop-datanode-xxx.example.com.log

たいていの場合、dfsディレクトリが存在しないか、適切なパーミッションが設定されていません。
CDH2をインストールして、擬似分散をテストしてあれば、適切に設定されているはずですが、インストールしたままテストを実施していないと、ディレクトリが作成されません。
以下のように、ディレクトリを作成し、パーミッションを設定してください。
$ sudo mkdir /var/lib/hadoop-0.20
$ sudo chown hadoop:hadoop /var/lib/hadoop-0.20
$ sudo chmod 1777 /var/lib/hadoop-0.20/cache

1台での起動テストで、テストデータを登録した場合はdfsディレクトリ内のファイルを削除してください。
$ sudo rm -rf /var/lib/hadoop-0.20/cache/hadoop/dfs/data

Hadoopのconfディレクトリがclusterのものに切り替わっているかどうか確認してください。
$ sudo /usr/sbin/alternatives --display hadoop-0.20-conf


インフラエンジニアのためのHadoop情報 NameNodeバックアップ [Hadoop]

SecondaryNameNodeを起動したので、NameNodeのメタデータをバックアップしてみましょう。
バックアップは/var/lib/hadoop-0.20/cache/hadoop/dfs/namesecondary/previous.checkpoint配下にあるファイルをどこかへコピーするだけです。

$ cd /var/lib/hadoop-0.20/cache/hadoop/dfs/namesecondary/previous.checkpoint
$ ls
VERSION  edits  fsimage  fstime
$ tar cvf /mnt/backup/namenode-bak.tar *

メタデータのバックアップが取れたところで、リストアをしてみましょう。
リストアは、SecondaryNameNodeで取得したメタデータをPrimaryNameNodeに読み込ませます。
PrimaryNameNodeで作業を実施します。
PrimaryNameNodeを停止します。
$ sudo /sbin/service/hadoop-0.20-namenode stop

バックアップデータを展開します。
$ cd /var/lib/hadoop-0.20/cache/hadoop/dfs/name/current
$ sudo tar xvf /mnt/backup/namenode-bak.tar

PrimaryNameNodeを起動します。
$ sudo /sbin/service/hadoop-0.20-namenode start


nice!(0)  コメント(16)  トラックバック(0) 
共通テーマ:blog

インフラエンジニアのためのHadoop情報 SecondaryNameNode [Hadoop]

SecondaryNameNodeとは、PrimaryNameNodeから定期的にHDFSのメタデータと編集ログを取得し、編集ログをメタデータに反映処理をして、PrimaryNameNodeへ返します。また、そのたびにメタデータをバックアップ用にファイルに保存します。
クラスタを常時運用する場合は、SecdondaryNameNodeは事実上必須です。
PrimaryNameNodeと同じノードで動かすこともできますが、ある程度の規模のクラスタ環境では専用のサーバを準備しましょう。

それでは、SecondaryNameNodeを起動してみます。
Claudera版のHadoopでSecondaryNameNodeを起動するには専用のスクリプトを動かすだけです。
$ sudo /sbin/service hadoop-0.20-secondarynamenode start

起動すると、(デフォルトでは)1時間おきに、/var/lib/hadoop-0.20/cache/hadoop/dfs/namesecondary/current配下にPrimaryからメタデータが転送されます。
/var/lib/hadoop-0.20/cache/hadoop/dfs/namesecondary/previous.checkpoint配下にメタデータのバックアップファイルが作成されます。



インフラエンジニアのためのHadoop情報 クラスタ構築その2 [Hadoop]

同じく、JobTrackerを担当するサーバのアドレスを参照するように設定します。

/etc/hadoop-0.20/conf.cluster/mapred-site.xmlを編集して
  mapred.job.tracker
   localhost:8021

部分を
   mapred.job.tracker
   srv1.example.com:8021

と修正します。

せっかくDataNodeを2台動かすので、レプリケーション数も増やしておきます。
/etc/hadoop-0.20/conf.cluster/hdfs-site.xmlを編集して
   dfs.replication
   1


   dfs.replication
   2

(3台以上で動かす場合レプリケーション数は3にしておきましょう)

擬似分散で動かしたことがある場合は、そのときに作られたデータをそのままにしておくと、クラスタ構成での起動時にエラーになってしまうので、削除しておきます。
$ sudo rm -rf /var/lib/hadoop-0.20/cache/hadoop/dfs/data

NameNodeとJobTrackerのサーバを起動します。(1台目)
$ sudo /sbin/service hadoop-0.20-namenode start
$ sudo /sbin/service hadoop-0.20-jobtracker start

他の2台では、DataNodeとTaskTrackerを起動します。
$ sudo /sbin/service hadoop-0.20-datanode start
$ sudo /sbin/service hadoop-0.20-tasktracker start

これで、3台(1台はNameNode)構成のHadoopクラスタが起動されました。
nice!(0)  コメント(8)  トラックバック(0) 
共通テーマ:blog

インフラエンジニアのためのHadoop情報 クラスタ構築その1 [Hadoop]

前回では、1台で動かしてみましたが、今回は複数台で動かします。
構成として、NameNodeとJobTracker用に1台、DataNodeとTaskTracker用に2台を想定します。
Cloudera版のHadoopでは、altenertiveを使って、1台での起動、擬似分散での起動、クラスタでの起動を設定ファイルを切り替えます。まずは現在の設定を見てみましょう。
$ sudo /usr/sbin/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 です。

クラスタ用の設定ファイルを一から作成するのは面倒なので、擬似分散用のものをコピーして必要なところだけ修正することにします。3台全てが対象です。
$ sudo cp -r /etc/hadoop-0.20/conf.pseudo /etc/hadoop-0.20/conf.cluster

クラスタ用のaltenertivesを登録します。
$ sudo /usr/sbin/alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf \
/etc/hadoop-0.20/conf.cluster 50
$ sudo /usr/sbin/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.cluster - 優先項目 50
現在の「最適」バージョンは /etc/hadoop-0.20/conf.cluster です。

alternativeをクラスタ用のものに切り替えます。
$ sudo /usr/sbin/alternatives --set hadoop-0.20-conf /etc/hadoop-0.20/conf.cluster

切り替わっていることを確認します。
$ sudo /usr/sbin/alternatives --display hadoop-0.20-conf
hadoop-0.20-conf - ステータスは手動です。
リンクは現在 /etc/hadoop-0.20/conf.cluster を指しています。
/etc/hadoop-0.20/conf.empty - 優先項目 10
/etc/hadoop-0.20/conf.pseudo - 優先項目 30
/etc/hadoop-0.20/conf.cluster - 優先項目 50
現在の「最適」バージョンは /etc/hadoop-0.20/conf.cluster です。

クラスタを構成する全てのサーバで、NameNodeを担当するサーバのアドレスを参照するように設定します。
/etc/hadoop-0.20/conf.cluster/core-site.xmlを編集して、
  fs.default.name
   hdfs://localhost:8020

部分を
  fs.default.name
   hdfs://srv1.example.com:8020

に変更します。ここでは、srv1.example.comがNameNodeのサーバアドレス、ポートは8020番を使用する例です。ポート番号は必要に応じて変更してください。

インフラエンジニアのためのHadoop情報 動かしてみる [Hadoop]

pseudo distributedモードとは、擬似分散のことで、1台の中で分散モードと同じような状態でプロセスを起動させます。とりあえずの動作確認にはもってこいです。
それでは、pseudo distributedモードで起動してみます。
hadoop-0.20-conf-pseudoをインストールすると、/etc/hadoop-0.20/conf.pseudoに設定済みのファイルが置かれ、/etc/hadoop-0.20/confにシンボリックリンクが張られます。
起動は、/etc/init.d/に置かれたスクリプトを使います。
$ sudo /sbin/service hadoop-0.20-namenode start
$ sudo /sbin/service hadoop-0.20-jobtracker start
$ sudo /sbin/service hadoop-0.20-tasktracker start
$ sudo /sbin/service hadoop-0.20-datanode start

起動するとJavaのプロセスが立ち上がるので、確認してみます。
$ sudo /usr/java/jdk1.6.0_20/bin/jps
11974 NameNode
12327 TaskTracker
12097 DataNode
16228 JobTracker

起動スクリプトに対応した4つのプロセスが動いているのが確認できます。

Hadoopに添付されているMapReduceのサンプルを動かしてます。
Hadoopの設定ファイルからdfsで始まる文字列を抽出します(grep)。
$ hadoop fs -mkdir input
$ hadoop fs -put /etc/hadoop-0.20/conf/*.xml input
$ hadoop jar /usr/lib/hadoop-0.20/hadoop-*-examples.jar grep input output 'dfs[a-z.]+'
$ hadoop fs -ls output
Found 2 items
drwxr-xr-x  - kin supergroup       0 2010-06-24 14:51 /user/kin/output/_logs
-rw-r--r--  2 kin supergroup      62 2010-06-24 14:51 /user/kin/output/part-00000

出力結果を確認する。
$ hadoop fs -cat output/part-00000
1       dfs.name.dir
1       dfs.permissions
1       dfs.replication
1       dfsadmin


インフラエンジニアのためのHadoop情報 Hadoopインストール [Hadoop]

インストールする環境は、CentOS5.xを前提として話を進めます。
インストールするHadoopはCloudera版のCDH2というパッケージです。
これを使う理由は、運用時にssh環境を必要としない、サービスの管理者と利用者とを分けて管理するのに便利なように作られているためです。
CDH2についてのインストールの詳細については、
https://docs.cloudera.com/display/DOC/Hadoop+Installation+Documentation+for+CDH2
を参照してください。

Hadoopをインストールする前に、HadoopはJavaで動いているので、まずはこれをインストールすることから始めます。
JavaはSun、もといOracleのJDK6をダウンロードしてインストールします。
(OpenJDKでは動きません)
Javaのインストールが完了したら、CDH2パッケージをインストールするわけですが、CDH2はインストールにyumを利用します。そのためのレポジトリを設定します。
$ cd /etc/yum.repos.d/
$ sudo wget http://archive.cloudera.com/redhat/cdh/cloudera-cdh2.repo

Hadoop本体をyumでインストール。
$ sudo yum install hadoop-0.20

動作確認のためと、設定ファイルのサンプル用にpseudo-distributed mode用の設定ファイルもインストール。
$ sudo yum install hadoop-0.20-conf-pseudo

nice!(0)  コメント(108)  トラックバック(0) 
共通テーマ:blog

インフラエンジニアのためのHadoop情報 [Hadoop]

昨今、大規模データの分散環境での集計に「Hadoop」がもてはやされています。
情報も増えてきて、実際に自分のPCでMapReduceのサンプルプログラムを走らせてみた人も多いのではないでしょうか。
しかし、「とりあえず起動してみた」とか「MapReduceが動いた」という情報はいっぱいあっても、実際に複数台のサーバ環境でクラスタ構成を組み、運用を開始するための実践的な情報は少ないような気がします。
ここでは、Hadoopで10数台のクラスタ環境を構築して運用までたどり着いた経験から、環境構築をするエンジニアのためのポイントとなる情報を書いていこうと思います。

なお、「Hadoopって何」「MapReduceってどうやって作る?」みたいなお話は、優良な情報がいろんなサイトにいっぱいあるので、そちらに譲るとします。
タグ:Hadoop MapReduce

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は180日以上新しい記事の更新がないブログに表示されております。