Hadoop >

目次

概要

  1. HDFS Federationは、それぞれのネームスペースを担当するNameNodeを連合させ、一つのクラスタを構成する仕組みです。
  2. NameNode自体がスケールアウトするのではなく、クラスタがスケールアウトする仕組みですので、それぞれのNameNodeのスケールアップやそのネームスペースのキャパシティプランニングは依然として重要です。
  3. アクセスURIにおける、NameNodeのホスト名解決を含むパス解決は、(オーソリティ部はDNS名ではなく、パスはViewFSのマウントテーブルによるため)クラスタサイドでプロキシされるのではなく、クライアントサイドで設定ファイルに基づきを適切に行わせる必要があります。これがユーザに影響を及ぼす大きな変更点です。

HDFS Federation with NameNode HA

設定例

  • ともにNameNode HAのFederationによって構成されているPleiadesクラスタとHyadesクラスタの例です。
  1. ${HADOOP_PREFIX}/etc/hadoop/core-site.xml: ViewFSによりクライアントサイドのマウントテーブル(名前解決)を定義しています。
    1. <property>
    2.     <name>fs.defaultFS</name>
    3.     <value>viewfs://pleiades</value>
    4. </property>
    5.  
    6. <!-- Pleiades cluster mount table -->
    7. <property>
    8.     <name>fs.viewfs.mounttable.pleiades.homedir</name>
    9.     <value>/user</value>
    10. </property>
    11. <property>
    12.     <name>fs.viewfs.mounttable.pleiades.link./user</name>
    13.     <value>hdfs://pleiades-ns00/user</value>
    14. </property>
    15. <!--
    16. <property>
    17.     <name>fs.viewfs.mounttable.pleiades.link./tmp</name>
    18.     <value>hdfs://pleiades-ns00/tmp</value>
    19. </property>
    20. -->
    21. <property>
    22.     <name>fs.viewfs.mounttable.pleiades.link./grid</name>
    23.     <value>hdfs://pleiades-ns00/grid</value>
    24. </property>
    25. <property>
    26.     <name>fs.viewfs.mounttable.pleiades.link./data</name>
    27.     <value>hdfs://pleiades-ns01/data</value>
    28. </property>
    29. <property>
    30.     <name>fs.viewfs.mounttable.pleiades.link./projects</name>
    31.     <value>hdfs://pleiades-ns01/projects</value>
    32. </property>
    33.  
    34. <!-- Hyades cluster mount table -->
    35. <property>
    36.     <name>fs.viewfs.mounttable.hyades.homedir</name>
    37.     <value>/user</value>
    38. </property>
    39. <property>
    40.     <name>fs.viewfs.mounttable.hyades.link./user</name>
    41.     <value>hdfs://hyades-ns00/user</value>
    42. </property>
    43. <!--
    44. <property>
    45.     <name>fs.viewfs.mounttable.hyades.link./tmp</name>
    46.     <value>hdfs://hyades-ns00/tmp</value>
    47. </property>
    48. -->
    49. <property>
    50.     <name>fs.viewfs.mounttable.hyades.link./grid</name>
    51.     <value>hdfs://hyades-ns00/grid</value>
    52. </property>
    53. <property>
    54.     <name>fs.viewfs.mounttable.hyades.link./data</name>
    55.     <value>hdfs://hyades-ns01/data</value>
    56. </property>
    57. <property>
    58.     <name>fs.viewfs.mounttable.hyades.link./projects</name>
    59.     <value>hdfs://hyades-ns01/projects</value>
    60. </property>
  2. ${HADOOP_PREFIX}/etc/hadoop/hdfs-site.xml: distcpの都合上、両クラスタのネームスペースをすべてリストしています。note.png各ネームスペースを一つのクラスタに紐付けるためのクラスタIDは、NameNodeのフォーマット時にパラメータ(-clusterId)として与えますので、設定ファイル上は現れません。
    1. <!-- HDFS Federation -->
    2. <property>
    3.     <name>dfs.nameservices</name>
    4.     <value>pleiades-ns00,pleiades-ns01,hyades-ns00,hyades-ns01</value>
    5. </property>
    6.  
    7. <!-- Shared JournalNodes for NameNode HA -->
    8. <!--
    9.   This is where one configures the addresses of the JournalNodes which provide
    10.   the shared edits storage, written to by the Active nameNode and read by the
    11.   Standby NameNode to stay up-to-date with all the file system changes the
    12.   Active NameNode makes. Though you must specify several JournalNode addresses,
    13.   you should only configure one of these URIs. The URI should be of the form:
    14.   "qjournal://host1:port1;host2:port2;host3:port3/journalId". The Journal ID is
    15.   a unique identifier for this nameservice, which allows a single set of
    16.   JournalNodes to provide storage for multiple federated namesystems. Though not
    17.   a requirement, it's a good idea to reuse the nameservice ID for the journal
    18.   identifier.
    19. -->
    20. <!-- Pleiades cluster journal nodes -->
    21. <property>
    22.     <name>dfs.namenode.shared.edits.dir.pleiades-ns00</name>
    23.     <value>qjournal://jn000000.grid.example.com:8485;jn000001.grid.example.com:8485;jn000002.grid.example.com:8485/pleiades-ns00</value>
    24. </property>
    25. <property>
    26.     <name>dfs.namenode.shared.edits.dir.pleiades-ns00</name>
    27.     <value>qjournal://jn000000.grid.example.com:8485;jn000001.grid.example.com:8485;jn000002.grid.example.com:8485/pleiades-ns01</value>
    28. </property>
    29. <!-- Hyades cluster journal nodes -->
    30. <property>
    31.     <name>dfs.namenode.shared.edits.dir.hyades-ns00</name>
    32.     <value>qjournal://jn010000.grid.example.com:8485;jn010001.grid.example.com:8485;jn010002.grid.example.com:8485/hyades-ns00</value>
    33. </property>
    34. <property>
    35.     <name>dfs.namenode.shared.edits.dir.hyades-ns00</name>
    36.     <value>qjournal://jn010000.grid.example.com:8485;jn010001.grid.example.com:8485;jn010002.grid.example.com:8485/hyades-ns01</value>
    37. </property>
    38.  
    39. <property>
    40.     <name>dfs.journalnode.edits.dir</name>
    41.     <value>/path/to/journal/node/local/data</value>
    42. </property>
    43.  
    44. <!-- Pleiades cluster automatic-failover -->
    45. <property>
    46.     <name>dfs.ha.automatic-failover.enabled.pleiades-ns00</name>
    47.     <value>false</value>
    48. </property>
    49. <property>
    50.     <name>dfs.ha.automatic-failover.enabled.pleiades-ns01</name>
    51.     <value>false</value>
    52. </property>
    53. <!-- Hyades cluster automatic-failover -->
    54. <property>
    55.     <name>dfs.ha.automatic-failover.enabled.hyades-ns00</name>
    56.     <value>false</value>
    57. </property>
    58. <property>
    59.     <name>dfs.ha.automatic-failover.enabled.hyades-ns01</name>
    60.     <value>false</value>
    61. </property>
    62.  
    63. <property>
    64.     <name>dfs.ha.fencing.methods</name>
    65.     <value>shell(/path/to/my/script.sh --nameservice=$target_nameserviceid $target_host:$target_port)</value>
    66. </property>
    67.  
    68. <!-- NameNode HA (pleiades-ns00) -->
    69. <property>
    70.     <name>dfs.ha.namenodes.pleiades-ns00</name>
    71.     <value>nn00,nn01</value>
    72. </property>
    73. <property>
    74.     <name>dfs.namenode.rpc-address.pleiades-ns00.nn00</name>
    75.     <value>nn000000.grid.example.com:9000</value>
    76. </property>
    77. <property>
    78.     <name>dfs.namenode.rpc-address.pleiades-ns00.nn01</name>
    79.     <value>nn000001.grid.example.com:9000</value>
    80. </property>
    81. <property>
    82.     <name>dfs.namenode.http-address.pleiades-ns00.nn00</name>
    83.     <value>nn000000.grid.example.com:50070</value>
    84. </property>
    85. <property>
    86.     <name>dfs.namenode.http-address.pleiades-ns00.nn01</name>
    87.     <value>nn000001.grid.example.com:50070</value>
    88. </property>
    89. <property>
    90.     <name>dfs.client.failover.proxy.provider.pleiades-ns00</name>
    91.     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    92. </property>
    93.  
    94. <!-- NameNode HA (pleiades-ns01) -->
    95. <property>
    96.     <name>dfs.ha.namenodes.pleiades-ns01</name>
    97.     <value>nn00,nn01</value>
    98. </property>
    99. <property>
    100.     <name>dfs.namenode.rpc-address.pleiades-ns01.nn00</name>
    101.     <value>nn000100.grid.example.com:9000</value>
    102. </property>
    103. <property>
    104.     <name>dfs.namenode.rpc-address.pleiades-ns01.nn01</name>
    105.     <value>nn000100.grid.example.com:9000</value>
    106. </property>
    107. <property>
    108.     <name>dfs.namenode.http-address.pleiades-ns01.nn00</name>
    109.     <value>nn000101.grid.example.com:50070</value>
    110. </property>
    111. <property>
    112.     <name>dfs.namenode.http-address.pleiades-ns01.nn01</name>
    113.     <value>nn000101.grid.example.com:50070</value>
    114. </property>
    115. <property>
    116.     <name>dfs.client.failover.proxy.provider.pleiades-ns01</name>
    117.     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    118. </property>
    119.  
    120. <!-- NameNode HA (Hyades-ns00) -->
    121. <property>
    122.     <name>dfs.ha.namenodes.hyades-ns00</name>
    123.     <value>nn00,nn01</value>
    124. </property>
    125. <property>
    126.     <name>dfs.namenode.rpc-address.hyades-ns00.nn00</name>
    127.     <value>nn010000.grid.example.com:9000</value>
    128. </property>
    129. <property>
    130.     <name>dfs.namenode.rpc-address.hyades-ns00.nn01</name>
    131.     <value>nn010001.grid.example.com:9000</value>
    132. </property>
    133. <property>
    134.     <name>dfs.namenode.http-address.hyades-ns00.nn00</name>
    135.     <value>nn010000.grid.example.com:50070</value>
    136. </property>
    137. <property>
    138.     <name>dfs.namenode.http-address.hyades-ns00.nn01</name>
    139.     <value>nn010001.grid.example.com:50070</value>
    140. </property>
    141. <property>
    142.     <name>dfs.client.failover.proxy.provider.hyades-ns00</name>
    143.     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    144. </property>
    145.  
    146. <!-- NameNode HA (Hyades-ns01) -->
    147. <!-- (...) -->

分散コピー(distcp)の例と想定されるパス解決

  1. 同クラスタの別ネームスペースへの分散コピー
    1. ViewFSによりパス指定します(ネームスペースの違いは意識されません)。以降は想定されるパス解決の様子です。
      $ distcp viewfs://pleiades/user/alice/test                     viewfs://pleiades/projects/alice/test
    2. マウントテーブルにより、ネームスペースが名前解決されます。
      $ distcp hdfs://pleiades-ns00/user/alice/test                  hdfs://pleiades-ns01/projects/alice/test
    3. NameNode HA構成定義により、アクティブなNameNodeに名前解決されます。
      $ distcp hdfs://nn000000.grid.example.com:9000/user/alice/test hdfs://nn000100.grid.example.com:9000/projects/alice/test
  2. 異なるクラスタ間での分散コピー
    1. ViewFSによりパス指定します。以降は想定されるパス解決の様子です。
      $ distcp viewfs://pleiades/user/alice/test                     viewfs://hyades/user/alice/test
    2. マウントテーブルにより、ネームスペースが名前解決されます。
      $ distcp hdfs://pleiades-ns00/user/alice/test                  hdfs://hyades-ns00/user/alice/test
    3. NameNode HA構成定義により、アクティブなNameNodeに名前解決されます。
      $ distcp hdfs://nn000000.grid.example.com:9000/user/alice/test hdfs://nn010000.grid.example.com:9000/user/alice/test

ファイルシステム操作上の注意点

  1. 同クラスタであっても異なるネームスペース間でのリネームはできません。ViewFSで透過的にアクセスしている場合、ネームスペースの違いを意識することはできませんので、戸惑うことでしょう。
  2. ViewFSでは、マウントポイントより上位のディレクトリは当然ながら読み出し専用になります。

リソース

  1. HDFS Federation
  2. ViewFs Guide
  3. HDFS High Availability Using the Quorum Journal Manager

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-07-13 (日) 11:42:47 (1408d)