連載
» 2012年06月22日 00時00分 公開

ビッグデータ処理の常識をJavaで身につける(8):管理が困難―分散処理の常識はZooKeeperで変わる (3/3)

[伊藤敬彦,株式会社 プリファードインフラストラクチャー]
前のページへ 1|2|3       

シングルモードでZookeeperサーバを立ち上げる

 初めに、以下の設定ファイルを作成し、「conf/zoo.cfg」という名前で保存します。

tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181

 ここで各設定項目は以下の意味を持ちます。

  • tickTime
    ハートビートを実行する間隔(ミリ秒)を、このパラメータで指定
  • dataDir
    dataDirで指定したディレクトリにZooKeeperがメモリ内に保持するファイルシステムのスナップショットを書き出す
  • clientPort
    クライアントが接続するポート番号を指定

 設定が終わった後、以下のコマンドでZooKeeperサーバを立ち上げます。

$ bin/zkServer.sh start

■クライアントシェルを立ち上げる

 ZooKeeperが提供するファイルシステムにアクセスしてみます。簡単にファイルシステムにアクセスするには、Zookeeperが提供するシェルを利用できます。以下のコマンドでZookeeperにアクセスしてみましょう。

$ bin/zkCli.sh -server 127.0.0.1:2181
2012-03-21 22:04:24,973 - INFO  [main:Environment@97] - Client environment:java.compiler=
2012-03-21 22:04:24,973 - INFO  [main:Environment@97] - Client environment:os.name=Mac OS X
2012-03-21 22:04:24,974 - INFO  [main:Environment@97] - Client environment:os.arch=x86_64
2012-03-21 22:04:24,975 - INFO  [main:Environment@97] - Client environment:os.version=10.7.2
2012-03-21 22:04:24,976 - INFO  [main:Environment@97] - Client environment:user.name=takahi-i
2012-03-21 22:04:24,976 - INFO  [main:Environment@97] - Client environment:user.home=/Users/takahi-i
2012-03-21 22:04:24,976 - INFO  [main:Environment@97] - Client environment:user.dir=/Users/takahi-i/work/zookeeper/zookeeper-3.3.4
2012-03-21 22:04:24,988 - INFO  [main:ZooKeeper@379] - Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@7ddf5a8f
Welcome to ZooKeeper!
2012-03-21 22:04:25,116 - INFO  [main-SendThread():ClientCnxn$SendThread@1061] - Opening socket connection to server /127.0.0.1:2181
JLine support is enabled
[zk: 127.0.0.1:2181(CONNECTED) 0]

 ここで以下のように「help」と入力すると、シェルが提供するコマンド一覧が表示されます。

[zk: 127.0.0.1:2181(CONNECTED) 0] help
ZooKeeper-server host:port cmd args
    connect host:port
    get path [watch]
    ls path [watch]
    set path data [version]
    delquota [-n|-b] path
    quit 
    printwatches on|off
    create [-s] [-e] path data acl
    stat path [watch]
    close 
    ……

■Clientシェルでファイルを操作

 以下のコマンドでファイルルートディレクトリにあるファイル一覧見てみましょう。

[zk: 127.0.0.1:2181(CONNECTED) 2] ls /
ls /
[zookeeper]

 次に、ノードを生成してみます。ノードの生成には「create」コマンドを利用します。以下のコマンドで「foo」というノードをルート直下に生成し、ノードのコンテンツを「hoge」とします。

[zk: 127.0.0.1:2181(CONNECTED) 4] create /foo hoge
create /foo hoge
Created /foo

 ここで、もう一度ルートディレクトリ内のノード一覧を見てみます。生成した「foo」ノードが生成されたことが分かります。

[zk: 127.0.0.1:2181(CONNECTED) 5] ls /
ls /
[foo, zookeeper]

 ノードの中身を見るには「get」を利用します。

[zk: 127.0.0.1:2181(CONNECTED) 7] get /foo
get /foo
hoge
cZxid = 0x2
ctime = Wed Mar 21 22:17:40 JST 2012
mZxid = 0x2
mtime = Wed Mar 21 22:17:40 JST 2012
pZxid = 0x2
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0

Replicate(冗長)モードでサーバを立ち上げる

 ZooKeeperは複数の計算機からなるクラスタとして冗長モードサービスを提供できます。複数の計算機を利用することで、クラスタ内の一部計算機が壊れてしまった場合にも、問題なくサービスの提供を継続できます。

 ZooKeeperを冗長モードで立ち上げるには「zoo.cfg」に追加の設定項目を記述するだけです。具体的には、「server.#」を各サーバごとに記述します。

 以下の「zoo.cfg」は3台の計算機でZokeeperを動作させた場合の記述例です。

tickTime=2000
dataDir=/var/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=foo:2888:3888
server.2=foobar:2888:3888
server.3=hgoe:2888:3888

 上記のzoo.cfgを見て分かるように、「zerver.N」から始まる行が追加されています。これらはクラスタを構築するサーバ名とポートアドレスを記述します。ここで、ポート番号を2つ指定(上記の例では「2888」「3888})する必要があります。これらのポートはZooKeeperサーバ間で情報を交換するために使用します。

ZooKeeperを利用したプログラム

 ここからは、ZooKeeperに接続するプログラム、およびZooKeeperサーバをプログラムから立ち上げる方法を紹介します。

■クライアントプログラム

 JavaやC++でZooKeeperに接続するプログラムを記述できます。残念ながらZooKeeperを利用したプログラムは簡単な機能を持つものでも、そこそこの長さになってしまうので、本稿では詳細を割愛します。ZooKeeperクライアントプログラムの良いサンプルとして、ZooKeeperのサイト「ZooKeeper の Java での使用例」で紹介されているものがあります。ぜひ参考にしてください。

 このプログラムでは、コマンド引数で指定されたZnodeをウオッチし、変更された場合プログラムを再起動します。また、ウオッチするZnodeが消失した場合はプログラムをkillします。

■サーバを立ち上げるプログラム

 前節で試したようにZooKeeperは付属のシェルスクリプトで起動できますが、ソフトウェアに同梱しプログラムから直接起動できるとユーザーの負担を軽減できます。次期Apache Solr(SolrCloud)やHBaseはZooKeeperを立ち上げる処理を内部で行うことで、ユーザーがZooKeeperサーバを立ち上げる負担を軽減しています。

 また、この機能を利用することでテストがしやすくなるというメリットもあります。

 実際ZooKeeperをJavaプログラムで起動するのは、それほど難しくはありません。簡単なサンプル「spikes」をZooKeeperのテストから抽出したので、実際に利用する際の参考にしてください。

Zookeeperは目立たないが有用なサービス

 本稿では、ZooKeeperについて簡単に解説しましたが、いかがでしたでしょうか。具体的には、ZooKeeperが利用される領域について解説した後、ZooKeeperが提供するウオッチなどの機能について述べました。

 Zookeeperは、Hadoopファミリの中では目立つ存在ではありませんが、多くのサービスやアプリケーションで有用なサービスを提供します。今後多くのサービスやシステムでさらに導入が進むのではないかと考えています。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。