Hadoop運用 >

目次

はじめに

  1. GangliaはデフォルトでIPマルチキャストを使用します。まずは対象の環境でマルチキャストが問題なく効果的に行えるかどうかネットワーク管理者に相談してください。
  2. マルチキャストが利用できない場合には、ユニキャストの利用を検討します。
  3. Gangliaには障害検知による通知機能はありません。通知はNagiosに任せます(NagiosセットアップforHadoopを参照のこと)。

モデル環境

サーバ

No.ホスト説明備考
1gm{00,01}.grid.example.com冗長化されたGanglia(gmetad)サーバ

VIP

No.VIPのDNS説明備考
1pleiades-gm.grid.example.comGangliaサーバの冗長化と負荷分散のため

マルチキャストアドレス

  • 限定スコープ(239.0.0.0/8)の範囲でgmondが監視データの送受信に用いるマルチキャストアドレスを割り当てます。
  • ruby.pnggrid-chef-repo:/roles/_lib/grid.rb: ChefではRubyスクリプトを活用できますので、このようにすべてのノードの情報を集約することができます。
No.マルチキャストアドレス
(チャンネル)
対象サーバグループ
(Gangliaクラスタ名)
備考
grid-base
239.2.10.0AdministrativeStations?
239.2.10.1NameServices?(Kerberos、LDAP)
239.2.10.2Nagioses
239.2.10.3Ganglia
239.2.10.4ZooKeepers?
239.2.10.5ProvisioningMasters?構成自動化マスタサーバ
pleiades
239.2.11.2Nagioses
239.2.11.3Ganglia
239.2.11.4Metas (HCatalog)
239.2.11.5Gateways
239.2.11.6Workflows (Oozie)
239.2.11.7Proxies (httpfs?(Hoop))
239.2.11.8NameNodes?
239.2.11.9JobTrackers?
同上HistoryServers?
同上ResourceManagers?
239.2.11.10HBaseMasters?
239.2.11.{20..}DataNodes?{00000..}サブネット構成によっては同じアドレスを利用できるでしょう

セットアップ

Chefレシピ

参考までに、これはここで説明している環境を構築するChefレシピ(ロール)になります。Hadoop側の設定は、node['hadoop']['metrics2'] の諸属性で行なっています。

gmond(Ganglia Monitor Daemon)

  • 監視エージェント(gmond)を各ノードにインストールします。同じグループ(Gangliaクラスタ)に属するエージェントは自分の監視データを同一のチャンネル(マルチキャストアドレス)に送信すると同時に、そのチャンネルに届くデータを保存します。つまり、同じグループに属するノードはどれもそのグループに属するすべてのノードの監視データを収集することができるようになります。
  1. パッケージインストールします。
    1. debian.pngDebian
      $ sudo apt-get install --no-install-recommends ganglia-monitor
    2. centos.pngCentOS(note.pngEPELリポジトリからのインストールになりますので、あらかじめリポジトリの追加が必要です。)
      $ sudo yum install ganglia-gmond
  2. ホストにインタフェイスが複数ある場合には、対象のインタフェイスに静的ルートを設定します。
    1. debian.pngDebian
      1. $ cat /etc/network/if-up.d/route
      2. #!/bin/sh
      3. route add -host 239.2.11.1 dev eth1
      4. exit 0
    2. centos.pngCentOS
      1. $ cat /etc/sysconfig/network-scripts/route-eth1
      2. 239.2.11.1 dev eth1
  3. 設定ファイル(/etc/ganglia/gmond.conf)を編集します。主にクラスタ(監視対象グループ)の名前とマルチキャストアドレス(チャンネル)を変更します。この設定のクラスタ名がグループのキーとなります。各ノードからはこのチャンネルに対してUDPで監視データが送信され、各ノードは受信チャンネル宛のデータをすべて保存することになります。なお、以下の例ではTTLを1に設定していますのでルータを越えてマルチキャストパケットが届くことはありません。
    1. ...
    2. /* If a cluster attribute is specified, then all gmond hosts are wrapped inside
    3.  * of a <CLUSTER> tag.  If you do not specify a cluster tag, then all <HOSTS> will
    4.  * NOT be wrapped inside of a <CLUSTER> tag. */
    5. cluster {
    6.   name = "DataNode00"
    7.   owner = "grid.example.com"
    8.   latlong = "N27.98 E86.92"
    9.   url = "http://www.pleiades.grid.example.com/"
    10. }
    11.  
    12. /* Feel free to specify as many udp_send_channels as you like.  Gmond
    13.    used to only support having a single channel */
    14. udp_send_channel {
    15.   mcast_join = 239.2.11.20
    16.   port = 8649
    17.   ttl = 1
    18. }
    19.  
    20. /* You can specify as many udp_recv_channels as you like as well. */
    21. udp_recv_channel {
    22.   mcast_join = 239.2.11.20
    23.   port = 8649
    24.   bind = 239.2.11.20
    25. }
    26.  
    27. /* You can specify as many tcp_accept_channels as you like to share
    28.    an xml description of the state of the cluster */
    29. tcp_accept_channel {
    30.   port = 8649
    31. }
    32. ...
  4. エージェントを再起動させます。
    1. debian.pngDebian
      $ sudo /etc/init.d/ganglia-monitor restart
    2. centos.pngCentOS
      $ sudo service gmond start
      $ sudo chkconfig gmond on

Hadoop Metrics 2

  1. 設定ファイル(conf/hadoop-metrics2.properties)を適切に編集し、各デーモンを起動させます。主な編集内容は、Gangliaメトリックスの有効化とそのマルチキャストアドレスの設定です。Hadoopの各デーモンは設定されたチャンネル宛に監視データを送信するようになります。
    1. Hadoop 1.x
      1. $ diff -u conf/hadoop-metrics2.properties.dist conf/hadoop-metrics2.properties
      2. --- conf/hadoop-metrics2.properties.dist 2012-07-18 19:12:02.000000000 +0900
      3. +++ conf/hadoop-metrics2.properties 2012-07-18 19:36:38.000000000 +0900
      4. @@ -23,24 +23,24 @@
      5.  # *.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink30
      6.  #
      7.  # for Ganglia 3.1 support
      8. -# *.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31
      9. +*.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31
      10.  
      11. -# *.sink.ganglia.period=10
      12. +*.sink.ganglia.period=10
      13.  
      14.  # default for supportsparse is false
      15.  # *.sink.ganglia.supportsparse=true
      16.  
      17. -#*.sink.ganglia.slope=jvm.metrics.gcCount=zero,jvm.metrics.memHeapUsedM=both
      18. -#*.sink.ganglia.dmax=jvm.metrics.threadsBlocked=70,jvm.metrics.memHeapUsedM=40
      19. +*.sink.ganglia.slope=jvm.metrics.gcCount=zero,jvm.metrics.memHeapUsedM=both
      20. +*.sink.ganglia.dmax=jvm.metrics.threadsBlocked=70,jvm.metrics.memHeapUsedM=40
      21.  
      22. -#namenode.sink.ganglia.servers=yourgangliahost_1:8649,yourgangliahost_2:8649
      23. +namenode.sink.ganglia.servers=239.2.11.8:8649
      24.  
      25. -#datanode.sink.ganglia.servers=yourgangliahost_1:8649,yourgangliahost_2:8649
      26. +datanode.sink.ganglia.servers=239.2.11.20:8649
      27.  
      28. -#jobtracker.sink.ganglia.servers=yourgangliahost_1:8649,yourgangliahost_2:8649
      29. +jobtracker.sink.ganglia.servers=239.2.11.9:8649
      30.  
      31. -#tasktracker.sink.ganglia.servers=yourgangliahost_1:8649,yourgangliahost_2:8649
      32. +tasktracker.sink.ganglia.servers=239.2.11.20:8649
      33.  
      34. -#maptask.sink.ganglia.servers=yourgangliahost_1:8649,yourgangliahost_2:8649
      35. +maptask.sink.ganglia.servers=239.2.11.20:8649
      36.  
      37. -#reducetask.sink.ganglia.servers=yourgangliahost_1:8649,yourgangliahost_2:8649
      38. +reducetask.sink.ganglia.servers=239.2.11.20:8649
    2. Hadoop 2.x
      1. #
      2. # Below are for sending metrics to Ganglia
      3. #
      4. # for Ganglia 3.0 support
      5. # *.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink30
      6. #
      7. # for Ganglia 3.1 support
      8. *.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31
      9.  
      10. *.sink.ganglia.period=10
      11.  
      12. # default for supportsparse is false
      13. # *.sink.ganglia.supportsparse=true
      14.  
      15. *.sink.ganglia.slope=jvm.metrics.gcCount=zero,jvm.metrics.memHeapUsedM=both
      16. *.sink.ganglia.dmax=jvm.metrics.threadsBlocked=70,jvm.metrics.memHeapUsedM=40
      17.  
      18. namenode.sink.ganglia.servers=239.2.11.73:8649
      19.  
      20. datanode.sink.ganglia.servers=239.2.11.73:8649
      21.  
      22. resourcemanager.sink.ganglia.servers=239.2.11.73:8649
      23.  
      24. nodemanager.sink.ganglia.servers=239.2.11.73:8649
      25.  
      26. #jobtracker.sink.ganglia.servers=239.2.11.73:8649
      27.  
      28. #tasktracker.sink.ganglia.servers=239.2.11.73:8649
      29.  
      30. #maptask.sink.ganglia.servers=239.2.11.73:8649
      31.  
      32. #reducetask.sink.ganglia.servers=239.2.11.73:8649

gmetad(Ganglia Meta Daemon)とGanglia Webフロントエンド

  • gmetadは定期的に各Gangliaクラスタのgmondに(TCPで)アクセスし、統計データを収集します。Ganglia Webフロントエンドがその収集データを元にユーザにGUIを提供します。
  1. インストールします。
    1. debian.pngDebian: php5-gdはオプションで、パイチャートの表示のために使われます。
      $ sudo apt-get install --no-install-recommends gmetad ganglia-webfrontend php5-gd
      $ sudo ln -s /etc/ganglia-webfrontend/apache.conf /etc/apache2/conf.d/ganglia-webfrontend.conf
      $ sudo /etc/init.d/apache2 restart
    2. centos.pngCentOS: 必要に応じて、/etc/httpd/conf.d/ganglia.conf を編集します。
      $ sudo yum install ganglia-web
      $ sudo service httpd start
      $ sudo chkconfig httpd on
  2. 設定ファイル(/etc/ganglia/gmetad.conf)を編集します。主には収集するデータソースとグリッド名を定義します。データは所属グループ(Gangliaクラスタ)のどのノードからも同様に収集できますが、バックアップを考慮して2、3のノードをリストしておくとよいでしょう。
    1. ...
    2. data_source "NameService" ns00.grid.example.com ns01.grid.example.com
    3. data_source "Nagios" nm00.grid.example.com nm01.grid.example.com
    4. data_source "Ganglia" gm00.grid.example.com gm01.grid.example.com
    5. data_source "Workflow" wf00.grid.example.com wf01.grid.example.com
    6. data_source "Proxy" pxy00.grid.example.com pxy01.grid.example.com
    7. data_source "NameNode" nn00.grid.example.com nn01.grid.example.com
    8. data_source "HBaseMaster" hm00.grid.example.com hm01.grid.example.com
    9. data_source "JobTracker" jt00.grid.example.com jt01.grid.example.com
    10. data_source "DataNode00" dn00000.grid.example.com dn00020.grid.example.com
    11. #data_source "DataNode01" dn00040.grid.example.com dn00060.grid.example.com
    12. # ...
    13.  
    14. gridname "Pleiades"
    15. ...
  3. gmetadを再起動させ反映します。
    1. debian.pngDebian
      $ sudo /etc/init.d/gmetad restart
    2. centos.pngCentOS
      $ sudo service gmetad start
      $ sudo chkconfig gmetad on
  4. アクセスURLは以下になります。
    http://localhost/ganglia
    ganglia00.png
    ganglia01.png

Webコンソールへのアクセス制御

  • セキュアHadoopを構築している場合にはバックエンドにKerberos認証環境がありますので、Webサーバ(Apache2)向けのKerberos認証(SPNEGO)モジュール(mod_auth_kerbなど)の利用を検討するとよいでしょう。

スケールアウトのための対応(データストアのtmpfs化)

  • 監視対象ノードが増えてくると、監視データの読み書きのため頻繁にディスクI/Oが発生し、データがロストしやすくなるとともにグラフの描画速度が劣化します。これを改善するためにデータストアを通常のハードディスクからtmpfsに切り替えます。
  1. GangliaのRRDtoolデータ格納用のtmpfsを用意します。
    $ sudo mkdir -p /tmpfs/var/lib/ganglia/rrds
    $ cat /etc/fstab | grep tmpfs
    tmpfs /tmpfs/var/lib/ganglia/rrds tmpfs defaults 0 0
    $ sudo mount /tmpfs/var/lib/ganglia/rrds
    $ sudo chown nobody:root /tmpfs/var/lib/ganglia/rrds
    $ sudo chmod 755 /tmpfs/var/lib/ganglia/rrds
  2. gmetadを一度停止させ、既存のデータを移します
    $ sudo /etc/init.d/gmetad stop
    Stopping Ganglia Monitor Meta-Daemon: gmetad.
    $ sudo mv /var/lib/ganglia/rrds/* /tmpfs/var/lib/ganglia/rrds/
  3. tmpfsに対してシンボリックリンクを張ります。
    $ sudo rmdir /var/lib/ganglia/rrds
    $ sudo ln -s /tmpfs/var/lib/ganglia/rrds /var/lib/ganglia/rrds
  4. gmetadを起動させ、動作を確認します。
    $ sudo /etc/init.d/gmetad start
  5. tmpfsはOSの停止時にデータを失いますので、cronなどを利用して定期的にハードディスクにデータを書き出し永続化します。
    $ cat /etc/cron.d/ganglia-mem2hdd
    */10 * * * * root rsync -a --delete /tmpfs/var/lib/ganglia/rrds/ /var/lib/ganglia/rrds-p
  6. OS起動時にこの永続化されたデータをロードするように、gmetadの起動スクリプト(/etc/init.d/gmetad)のstartシーケンスに以下のようなコマンドを追加します。なお、tmpfsはパーミション2777でマウントされますので、パーミションを厳格に設定し直してもよいかもしれません。
    1. #chown nobody:root /tmpfs/var/lib/ganglia/rrds
    2. #chmod 755 /tmpfs/var/lib/ganglia/rrds
    3. rsync -a --delete /var/lib/ganglia/rrds-p/ /tmpfs/var/lib/ganglia/rrds

ユニキャストを利用する場合

  • ユニキャストの場合、当然ながら監視データの送信先(ホストアドレス)を特定する必要がありますので、headノードと呼ばれるデータを受信するホストをグループから複数選出します。複数用意するのはバックアップのためです。

gmond

  1. 設定ファイル(/etc/ganglia/gmond.conf)を編集します。グループから複数のheadノードを選出し、それらを送信先(udp_send_channel)に設定します。受信チャンネル(udp_recv_channel)にはポートを指定します。実際に監視データを受信するのはheadノードのみですが、フェイルオーバーのために他のノードも受信状態にしておくとよいでしょう(設定ファイルが簡素化されます)。
    1. ...
    2. /* If a cluster attribute is specified, then all gmond hosts are wrapped inside
    3.  * of a <CLUSTER> tag.  If you do not specify a cluster tag, then all <HOSTS> will
    4.  * NOT be wrapped inside of a <CLUSTER> tag. */
    5. cluster {
    6.   name = "DataNode00"
    7.   owner = "grid.example.com"
    8.   latlong = "N27.98 E86.92"
    9.   url = "http://www.pleiades.grid.example.com/"
    10. }
    11.  
    12. /* Feel free to specify as many udp_send_channels as you like.  Gmond
    13.    used to only support having a single channel */
    14. udp_send_channel {
    15.   host = dn00000.grid.example.com
    16.   port = 8649
    17. }
    18. udp_send_channel {
    19.   host = dn00020.grid.example.com
    20.   port = 8649
    21. }
    22.  
    23. /* You can specify as many udp_recv_channels as you like as well. */
    24. udp_recv_channel {
    25.   port = 8649
    26. }
    27.  
    28. /* You can specify as many tcp_accept_channels as you like to share
    29.    an xml description of the state of the cluster */
    30. tcp_accept_channel {
    31.   port = 8649
    32. }
    33. ...

gmetad

  1. データソースの取得先には、複数のheadノードを指定します。マルチキャストの場合の設定内容とほぼ同じになるでしょう。

冗長化とフェイルオーバー

gmond

  1. マルチキャストを利用する場合には、そのグループに属するノードの数だけ冗長化されますので、それ以上の設定は必要ありません。
  2. ユニキャストの場合でも、グループのheadノードの数だけ冗長化されますので問題ありません。

gmetadとGanglia Webフロントエンド

  1. 同じ設定で複数のホストを用意すれば問題ありません。それぞれのホストは独立にデータを収集し同じ統計データを保持しますので、ユーザからのアクセスに対しては負荷分散させるとよいでしょう。

既知の問題

HADOOP-8052 Hadoop Metrics2 should emit Float.MAX_VALUE

  1. HADOOP-8052: Hadoopのデーモンが出力するDouble値に起因して、gmetad(3.1.73.3.5で確認)がバッファオーバーフローを起こし落ちます。
    1. /var/log/syslog
      1. Jul 21 11:08:39 gm00 /usr/sbin/gmetad[5246]: RRD_update (/var/lib/ganglia/rrds/NameNode/nn00.grid.example.com
      2. /metricssystem.MetricsSystem.publish_max_time.rrd): /var/lib/ganglia/rrds/NameNode/nn00.grid.example.com
      3. /metricssystem.MetricsSystem.publish_max_time.rrd: converting '4.9E-324' to float: Numerical result out of range
      4. Jul 21 11:08:39 gm00 /usr/sbin/gmetad[5246]: RRD_update (/var/lib/ganglia/rrds/NameNode/__SummaryInfo__/metricssystem.MetricsSystem.publish_imin_time.rrd):
      5. /var/lib/ganglia/rrds/NameNode/__SummaryInfo__/metricssystem.MetricsSystem.publish_imin_time.rrd: expected 2 data source readings (got 1) from
      6. 1342836519:17976931348623157081452742373170435679807056752584499659891747680315726078002853876058955863276687817
      7. 1540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942
      8. 30458323690322294816580855933212G?
      9. Jul 21 11:08:39 gm00 kernel: [ 2462.605109] gmetad[5254] general protection ip:40572b sp:7f7aa224c440 error:0 in gmetad[400000+c000]
    2. /var/log/kern.log
      1. Jul 21 10:42:23 gm00 kernel: [  891.083000] gmetad[1529] general protection ip:40572b sp:7f2b17fb5440 error:0 in gmetad[400000+c000]
      2. Jul 21 10:48:43 gm00 kernel: [ 1270.422355] gmetad[1629] general protection ip:40572b sp:7f3205468440 error:0 in gmetad[400000+c000]
      3. Jul 21 10:58:24 gm00 kernel: [ 1849.922312] gmetad[2591] general protection ip:40572b sp:7fa4f616e440 error:0 in gmetad[400000+c000]
      4. Jul 21 11:08:39 gm00 kernel: [ 2462.605109] gmetad[5254] general protection ip:40572b sp:7f7aa224c440 error:0 in gmetad[400000+c000]
      5. Jul 21 11:12:24 gm00 kernel: [ 2687.675338] gmetad[5961] general protection ip:40572b sp:7ff8a220c440 error:0 in gmetad[400000+c000]
    3. Debian 7.0(wheezy)で提供されているgmetad-3.3.5でもまだ修正されていません。
      1. Jul 21 14:45:36 gm01 /usr/sbin/gmetad[6466]: RRD_update (/var/lib/ganglia/rrds/DataNode00/dn00001.grid.example.com
      2. /metricssystem.MetricsSystem.snapshot_imax_time.rrd):
      3. /var/lib/ganglia/rrds/DataNode00/dn00001.grid.example.com/metricssystem.MetricsSystem.snapshot_imax_time.rrd:
      4. converting '4.9E-324' to float: Numerical result out of range
      5. Jul 21 14:45:36 gm01 /usr/sbin/gmetad[6466]: *** buffer overflow detected ***: /usr/sbin/gmetad terminated
  2. この問題は、Hadoop側ではver. 1.0.10.23.1で修正されています。なお、より古いバージョンの0.20.205.0でも同様の問題がありますので、1.0.1以降にアップグレードすべきでしょう。

リソース


添付ファイル: fileganglia00.png 205件 [詳細] fileganglia01.png 204件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-03-03 (月) 19:49:36 (2465d)