管理が困難―分散処理の常識はZooKeeperで変わる:ビッグデータ処理の常識をJavaで身につける(8)(3/3 ページ)
Hadoopをはじめ、Java言語を使って構築されることが多い「ビッグデータ」処理のためのフレームワーク/ライブラリを紹介しながら、大量データを活用するための技術の常識を身に付けていく連載
シングルモードで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ファミリの中では目立つ存在ではありませんが、多くのサービスやアプリケーションで有用なサービスを提供します。今後多くのサービスやシステムでさらに導入が進むのではないかと考えています。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 次世代Hadoopの特徴は、MapReduce 2とGiraph
Hadoopの父に聞く、HadoopとClouderaの現在・未来 - テキストマイニングで始める実践Hadoop活用
- Javaで覚えるIT技術者の40の常識
新人プログラマ/SEは覚えておきたい“まとめ” - 実践! Rで学ぶ統計解析の基礎