たつやです。こんにちは。
遅レスですみません。
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
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つのリージョンに含まれているキー範囲だけに対して、その 中の数十レコードを更新しながら、そのリージョンがアサインされている