k4200’s notes and thoughts

Programmer side of k4200

検索エンジンを作る(予定)その3 〜 HBaseを分散モードに移行

過去の記事

  • 第1回: Nutch + HBaseを動かすまで
  • 第2回: Nutchの動作を解説

背景・前提

HBaseじゃなくてMySQLを使えば?

Nutch + HBaseのクローラーが動作するようになったが、正直1台で動かすならMySQLを使ったほうが色々楽だし、データの抽出も楽。

HBaseを使ったほうがいい場合というのは、データが非常に多い場合ってのが共通認識らしい。1台で扱えなくなる位の大規模なデータ。その場合、当然HBaseも複数台で動かすことになる。

今は、データが100GBに満たない程度だし1台なんだけど、そもそも今回は勉強も兼ねているし、今後データが増えてくるとも限らないので、引き続きHBaseを使っていく。

HBaseの動作モード

HBaseには以下の3種類の動作モードがある。詳しくはこのへん

Nutch + HBaseのチュートリアルに従うと、スタンドアローンモードでHBaseが動く。それを今回分散モードにしてみる。

各マシンの役割分担

今まではVPS1台だったけど、それだとどうにもならないので、とりあえず2台にして、それらを以下のように振り分けた。今後もう少し台数を増やす予定。各プロセスの役割については、各種ドキュメントを参照。

  • マスター(node1):HDFSネームノード、ZooKeeper、HBaseマスター
  • スレーブ(node2):HDFSデータノード、HBaseリージョンサーバー

両方共メモリ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でパッケージをインストールできるので、ここでは詳細は省略。

パッケージ

マスターでインストールしたパッケージ


スレーブでインストールしたパッケージ

  • hadoop-0.20-datanode
  • hadoop-0.20 (hadoop-0.20-datanodeが依存している)
  • hadoop-hbase-regionserver
  • hadoop-hbase (hadoop-hbase-regionserverが依存している)
  • hadoop-zookeeper (hadoop-hbase-regionserverが依存している)
  • hadoop-0.20-tasktracker (当面使わない)

設定

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

ネットワーク

iptables を使っている場合、必要なポートを開ける必要がある。

このページに使うポートがまとまっているので参考に。

起動

これで一通り完了(書き漏れがなければ)。後は起動するだけなんだけど、起動の順番が決まっている。

今回の構成だと、以下の順番に起動。停止は逆の順番で。

  • HDFS Name Node
  • HDFS Data Node
  • ZooKeeper
  • HBase Master
  • HBase Region Server

おしまい

これでとりあえず完了。HBase shellなどで動作確認をすることをおすすめする。

本当は今回書こうと思ったけど長くなったので、次回はデータ移行について書く予定。

その4はこちら