Zookeeper Warningメッセージ

539 views
Skip to first unread message

kawai

unread,
Nov 26, 2009, 5:52:42 AM11/26/09
to Hadoopユーザー会
佐分利さん、太田さん

はじめまして川合です。
ご返信ありがとうございます。疑問点を投稿させていただきます。

現在Hadoop、HBase、Zookeeperの連携テストを行おうとしております。HBaseとZookeeperについての質問ですが、
HBase0.20.1を使用し構築しているのですが、hbase-site.xml内にZookeeperの設定項目
(hbase.zookeeper.property)を下記の様に登録してあります。
また、hbase0.20.1ではZookeeperが組み込まれているとの事なので、ZK単体(zookeeper-3.2.1.tar.gz)のイ
ンストールはしていません。

サーバ構成は、masterサーバ1台・slaveサーバ3台の構成で、
master側で作成した各confファイル(hbase-site、habase-env)をそれぞれのslaveサーバへrsyncで送っており、
全てのサーバで同じconfファイルを所持しています。
hbaseを開始するとzkも同時に開始され、hbase shellでテーブル作成も出来き、正常稼動しているように思えますが、Zookeeper
のlogを参照すると、WARNメッセージが全てのサーバより出力しております。
また、leaderport3888は全てのサーバでLISTENになっていますが、peerport2888は1台のサーバでしかLISTENになっ
ていません。

疑問点は、なぜ上記の構成で2888ポートは1台のサーバでのみLISTENになっているのか?
このlogを参照する限り、warningメッセージのみで、errorメッセージは出力しておりません。
Zookeeper自身(zookeeper-3.2.1.tar.gz)の単体のインストールは必要なのでしょうか?

お力をお借りできれば幸いです。
宜しくお願いいたします。

====== hbase.site.xml
=============================================================
<property>
<name>hbase.zookeeper.quorum</name>
<value>master.com,slave1.com,slave2.com,slave3.com</value>
</property>
<property>
<name>hbase.zookeeper.peerport</name>
<value>2888</value>
</property>
<property>
<name>hbase.zookeeper.leaderport</name>
<value>3888</value>
</property>
<property>
<name>hbase.zookeeper.property.tickTime</name>
<value>2000</value>
</property>
<property>
<name>hbase.zookeeper.property.initLimit</name>
<value>10</value>
</property>
<property>
<name>hbase.zookeeper.property.syncLimit</name>
<value>5</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/var/zookeeper</value>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.property.maxClientCnxns</name>
<value>30</value>
</property>

====== jpsで起動確認 ====================================================
[hadoop@master hbase]$ jps
31848 HMaster
31117 NameNode
31239 JobTracker
31782 HQuorumPeer
757 Jps

[hadoop@slave1 hbase]$ jps
29663 SecondaryNameNode
2221 Jps
29732 TaskTracker
31021 HQuorumPeer
29606 DataNode
31106 HRegionServer


===== hbase-hadoop-zookeeper-.log
===============================================================
WARN org.apache.zookeeper.server.quorum.QuorumCnxManager: Cannot open
channel to 1 at election address slave1.com/172.16.200.4:3888
java.net.ConnectException: Connection refused
WARN org.apache.zookeeper.server.quorum.QuorumCnxManager: Cannot open
channel to 2 at election address slave2.com/172.16.200.5:3888
java.net.ConnectException: Connection refused

DEBUG org.apache.zookeeper.server.quorum.CommitProcessor: Processing
request:: sessionid:0x252eab2e7e0000 type:create cxid:0x2 zxid:
0xfffffffffffffffe txntype:unknown /hbase
DEBUG org.apache.zookeeper.server.quorum.CommitProcessor: Committing
request:: sessionid:0x252eab2e7e0000 type:error cxid:0x2 zxid:
0x1400000002 txntype:-1 n/a
DEBUG org.apache.zookeeper.server.FinalRequestProcessor: Processing
request:: sessionid:0x252eab2e7e0000 type:create cxid:0x2 zxid:
0x1400000002 txntype:-1 /hbase
DEBUG org.apache.zookeeper.server.quorum.CommitProcessor: Processing
request:: sessionid:0x252eab2e7e0000 type:create cxid:0x3 zxid:
0xfffffffffffffffe txntype:unknown /hbase/master

=== masterとslave2でのnetstat結果
=================================================================
[hadoop@master hbase]$ netstat -an | grep 2888
tcp 0 0 ::ffff:172.16.200.3:41047 ::ffff:
172.16.245.6:2888 ESTABLISHED
[hadoop@master hbase]$ ssh slave2
Last login: Tue Nov 24 14:58:01 2009 from slave2.com
[hadoop@slave2 ~]$ netstat -an | grep 2888
tcp 0 0 :::
2888 :::* LISTEN
tcp 0 0 ::ffff:172.16.200.6:2888 ::ffff:
172.16.200.4:39437 ESTABLISHED
tcp 0 0 ::ffff:172.16.200.6:2888 ::ffff:
172.16.200.3:41047 ESTABLISHED
tcp 0 0 ::ffff:172.16.200.6:2888 ::ffff:
172.16.200.5:59218 ESTABLISHED

midoridge

unread,
Nov 26, 2009, 7:45:29 PM11/26/09
to Hadoopユーザー会
midoridgeです。

はじめまして。

zookeeperのWARNメッセージですが、起動直後ではないでしょうかね?

> WARN org.apache.zookeeper.server.quorum.QuorumCnxManager: Cannot open
> channel to 1 at election address slave1.com/172.16.200.4:3888
> java.net.ConnectException: Connection refused

zookeeperは、起動するとserver同士で接続してLEADER/FOLLOWERを決めて、
データの同期など行うようで、起動直後の場合、PortがListenしてないとかで、接続できず、
接続リトライを繰り返したりします。
その際、上記のようなWARNメッセージがでます。
接続が確立できた後は、たぶん出ていないと思うのですが。

あと、peerportの2888が1台しかListenしていないのは、正しいと思います。
LEADERのみListenするPortで、FOLLOWERはListenしないようです。
で、LEADERがdownすると、FOLLOWERのどれかが、LEADERに昇格します。
そうすると、昇格したサーバでは、2888がListenしています。
ログにもLEADERになったとかなんとか出るはずです。

なので

> Zookeeper自身(zookeeper-3.2.1.tar.gz)の単体のインストールは必要なのでしょうか?

は、不要かと思います。

kawai

unread,
Nov 27, 2009, 7:07:07 AM11/27/09
to Hadoopユーザー会
midoridgeさん

ご返信ありがとうございます。川合です。
確かにConnection refused のメッセージは起動時のみ発生しているだけで、継続的に出力しているものではありません。
また、peerportの2888が起動しているサーバを停止させると、他のSlaveサーバにてpeerportの2888がListenになりまし
た。

このzookeeperで出力しているWarningメッセージがあると排他処理ができないか否かを確認したいのですが、
HBaseの同じテーブルへの約6000件ほどのデータの書き込みを同時におこないましたが、zookeeperのlogを見る限り変化は見れませんで
した。
実際にデットロックを発生させて正常に起動したか否か確認をしたいと考えています。
排他処理された際にはzookeeperのlogには何らかのメッセージが出力するものなのでしょうか?
HBaseのテーブルの構成上タイムスタンプを持つかと思いますが、そこらへんの絡みもあるものなのでしょうか。
zookeeperを単体でインストールした場合など、zookeeperのコマンドが使えるようですが、
HBaseに組み込まれたこの場合でも何らかの正常起動確認の方法はあるのでしょうか?
質問ばかりで申し訳ございませんが、お力をお貸しください。

midoridge

unread,
Nov 27, 2009, 8:10:26 AM11/27/09
to Hadoopユーザー会
川合さん

midoridgeです。こんばんわ。

私もHBaseをそんなに深く触っていないので、排他処理がどうなっているのかはわかりません。
ただ、Connection refused のメッセージの件が起動直後のみというのであれば、その後はzookeeper的には正常動作していると
思います。
なので、排他処理されているのかと思います。

> zookeeperを単体でインストールした場合など、zookeeperのコマンドが使えるようですが、
> HBaseに組み込まれたこの場合でも何らかの正常起動確認の方法はあるのでしょうか?

ですが、hbase shell上で

zk 'zookeeperのコマンド'

zookeeperのzkCli.shと同じことができますよ。
例えば、

zk 'ls /'

とかすれば表示されます。
そうすると、hbaseってのがあるので、/hbase配下にmasterやら4つくらい掘られていたと思います。
# 今、hadoop関係の環境が手元にないので、記憶で書いているので若干微妙なのはご容赦下さい
そこ見ると、hbase関連の情報が少し入っていますが、排他処理に使われているのかまでは、私もわかっていません。(masterとかregionや
らrsやらそんなだったような・・・)
# なので、何かわかったら教えて下さいw

Tatsuya Kawano

unread,
Feb 4, 2010, 5:33:49 PM2/4/10
to Hadoopユーザー会
川合さん、midoridgeさん、

たつやです。こんにちは。
遅レスですみません。

On 2009年11月26日, 午後7:52, kawai <natub...@gmail.com> wrote:
> 現在Hadoop、HBase、Zookeeperの連携テストを行おうとしております。HBaseとZookeeperについての質問ですが、
> HBase0.20.1を使用し構築しているのですが、hbase-site.xml内にZookeeperの設定項目
> (hbase.zookeeper.property)を下記の様に登録してあります。
> また、hbase0.20.1ではZookeeperが組み込まれているとの事なので、ZK単体(zookeeper-3.2.1.tar.gz)のイ
> ンストールはしていません。
>
> サーバ構成は、masterサーバ1台・slaveサーバ3台の構成で、

(以下略)


On 2009年11月27日, 午後9:07, kawai <natub...@gmail.com> wrote:
> 確かにConnection refused のメッセージは起動時のみ発生しているだけで、継続的に出力しているものではありません。
> また、peerportの2888が起動しているサーバを停止させると、他のSlaveサーバにてpeerportの2888がListenになりました。
>
> このzookeeperで出力しているWarningメッセージがあると排他処理ができないか否かを確認したいのですが、HBaseの同じテーブルへの約6000件ほどのデータの書き込みを同時におこないましたが、zookeeperのlogを見る限り変化は見れませんでした。
> 実際にデットロックを発生させて正常に起動したか否か確認をしたいと考えています。
> 排他処理された際にはzookeeperのlogには何らかのメッセージが出力するものなのでしょうか?HBaseのテーブルの構成上タイムスタンプを持つかと思いますが、そこらへんの絡みもあるものなのでしょうか。
> zookeeperを単体でインストールした場合など、zookeeperのコマンドが使えるようですが、HBaseに組み込まれたこの場合でも何らかの正常起動確認の方法はあるのでしょうか?


HBaseが提供する排他制御(行レベルのロック)では、ZooKeeperは使っていません。行レベルのロックは、HBaseの Region
Server上で行われています。HBaseでは、行(レコード)は必ず1つの Region
Server(以下RS)で管理されるようになっていて、複数の RS にアサインされることはありません。

たとえば、6,000件のレコードうち

・最初の1,050レコードは RS #1 が管理し
・次の1,300レコードは RS #2 が管理し
・次の1,100レコードは RS #3 が管理し
・次の1,020レコードは RS #2 が管理し
(以下続く…)

というように、レコードのキー値の範囲(リージョン)ごとに異なる RS
にアサインされる仕組みとなっています。なお、上のレコード件数はあくまでも例として作った数字で、実際は、リージョンのサイズや、リージョンの分割が起こるタイミングによって変わります。

このように、1つのレコードは、必ず1つの RS で管理されますので、排他制御も1つの RS
内だけで行われます。排他に関わる情報を、ZooKeeper経由で他の RS と連携する必要はありません。このロックの動作は、HRegion
の Javadoc の冒頭部分で解説されています。
http://hadoop.apache.org/hbase/docs/current/api/org/apache/hadoop/hbase/regionserver/HRegion.html


では、HBaseでは ZooKeeper を何のために使っているのかというと、 バージョン 0.20.x では、HMaster や RS の
IP アドレスのルックアップのために使っています。これは、バージョン 0.19.x
までは、HMasterが管理していた情報です。また、次のメジャーアップデートである 0.21.0 では、いままで HMaster
が管理していた各テーブルの定義情報も ZooKeeperに移行する計画があるようです。このように、HBaseでの
ZooKeeperの使われ方は、今までHMasterが管理していた情報を引き継ぐ設計になっています。


> 実際にデットロックを発生させて正常に起動したか否か確認をしたいと考えています。
> 排他処理された際にはzookeeperのlogには何らかのメッセージが出力するものなのでしょうか?

排他処理された際に(ZooKeeperログではなくて)RSログに表示されるかの質問ですが、これは、あるクライアント(A)がロックしている
ある1つのレコードを、別のクライアント(B)がロックしようとした時の話ですよね。おそらく表示されないと思います。ログは表示されることはなく、クライアントBは、クライアントAがロックを解除するまで静かに待たされます。

また、デッドロック状態(クライアントAとBがそれぞれ複数の行を同時にロックしようとして、睨み合った状態で固まる)の検出は、HBaseではできないと思います。というか、トランザクションがサポートされていませんので、たぶん、複数の行を同時にロックすることはできず、したがって、デッドロックもさせられないと思います。クライアント側で、複数の行それぞれに対する
RowLock オブジェクトは取得できるはずですが、それが RS上でロックとして有効になるのは、単一の行の put や get
の間だけなのではないでしょうか。複数行のロックが同時に有効にならなければ、デッドロックを起こせません。


ZooKeeper の warningメッセージが出ている間も正常に動作するかの確認ですが、上で説明しました通り、行ロックには関わっていませんので、IPアドレスのルックアップ情報が見られれば
ZooKeeperは正常に稼働していると考えてよいでしょう。

例:

==============================================
$ hbase shell

hbase(main):001:0> zk_dump

HBase tree in ZooKeeper is rooted at /hbase
Cluster up? true
In safe mode? false
Master address: 172.16.80.26:60000
Region server holding ROOT: 172.16.80.27:60020
Region servers:
- 172.16.80.27:60020
- 172.16.80.29:60020
- 172.16.80.28:60020
==============================================


また、RSが1台ダウンしている間や、それが復旧した後に、排他制御が行われていることの確認ですが、上で説明しました通り、ログで確認することはできないと思います。検証用のプログラムを工夫して、同じ行の更新を複数のクライアントから同時に行って、後で、例えば、その行の各列のデーターに整合性が保たれていることを確認してはどうでしょうか?

たとえば、"family1"という column family に、2つの column qualifier "col1"と"col2" があるとして、

family1:col1 → ランダムなバイト列
family1:col2 → ランダムなバイト列

それらのランダムなデーターが、1つのクライアントで生成されたものであることを確認するために、チェックサムも保存してはどうでしょうか?

family1:checkSum → col1 と col2 連結して、そのハッシュ値

もし、行ロックが正常に動作しなくて、複数のクライアントからの更新が混ざってしまった場合には、checkSumの値が合わなくなります。


なお、RSを1台ダウンさせると、それが管理していたリージョンは、別の RS にアサインし直されます。その様子は、HMasterのログを見ることで確認できます。

ところで、約6,000件ほどのデーターの書き込みで検証ということですが、もしテーブル全体で
6,000レコードくらいしかないとすると、ディフォルトの設定では、レコード数が少なすぎて、複数のリージョンに分割されないような気がします。まず、数千万件のデータをテーブルに入れることで3台のRSにリージョンのアサインを分散させて、それから、ある1つのリージョンに含まれているキー範囲だけに対して、その中の数十レコードを更新しながら、そのリージョンがアサインされている
RS をダウンさせるのがよいと思います。

よろしくお願いします。


--
河野 達也
Tatsuya Kawano (Mr.)
Tokyo, Japan

twitter: http://twitter.com/tatsuya6502

tatsuya6502

unread,
Feb 4, 2010, 6:42:30 PM2/4/10
to Hadoopユーザー会

たつやです。

On 2月5日, 午前7:33, Tatsuya Kawano <tatsuya6...@gmail.com> wrote:
> では、HBaseでは ZooKeeper を何のために使っているのかというと、 バージョン 0.20.x では、HMaster や RS の
> IP アドレスのルックアップのために使っています。これは、バージョン 0.19.x
> までは、HMasterが管理していた情報です。


HBaseでの ZooKeeper の使い方について、少し補足します。

単に HMaster(以下HS)や RS の IP ルックアップだけでなくて、「死活監視」にも使っています。HSやRSが起動すると、
ZooKeeperに IP アドレスを報告して、その後、ZooKeeperとのセッションを張ったままにします。ZooKeeperは、セッション
を監視して、HMやRSと定期的に通信ができることを確認します。

もし、HS や RS になにか障害が起こると、該当するセッションがタイムアウトしますので、それによって障害が検知できます。HSは、
ZooKeeperを通じてこの状態を監視していますので、障害の起きた RS にアサインしていたリージョンを、他の RS にアサインしなおすこと
ができます。

また、もし、HBase をマルチ HS 構成にしている場合には、アクティブな HS に障害が起こると、スタンバイの HS が
ZooKeeper 経由でその状態を知って、自分をアクティブにします。

このように、セッションによる死活監視を行っていますので、RSなどのプロセスのレスポンスが悪くなると、プロセスが生きているのに、ダウンしたとみな
されることがあるので注意が必要です。HBaseでありがちなのは、サーバーのメモリーが不足していて、RSのプロセスがスワップアウトされたり、プロ
セス内でフルGCが頻発したりすることでレスポンスが悪化して、RSが死んだとみなされることです。

なお、セッションがタイムアウトすると、RSの側でも、自分がクラスターから外れたと認識して、自分からシャットダウンします。HBaseでは、1つの
リージョンは必ず1つの RS にしかアサインされない前提になっていますので、万が一、1つのリージョンが複数のRSに重複してアサインされてしまう
と、データーの整合性が取れなくなってしまいます。これを起こさないために、ZooKeeperセッションがタイムアウトしたRSは、自らシャットダウ
ンする仕組みになっています。

RSの稼働するサーバーには、HDSF のデータノードも稼働していますし、構成によっては、Map Reduceのタスクも稼働しますので、十分な
RAM(8GB以上が推奨)が必要です。


また、もし、ZooKeeperクラスターがダウンすると、HBaseクラスター全体がクラッシュしますので、こちらも注意が必要です。サーバーのメモ
リー不足やディスクアクセスの混雑でレスポンスが悪化することでダウン状態となっていまうことがありますので、RS や HDSF データノードのよう
な負荷がかかるサーバーとは別のサーバーで稼働させるのが無難です。また、HDFSの Namenodeとも別にしたほうがいいでしょう。HMは負荷が
軽いので、それと同じサーバーで稼働させるのは問題ありません。

ZooKeeperクラスターは、複数の HBase クラスターや Map Reduceクラスターから共有できますので、高可用性が要求されるとき
には、独立した3台構成、もしくは、5台構成にするのが一般的です。


--
河野 達也
Tatsuya Kawano (Mr.)
Tokyo, Japan

twitter:http://twitter.com/tatsuya6502

On 2月5日, 午前7:33, Tatsuya Kawano <tatsuya6...@gmail.com> wrote:
> 川合さん、midoridgeさん、
>
> たつやです。こんにちは。
> 遅レスですみません。
>
> On 2009年11月26日, 午後7:52, kawai <natub...@gmail.com> wrote:> 現在Hadoop、HBase、Zookeeperの連携テストを行おうとしております。HBaseとZookeeperについての質問ですが、
> > HBase0.20.1を使用し構築しているのですが、hbase-site.xml内にZookeeperの設定項目
> > (hbase.zookeeper.property)を下記の様に登録してあります。
> > また、hbase0.20.1ではZookeeperが組み込まれているとの事なので、ZK単体(zookeeper-3.2.1.tar.gz)のイ
> > ンストールはしていません。
>
> > サーバ構成は、masterサーバ1台・slaveサーバ3台の構成で、
>
> (以下略)
>
> On 2009年11月27日, 午後9:07, kawai <natub...@gmail.com> wrote:
>
> > 確かにConnection refused のメッセージは起動時のみ発生しているだけで、継続的に出力しているものではありません。
> > また、peerportの2888が起動しているサーバを停止させると、他のSlaveサーバにてpeerportの2888がListenになりました。
>

> > このzookeeperで出力しているWarningメッセージがあると排他処理ができないか否かを確認したいのですが、HBaseの同じテーブルへの約600 0件ほどのデータの書き込みを同時におこないましたが、zookeeperのlogを見る限り変化は見れませんでした。


> > 実際にデットロックを発生させて正常に起動したか否か確認をしたいと考えています。
> > 排他処理された際にはzookeeperのlogには何らかのメッセージが出力するものなのでしょうか?HBaseのテーブルの構成上タイムスタンプを持つかと 思いますが、そこらへんの絡みもあるものなのでしょうか。
> > zookeeperを単体でインストールした場合など、zookeeperのコマンドが使えるようですが、HBaseに組み込まれたこの場合でも何らかの正常起 動確認の方法はあるのでしょうか?
>

> HBaseが提供する排他制御(行レベルのロック)では、ZooKeeperは使っていません。行レベルのロックは、HBaseの Region
> Server上で行われています。HBaseでは、行(レコード)は必ず1つの Region
> Server(以下RS)で管理されるようになっていて、複数の RS にアサインされることはありません。
>
> たとえば、6,000件のレコードうち
>
> ・最初の1,050レコードは RS #1 が管理し
> ・次の1,300レコードは RS #2 が管理し
> ・次の1,100レコードは RS #3 が管理し
> ・次の1,020レコードは RS #2 が管理し
> (以下続く…)
>
> というように、レコードのキー値の範囲(リージョン)ごとに異なる RS
> にアサインされる仕組みとなっています。なお、上のレコード件数はあくまでも例として作った数字で、実際は、リージョンのサイズや、リージョンの分割が起こるタ イミングによって変わります。
>
> このように、1つのレコードは、必ず1つの RS で管理されますので、排他制御も1つの RS
> 内だけで行われます。排他に関わる情報を、ZooKeeper経由で他の RS と連携する必要はありません。このロックの動作は、HRegion

> の Javadoc の冒頭部分で解説されています。http://hadoop.apache.org/hbase/docs/current/api/org/apache/hadoop/hba...


>
> では、HBaseでは ZooKeeper を何のために使っているのかというと、 バージョン 0.20.x では、HMaster や RS の
> IP アドレスのルックアップのために使っています。これは、バージョン 0.19.x
> までは、HMasterが管理していた情報です。また、次のメジャーアップデートである 0.21.0 では、いままで HMaster
> が管理していた各テーブルの定義情報も ZooKeeperに移行する計画があるようです。このように、HBaseでの
> ZooKeeperの使われ方は、今までHMasterが管理していた情報を引き継ぐ設計になっています。
>
> > 実際にデットロックを発生させて正常に起動したか否か確認をしたいと考えています。
> > 排他処理された際にはzookeeperのlogには何らかのメッセージが出力するものなのでしょうか?
>
> 排他処理された際に(ZooKeeperログではなくて)RSログに表示されるかの質問ですが、これは、あるクライアント(A)がロックしている

> ある1つのレコードを、別のクライアント(B)がロックしようとした時の話ですよね。おそらく表示されないと思います。ログは表示されることはなく、クライアン トBは、クライアントAがロックを解除するまで静かに待たされます。
>
> また、デッドロック状態(クライアントAとBがそれぞれ複数の行を同時にロックしようとして、睨み合った状態で固まる)の検出は、HBaseではできないと思い ます。というか、トランザクションがサポートされていませんので、たぶん、複数の行を同時にロックすることはできず、したがって、デッドロックもさせられないと 思います。クライアント側で、複数の行それぞれに対する

> 6,000レコードくらいしかないとすると、ディフォルトの設定では、レコード数が少なすぎて、複数のリージョンに分割されないような気がします。まず、数千万 件のデータをテーブルに入れることで3台のRSにリージョンのアサインを分散させて、それから、ある1つのリージョンに含まれているキー範囲だけに対して、その 中の数十レコードを更新しながら、そのリージョンがアサインされている

Reply all
Reply to author
Forward
0 new messages