Hadoopのはじめ方 >

目次

ChefによるHadoopクラスタセットアップ

1ノードによる疑似分散モード

  • centos.pngCentOSではいずれのレシピでも構築可能です。
  • debian.pngDebian(おそらくubuntu.pngUbuntuでも可)ではApache Hadoopのみが構築可能です。参考までにCDHはすでにDebianをサポートしていますが、HDPは近々Debian系でははじめてUbuntuをサポートするようです。
  1. GitとChefクライアントはあらかじめインストールしておきます。
    CentOS:$ sudo yum install git
    Debian:$ sudo apt-get install git
    ...
    $ curl -L https://www.opscode.com/chef/install.sh | sudo bash
    ...
  2. 当プロジェクトで整備しているChefクックブックを取得します。
    $ git clone git://git.sourceforge.jp/gitroot/metasearch/grid-chef-repo.git
    ...
    $ cd grid-chef-repo
  3. chef-soloコマンドにJSONファイルを指定し、目的のHadoopをインストールします。Oracle JDK等、必要なものはすべてインストールされます。lightbulb.pngセットアップ内容を事前に確認したい場合には、まず -W オプションを付加して chef-solo を空実行させるとよいでしょう。
    $ sudo chef-solo -c solo.rb -j nodes/localhost-ah.json
    • 指定できるJSONファイルは以下の通りです。CDH4以降では、リソース管理フレームワークとしてMapReduceV1またはYARNのいずれかを選択構築できるため、それぞれのバージョンで推奨と思われるもので構築します。
      No.JSONファイル説明リソース管理
      フレームワーク
      Ganglia
      付属構築
      centos.pngCentOS
      対応
      debian.pngDebian
      対応
      備考
      1nodes/localhost-ah.jsonApache Hadoop 1.x
      最新版
      MapReduceV1-
      2nodes/localhost-ah-with-ganglia.json
      3nodes/localhost-ah2.jsonApache Hadoop 2.x
      最新版
      YARN-YARNは現在GAリリース
      4nodes/localhost-ah2-with-ganglia.json
      5nodes/localhost-hdp.jsonHDP 1.x 最新版MapReduceV1--
      6nodes/localhost-hdp-with-ganglia.json
      7nodes/localhost-hdp2.jsonHDP 2.x 最新版YARN-YARNは現在GAリリース
      8nodes/localhost-hdp2-with-ganglia.json
      9nodes/localhost-cdh4.jsonCDH 4.x 最新版MapReduceV1--CDH4のYARNはAlphaリリース相当
      10nodes/localhost-cdh4-with-ganglia.json
      11nodes/localhost-cdh5.jsonCDH 5.x 最新版YARN-CDH5のYARNはまだBetaリリース
      12nodes/localhost-cdh5-with-ganglia.json
  4. 以下のスクリプトを実行し、HDFSのフォーマットとディレクトリ構成の初期化を行います。
    $ /grid/usr/sbin/hadoop_pseudo_distributed_init.sh
  5. 必要なデーモンを起動させます。デーモンについては、以下のページをご参照ください。
    1. Hadoopセットアップ
    2. Hadoop2セットアップ
    3. HDP1セットアップ
    4. HDP2セットアップ
    5. CDH4セットアップ
    6. CDH5セットアップ

最小複数ノードによる完全分散モード

  • 複数ノードによるセットアップは複雑になりますので、Apache Hadoopのみを対象としています。
  • centos.pngCentOS、debian.pngDebian(おそらくubuntu.pngUbuntuでも可)環境ともに構築可能です。
  • クラスタを構成するノードは以下の通りです。あらかじめDNSまたはローカルのhostsファイルで名前解決できるようにしておいてください。サービスするFQDNについては、このような検証用途ではCNAMEでもよいでしょう。
    ドメインgrid.example.com
    No.ホスト名サービスホスト名説明備考
    クラスタ名ptolemy
    1nn40ptolemy-nnNameNode
    2jt40ptolemy-jt
    またはptolemy-rm
    JobTracker
    またはResourceManager?
    3dn4000{0,1}-DataNodeTaskTracker
    またはNodeManager?
    4gm40-Ganglia
  • Gangliaについては、ユニキャストを使用する設定が行われます。
  1. 各ノードをセットアップします。
    1. chef-soloを使う場合
      1. 各ノードにGitとChefクライアントをあらかじめインストールしておきます。
        CentOS:$ sudo yum install git
        Debian:$ sudo apt-get install git
        ...
        $ curl -L https://www.opscode.com/chef/install.sh | sudo bash
        ...
      2. また bracecomp も必要になりますのでインストールします。
        $ sudo /opt/chef/embedded/bin/gem install bracecomp
      3. 当プロジェクトで整備しているChefクックブックを取得します。
        $ git clone git://git.sourceforge.jp/gitroot/metasearch/grid-chef-repo.git
        ...
        $ cd grid-chef-repo
      4. chef-soloコマンドに各ノード用のJSONファイル(nodes/{nn,jt,dn,gm}40.grid.example.com.json)を指定し、それぞれのノードをセットアップします。
        $ sudo chef-solo -c solo.rb -j nodes/nn40.grid.example.com.json
    2. knife soloを使う場合
      1. ワークステーションにGit、Chefクライアントおよびknife-soloプラグインをあらかじめインストールしておきます。
        CentOS:$ sudo yum install git
        Debian:$ sudo apt-get install git
        ...
        $ curl -L https://www.opscode.com/chef/install.sh | sudo bash
        ...
        $ sudo /opt/chef/embedded/bin/gem install knife-solo
        ...
      2. 当プロジェクトで整備しているChefクックブックを取得します。
        $ git clone git://git.sourceforge.jp/gitroot/metasearch/grid-chef-repo.git
        ...
        $ cd grid-chef-repo
      3. 以下の要領でワークステーションからそれぞれのノードをセットアップします。最初にprepareコマンドで対象ノードにChefをインストールし、次に bracecomp4chef ロールを指定して一度cookし、必要な bracecomp ライブラリをChef環境にインストールしておきます。最後にノードに合ったロール(ptolemy-{nn,jt,dn,gm})を指定してcookします。lightbulb.png通常、knife soloでは、各ノード用のJSONファイルを用意してcookしますが、検証用途では以下のように -o (--override-runlist) オプションを利用し適用させたいレシピ(ロール)でオーバーライド指定してしまった方が簡便でしょう。
        $ knife solo prepare nn40.grid.example.com -c knife-solo.rb
        ...
        $ knife solo cook    nn40.grid.example.com -c knife-solo.rb -o 'role[bracecomp4chef]'
        ...
        $ knife solo cook    nn40.grid.example.com -c knife-solo.rb -o 'role[ptolemy-nn]'
        ...
    3. Chefサーバを利用する場合(Chefサーバやワークステーションのセットアップ方法についてはここでは説明しませんので、Chefページをご参照ください。)
      1. Chefワークステーションに bracecomp が必要になりますのでインストールします。
        $ sudo /opt/chef/embedded/bin/gem install bracecomp
      2. 当プロジェクトで整備しているChefクックブックを取得し、knifeの設定を行った上でChefサーバにクックブックやロールをアップロードします。
        $ git clone git://git.sourceforge.jp/gitroot/metasearch/grid-chef-repo.git
        ...
        $ cd grid-chef-repo
        $ knife cookbook upload `ls cookbooks/ | grep -v README.md`
        ...
        $ knife role from file roles/*.rb
        ...
        $ knife environment from file environments/*.rb
        ...
      3. 各ノードをChefサーバに登録し、ロール(ptolemy-{nn,jt,dn,gm})を反映させセットアップします。
        $ knife bootstrap ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com -N gm40.grid.example.com \
        > -x ec2user -i ~/.ssh/ec2-demo.pem --sudo -r 'role[ptolemy-gm]' -V
        ...
        $ knife bootstrap ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com -N nn40.grid.example.com \
        > -x ec2user -i ~/.ssh/ec2-demo.pem --sudo -r 'role[ptolemy-nn]' -V
        ...
  2. 完全分散では、まずNameNodeにて手動でHDFSのフォーマットを行い、HDFSの動作に必要なNameNodeDataNodeデーモンを各ノードで起動させます。デーモンについては、以下のページをご参照ください。
    1. Hadoopセットアップ
    2. Hadoop2セットアップ
  3. NameNodeで以下のスクリプトを実行し、HDFSのディレクトリ構成を初期化します。
    $ /grid/usr/sbin/hadoop_full_distributed_init.sh
  4. 他のデーモン(MapReduce? V1またはYARN)を各ノードで起動させます。デーモンについては、以下のページをご参照ください。
    1. Hadoopセットアップ
    2. Hadoop2セットアップ

パフォーマンス・チューニング

デフォルト設定

  1. これまでに用いてきたhadoopクックブックのデフォルト属性値は以下の通りですが、実際にはハードウェア性能に応じて設定の調整を行うとよいでしょう。

クラスタ共通の設定(ロールの活用)

  1. まず設定の変更にはクラスタ共通のロールを作成して対応するとよいでしょう。hadoopクックブックでは、主要プロパティは直接node['hadoop']直下の属性で、その他の追加プロパティはnode['hadoop']['extra_configs']直下のHadoop各設定ファイルについての属性で設定することが可能になっています。
    • cake.pnggrid-chef-repo:/roles/hadoop-ptolemy.rb: これはPtolemyクラスタの例です。
      1. $LOAD_PATH.push("#{File.dirname(__FILE__)}/_lib")
      2. #${chef-repo}/roles/_lib/grid.rb
      3. require 'grid'
      4.  
      5. cluster_name = 'ptolemy'
      6. cluster_sym = cluster_name.to_sym
      7.  
      8. name "hadoop-#{cluster_name}"
      9. description "#{cluster_name.capitalize} Hadoop cluster node"
      10.  
      11. run_list(
      12.   'role[node_commons]',
      13.   # LDAP (option)
      14.   #'role[nameservice-client-grid]',
      15.   'role[hadoop]'
      16. )
      17.  
      18. #env_run_lists()
      19.  
      20. grid_vol_root = '/grid/vol'
      21. hadoop_attributes = {
      22.   # core-site.xml
      23.   'this.cluster.name' => cluster_name,
      24.   'this.domain' => Grid::DOMAIN,
      25.   'this.namenode.fqdn' => '${this.cluster.name}-nn.${this.domain}',
      26.   'fs.checkpoint.dir' => "#{grid_vol_root}/0/var/lib/${user.name}/checkpoint",
      27.   #'fs.checkpoint.dir' => "#{grid_vol_root}/0/var/lib/${user.name}/checkpoint,/export/home/${user.name}/var/lib/checkpoint",
      28.   # hdfs-site.xml
      29.   'this.secondary.namenode.fqdn' => '${this.cluster.name}-cn.${this.domain}',
      30.   'dfs.name.dir' => "#{grid_vol_root}/0/var/lib/${user.name}/name",
      31.   #'dfs.name.dir' => "#{grid_vol_root}/0/var/lib/${user.name}/name,/export/home/${user.name}/var/lib/name",
      32.   'dfs.replication' => '2',
      33.   #'dfs.replication' => '3',  # default, recommended.
      34.   # mapred-site.xml
      35.   'this.jobtracker.fqdn' => '${this.cluster.name}-jt.${this.domain}',
      36.   'this.jobhistory.fqdn' => '${this.cluster.name}-jt.${this.domain}',
      37.   #'this.jobhistory.fqdn' => '${this.cluster.name}-jh.${this.domain}',
      38.   'extra_configs' => {
      39.     # e.g. 'core-site.xml' => {'k1' => 'v1', 'k2' => 'v2'},
      40.     'hadoop-env.sh' => {
      41.       #'HADOOP_HEAPSIZE' => '2000',               # default: 1000 MB
      42.       #'HADOOP_NAMENODE_INIT_HEAPSIZE' => '2000'  # default: 1000 MB (ver. 2.x)
      43.       #'HADOOP_NAMENODE_OPTS' => '',
      44.       #'HADOOP_SECONDARYNAMENODE_OPTS' => '',
      45.       #'HADOOP_DATANODE_OPTS' => '',
      46.       #'HADOOP_BALANCER_OPTS' => '',
      47.       #'HADOOP_JOBTRACKER_OPTS' => '',
      48.     },
      49.     'yarn-env.sh' => {  # ver. 2.x
      50.       #'YARN_HEAPSIZE' => '2000'  # default: 1000 MB
      51.       #'YARN_RESOURCEMANAGER_OPTS' => '',
      52.       #'YARN_NODEMANAGER_OPTS' => '',
      53.     },
      54.     'mapred-env.sh' => {  # ver. 2.x
      55.       #'HADOOP_JOB_HISTORYSERVER_HEAPSIZE' => '2000',  # default: 1000 MB
      56.       #'HADOOP_JOB_HISTORYSERVER_OPTS' => '',
      57.     },
      58.     'core-site.xml' => {
      59.     },
      60.     'hdfs-site.xml' => {
      61.       'dfs.block.size' => '134217728',  # default: 67108864 (bytes)
      62.       #'dfs.blocksize' => '134217728',  # default: 134217728 (bytes) (ver. 2.x)
      63.       #'dfs.datanode.du.reserved' => '0',  # default: 0 (byte)
      64.       # with HBase
      65.       #'dfs.support.append' => 'true',
      66.       #'dfs.datanode.max.xcievers' => '4096',  # default: 4096 (ver. 1.1 or later), 256 (older ver.)
      67.       #'dfs.datanode.max.transfer.threads' => '4096',  # default: 4096 (ver. 2.x)
      68.     },
      69.     'yarn-site.xml' => {  # ver. 2.x
      70.       #'yarn.nodemanager.resource.cpu-vcores' => '8',  # default: 8
      71.       #'yarn.nodemanager.resource.memory-mb' => '8192',  # default: 8192
      72.     },
      73.     'mapred-site.xml' => {
      74.       # map tasks:reduce tasks = 4:3 or 2:1 or ...
      75.       'mapred.tasktracker.map.tasks.maximum' => '4',     # default: 2
      76.       'mapred.tasktracker.reduce.tasks.maximum' => '2',  # default: 2
      77.       #'mapred.child.java.opts' => '-Xmx1000m',           # default: -Xmx200m
      78.       'mapred.reduce.slowstart.completed.maps' => '0.80',  # default: 0.05
      79.       #'mapreduce.job.reduce.slowstart.completedmaps' => '0.80',  # default: 0.05 (ver. 2.x)
      80.       #'tasktracker.http.threads' => '80',            # default: 40
      81.       #'mapreduce.tasktracker.http.threads' => '80',  # default: 40 (ver. 2.x)
      82.       #'mapred.reduce.parallel.copies' => SQRT(nodes),            # default: 5
      83.       #'mapreduce.reduce.shuffle.parallelcopies' => SQRT(nodes),  # default: 5 (ver. 2.x)
      84.       'mapred.submit.replication' => '2',                 # default: 10
      85.       #'mapreduce.client.submit.file.replication' => '3',  # default: 10 (ver. 2.x)
      86.     },
      87.     'capacity-scheduler.xml' => {}
      88.   }
      89. }
      90.  
      91. #default_attributes()
      92.  
      93. override_attributes(
      94.   'grid' => {
      95.     'vol_root' => grid_vol_root,
      96.     'max_vol_nums' => '4'
      97.   },
      98.   'hadoop' => hadoop_attributes
      99. )
    • cake.pnggrid-chef-repo:/roles/ptolemy-dn.rb: 参考までにこれはPtolemyクラスタのDataNodeをセットアップするロールですが、上述の共通ロール hadoop-ptolemy をrun_listに含んでいます。
      role_ptolemy-dn.png

ハードウェア性能に応じた設定(Environmentの活用)

  1. 次にハードウェア性能に適した設定ですが、ChefのEnvironmentを定義し、それを利用するとよいでしょう。Environmentでの属性のカズタマイズはロールと同じ要領ですが、加えてクックブックのバージョン制限も行うことができます。Chefサーバを使用している場合には、knife bootstrapコマンドの -E オプションで各ノードをいずれかのEnvironmentに割り当てます*1が、対象ノード上でchef-soloを使用する場合でもver. 11.6以降で同じ -E オプションが利用できます。
    $ sudo chef-solo -c solo.rb -j nodes/nn40.grid.example.com.json -E hadoop_aws_io-bound
    $ sudo chef-solo -c solo.rb -j nodes/localhost-ah.json -E hadoop_aws_t1-micro
    • 以下はEnvironmentの例です。
      1. cake.pnggrid-chef-repo:/environments/hadoop_aws_io-bound.rb
      2. cake.pnggrid-chef-repo:/environments/hadoop_aws_t1-micro.rb: これはあくまでも例です。t1.microインスタンスでHadoopクラスタを構築することはまずありません。
    • 参考までに、ChefワークステーションからノードのChefサーバへの新規登録と、ロールの反映を一気に行うコマンドラインの例は以下の通りです。
      $ knife bootstrap ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com -N dn40000.grid.example.com \
      > -x ec2user -i ~/.ssh/ec2-demo.pem --sudo -r 'role[ptolemy-dn]' -E hadoop_aws_io-bound -V

*1 明示的に指定しない場合には、既存の _default になります。

添付ファイル: filerole_ptolemy-dn.png 133件 [詳細]

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