検索エンジンを作る(予定)その3 〜 HBaseを分散モードに移行
過去の記事
背景・前提
各マシンの役割分担
今まではVPS1台だったけど、それだとどうにもならないので、とりあえず2台にして、それらを以下のように振り分けた。今後もう少し台数を増やす予定。各プロセスの役割については、各種ドキュメントを参照。
両方共メモリ2GB・・・高性能マシンをじゃんじゃん使えるお金が欲しい・・・
MapReduceのジョブはとりあえず動かす予定がないので、今のところJobTrackerとTaskTracker動かしていない。インストールは一応した。
ZooKeeperは別のノードにしたほうがいいと、こちらのページにも書いてあったり、こないだの分散処理勉強会でも聞いたので、今後ZooKeeperは別ノードにする予定。
インストール関連
CDHに切り替え
今まで、HBaseはダウンロードしてきたtarボールを解凍して使っていたけど、Clouderaが出しているCDHというのを使ったほうが良いという話を聞いて、そちらを使うことにした。
CDHでのインストールのいい所は、面倒な設定・作業をある程度最初からやってくれる所。例えば、以下の様なこと。
- ulimitでリソースの上限値を変更
- ユーザーの作成
- 分かりやすいディレクトリ構成
- alternative で設定を切り替えられるようになっている
CDHにはいくつかのバージョンがあるが、NutchはHBase 0.90系にしか対応していないので、HBase 0.90系が含まれるCDH3 Update 5を使用することにした。CDHの各バージョンの違いはこちら。
インストールはCDHのyumレポジトリを追加して、後は普通にyumでパッケージをインストールできるので、ここでは詳細は省略。
設定
CDH3 Installation Guideを見ながらやったら、なんとか大丈夫だったので、まずはこれを穴が開くくらい熟読すると良いと思う。
マスター・スレーブ共通
ドキュメントに書いてあるけど、こんな感じでクラスター用の設定ファイルのディレクトリを作成。
$ cd /etc/hadoop/conf $ sudo cp -a conf.empty/ conf.my_cluster $ sudo alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf /etc/hadoop-0.20/conf.my_cluster 50
後は設定ファイルの編集。
/etc/hadoop/conf.my_cluster/core-site.xml
<configuration> <property> <name>fs.default.name</name> <value>hdfs://node1.example.com/</value> </property> </configuration>
HDFS Name Node (マスター)
/etc/hadoop/conf.my_cluster/hdfs-site.xml
<configuration> <property> <name>dfs.name.dir</name> <!-- 任意のディレクトリ --> <value>/data/dfs/name</value> </property> </configuration>
HDFS Data Node(スレーブ)
/etc/hadoop/conf.my_cluster/hdfs-site.xml
<configuration> <property> <name>dfs.data.dir</name> <!-- 任意のディレクトリ --> <value>/data/dfs/data</value> </property> </configuration>
ZooKeeper (マスター)
/etc/zookeeper/zoo.cfg
変更点のみ
server.0=node1.example.com:2888:3888
スレーブではZooKeeperは動かさないので不要だと思ったけど、スレーブでHBaseのシェルを動かした所以下の様なエラーが出た(が、実際には動作している)。
hbase(main):001:0> create 'test', 'cf' 13/02/05 18:37:00 FATAL zookeeper.ZKConfig: The server in zoo.cfg cannot be set to localhost in a fully-distributed setup because it won't be reachable. See "Getting Started" for more information.
スレーブの /etc/zookeepr/zoo.cfg もマスターと同じようにしとかないと、いけないっぽい。これ、関係あるかな?
HBase Master、HBase Region Server 共通
/etc/hbase/conf/hbase-site.xml
<configuration> <property> <name>hbase.zookeeper.quorum</name> <value>node1.example.com</value> <description>The directory shared by RegionServers. </description> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/var/zookeeper</value> <description>Property from ZooKeeper's config zoo.cfg. The directory where the snapshot is stored. </description> </property> <property> <name>hbase.rootdir</name> <value>hdfs://node1.example.com:8020/hbase</value> <description>The directory shared by RegionServers. </description> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> <description>The mode the cluster will be in. Possible values are false: standalone and pseudo-distributed setups with managed Zookeeper true: fully-distributed with unmanaged Zookeeper Quorum (see hbase-env.sh) </description> </property> </configuration>
/etc/hbase/conf/hbase-env.sh (差分のみ)
--- hbase-env.sh.org 2013-02-05 17:10:57.199884113 +0900 +++ hbase-env.sh 2013-02-05 17:53:01.788196458 +0900 @@ -73,4 +73,4 @@ # export HBASE_SLAVE_SLEEP=0.1 # Tell HBase whether it should manage it's own instance of Zookeeper or not. -# export HBASE_MANAGES_ZK=true +export HBASE_MANAGES_ZK=false
/etc/hbase/conf/regionservers
node2.example.com
MapReduce Job Tracker (マスター)
しばらく使わないけど、とりあえず設定だけ。
/etc/hadoop/conf.my_cluster/mapred-site.xml
<configuration> <property> <name>mapred.job.tracker</name> <!-- ポート番号も指定しないとエラーになる ポート番号は何でもよさそうだが、以下を参考に 54311 にした。 http://wiki.apache.org/hadoop/GettingStartedWithHadoop --> <value>node1.example.com:54311</value> </property> </configuration>
MapReduce Task Tracker (スレーブ)
しばらく使わないけど、とりあえず設定だけ。
/etc/hadoop/conf.my_cluster/mapred-site.xml
<configuration> <property> <name>mapred.job.tracker</name> <value>node1.example.com:54311</value> </property> <property> <name>mapred.local.dir</name> <value>/data/mapred/local</value> </property> </configuration>
ディレクトリの作成等
マスター
$ sudo mkdir -p /data/dfs/name $ sudo chown hdfs:hadoop /data/dfs/name $ sudo chmod 700 /data/dfs/name
スレーブ
$ sudo mkdir -p /data/dfs/data $ sudo chown hdfs:hadoop /data/dfs/data $ sudo chmod 700 /data/dfs/data $ sudo mkdir -p /data/mapred/local $ sudo chown -R mapred:hadoop /data/mapred/local
HDFS
[root@node1 ~]# sudo -u hdfs hadoop namenode -format [root@node1 ~]# sudo -u hdfs hadoop fs -mkdir /tmp [root@node1 ~]# sudo -u hdfs hadoop fs -chmod -R 1777 /tmp [root@node1 ~]# sudo -u hdfs hadoop fs -mkdir /mapred/system [root@node1 ~]# sudo -u hdfs hadoop fs -chown mapred:hadoop /mapred/system [root@node1 ~]# sudo -u hdfs hadoop fs -mkdir /hbase [root@node1 ~]# sudo -u hdfs hadoop fs -chown hbase /hbase
起動
これで一通り完了(書き漏れがなければ)。後は起動するだけなんだけど、起動の順番が決まっている。
今回の構成だと、以下の順番に起動。停止は逆の順番で。