2018.07.09

スペックの違うサーバーで Hadoop クラスタを組むヘテロ構成を試す


こんにちは。次世代システム研究室のデータベース と Hadoop を担当している M.K. です。

今回も前回に引き続き Hadoop ネタです。
Hadoop クラスタ構築では、後でサーバーを増強するときにスペックが前より良くなっていたり、台数が増えてきたので数を減らすために1台あたりのスペックを良くしたりと、最初のサーバーより高スペックのサーバーを追加するケースってあると思います。

そこで、スペックが違うサーバーで Hadoop クラスタを組むヘテロ構成のときにやるべき設定を検証してみました。


今回の検証内容

前回のブログで構築した環境をそのまま利用して、以下のことを行いました。

  1. 最初の構築時より高スペックのサーバーを Hadoop クラスタに追加
  2. YARN の Configuration Group を設定
  3. YARN Queue の作成と Node Labels の設定
  4. YARN Queue と Node Labels を指定してジョブを試してみる


最初の構築時より高スペックのサーバーを Hadoop クラスタに追加

まず、前回より高スペックな GMO アプリクラウドのサーバーを2台準備します。

そしてそのサーバーを Hadoop クラスタに追加ホストとして登録し、必要な Hadoop のサービスを展開します。

サーバースペック

  • 最初の構築時のスペック
    • OS : CentOS 7
    • 仮想 CPU : 4
    • メモリ容量 : 16GB
    • ディスク容量 : 320GB
  • 追加するサーバーのスペック
    • OS : CentOS 7
    • 仮想 CPU : 10
    • メモリ容量 : 60GB
    • ディスク容量 : 800GB

hosts ファイルの設定

/etc/hosts ファイルを使って Hadoop クラスタを構築しているので、追加するサーバーだけでなく、すべてのサーバーで hosts ファイルを以下のように編集します。
今回追加するのは、tst-hdp-s4 と tst-hdp-s5 のスレーブノード2台です。
xx.xx.xx.99  tst-hdp-am.tst.hdptest.com  tst-hdp-am
xx.xx.xx.51  tst-hdp-m1.tst.hdptest.com  tst-hdp-m1
xx.xx.xx.52  tst-hdp-m2.tst.hdptest.com  tst-hdp-m2
xx.xx.xx.53  tst-hdp-m3.tst.hdptest.com  tst-hdp-m3
xx.xx.xx.61  tst-hdp-s1.tst.hdptest.com  tst-hdp-s1
xx.xx.xx.62  tst-hdp-s2.tst.hdptest.com  tst-hdp-s2
xx.xx.xx.63  tst-hdp-s3.tst.hdptest.com  tst-hdp-s3
xx.xx.xx.64  tst-hdp-s4.tst.hdptest.com  tst-hdp-s4
xx.xx.xx.65  tst-hdp-s5.tst.hdptest.com  tst-hdp-s5
xx.xx.xx.10  tst-pxc1
xx.xx.xx.20  tst-pxc2
xx.xx.xx.30  tst-pxc3

追加サーバーのセットアップ

前回のブログの手順と同じように、ホスト名の設定、ntpサーバー構築、パスワードなし SSH 認証、必要なパッケージのインストール、OS周りのセットアップを行います。

JDK の配布

Ambari を構築した tst-hdp-am サーバーにログインし、/usr/jdk64 を追加サーバーにコピーします。
cd /usr
scp -pr jdk64 tst-hdp-s4:/usr/
scp -pr jdk64 tst-hdp-s5:/usr/

Ambari 管理画面からホスト追加

Ambari 管理画面にブラウザでログインして操作します。
必要に応じて tst-hdp-am ホスト の 8080 ポートを SSH トンネリングするなどしてください。
初期状態のままにしているので admin / admin でログインします。
各種の Hadoop サービスはひとまず Clients だけ展開します。

画面「Hosts」メニューから、「Actions」プルダウン > 「+Add New Hosts」を選択します。
ホスト追加のウィザードが出てくるので以下のように進めてください。
  • Add Host Wizard
    • Install Options
      • Target Hosts ⇒追加ホストをFQDNで書く
      • Host Registration Information
        • Provide Your SSH Private Key to automatically register hosts ⇒これをチェックして、tst-hdp-am:/root/.ssh/id_rsa の内容を貼り付ける
    • Confirm Hosts ⇒確認
    • Assign Slaves and Clients ⇒追加ホストごとにここでは Clients だけ選択
    • Configurations ⇒ここでは Configuration Group に Default を選択
    • Install, Start and Test ⇒確認
    • Summary ⇒確認


YARN の Configuration Group を設定

追加した高スペックのサーバーのリソースをきちんと利用するには、そのための YARN 設定をしないといけません。
既存の設定から何も変えないと、前のスペックにあわせた設定を引き継ぐだけなので、せっかくのリソースが無駄になってしまいます。

具体的には YARN 設定を切り分ける Configuration Group を設定します。

Configuration Group の作成とホスト登録

Ambari 管理画面の左にあるサイドメニューから、「YARN」リンク > 「Configs」タブ > 「Manage Config Groups」リンクを選択します。
ウィザードが出てきたら、以下のように進めてください。
  • 左のテキストエリア下にある「+」ボタンを押して、新しい Configuration Group を作る ⇒「High-spec-201806」という設定名にします
  • 新しく作った「High-spec-201806」を選択、右のテキストエリア下にある「+」ボタンを押して、登録したいホストにチェック
  • 右下にある「Save」ボタンを押す

追加したホストに 必要な Hadoop サービスを展開

今回追加したいのはスレーブノードなので、以下の4つのコンポーネントを展開します。
  • DataNode
  • HST Agent
  • Metrics Monitor
  • NodeManager
HST Agent と Metrics Monitor はホスト追加時にインストール済みなので、実質追加するのは DataNode と NodeManager になります。
  • DataNode を追加
    • Ambari 管理画面の一番上にある「Hosts」メニューから追加ホスト (tst-hdp-s4, s5) のチェックボックスをチェック、「Actions」プルダウン > Selected Hosts > DataNodes > Add を選択、OKボタンを押す
    • HDFS サービスを Restart all します
  • NodeManager を追加
    • Ambari 管理画面の一番上にある「Hosts」メニューから追加ホスト (tst-hdp-s4, s5) のチェックボックスをチェック、「Actions」プルダウン > Selected Hosts > NodeManagers > Add を選択、OKボタンを押す
    • YARNをRestart all

新しく作った Configuration Group の YARN パラメータを設定

今回は高スペックにしたサーバーにあわせて、以下のパラメータを変更します。
  • yarn.nodemanager.resource.memory-mb = 46080 ⇒このパラメータには今回物理メモリの 75% を当ててみました
  • yarn.nodemanager.resource.cpu-vcores = 8 ⇒このパラメータには CPU 数の 3/4 を当ててみました (7.5 になるので四捨五入)
  • YARN サービスで Restart Affected します
Ambari 管理画面の左にあるサイドメニューから、「YARN」リンク > 「Configs」タブ > Group のプルダウンで「High-spec-201806」を選択します。

yarn.nodemanager.resource.memory-mb に関しては、「Settings」タブで、Memory > Node にある Memory allocated for all YARN containers on a node のスライドバーで設定してください。

yarn.nodemanager.resource.cpu-vcores に関しては、「Settings」タブで、CPU > Node にある Number of virtual cores のスライドバーで設定してください。

Configuration Group を作ると、運用が非常に大変になるのかなと思っていましたが、実際は変更したパラメータだけ Default グループのパラメータに上書きされて他はすべて引き継ぐため、運用がそんなに大変になることはなさそうです。


YARN Queue の作成と Node Labels の設定

YARN Queue を新しく作成し、YARN Node Labels を設定して、既存サーバーと高スペックサーバーでリソースが使い分けられるようにします。

Queue の新規作成と Node Labels の有効化

Ambari 管理画面の左にあるサイドメニューから、「YARN」リンク > 「Configs」タブ > Default グループを選択します。
「Settings」タブで、YARN Features にある Node Labels と Pre-emption のスライドバーを Enable にします。

次に、管理画面の一番上にある表マークメニューのプルダウンで「YARN Queue Manager」を選択します。
画面の一番左上にある「+ Add Queue」ボタンを押し、今回は「batch-analitics」という名前のキューを追加します。
画面左上にある「Actions」プルダウンから「Save Only」を押したあと、YARN サービスで Restart Affected してください。

Ambari 管理画面から Node Labels を有効にすると、HDFS に /system/yarn というディレクトリをどうやら自動で作るみたいです。
[yarn@tst-hdp-m1 ~]$ hdfs dfs -ls /system
Found 1 items
drwx------   - yarn hadoop          0 2018-06-01 15:48 /system/yarn

キュー設計

今回検証目的として、図のような方針を立てました。敢えて少し複雑にしています。

default キューにはラベルなしのリソース 50%、normal-spec ラベルのリソース 50%を当てました。

一方、新たに追加した batch-analitics キューにはラベルなしのリソース 50%、normal-spec ラベルのリソース 50%、そして high-spec-201806 ラベルのリソース 100%を当てました。





対象ホストごとに Node Labels を登録

Node Labels の登録は、管理画面ではなくコマンドで行います。
今回は tst-hdp-m1 サーバーで実施します。

キュー設計にしたがって以下のようにコマンドを実行してください。tst-hdp-s1 だけラベルなしとしました。
yarn rmadmin -addToClusterNodeLabels "normal-spec(exclusive=false),high-spec-201806(exclusive=true)"

yarn rmadmin -replaceLabelsOnNode "tst-hdp-s2.tst.hdptest.com=normal-spec tst-hdp-s3.tst.hdptest.com=normal-spec kat-hdp-s4.tst.hdptest.com=high-spec-201806 tst-hdp-s5.tst.hdptest.com=high-spec-201806"
exclusive = true | false は、ラベルを割り当てたリソースを占有させるか共有可能とするかのパラメータです。
normal-spec は default キューと batch-analitics キューの両方を使うので false 、high-spec-201806 は batch-analitics キュー専用にするので true にします。
こちらの Hortonworks のドキュメントを参考にしてみてください。

YARN Queue と Node Labels のリソース配分設定

管理画面の一番上にある表マークメニューのプルダウンで「YARN Queue Manager」を選択します。
画面左上にある batch-analitics キューを選択、右画面に表示される Capacity の Enable Node Labels をチェック、スライドバーを図のように設定してください。


続いて、画面左上にある default キューを選択、batch-analitics キューと同じく、図のように設定してください。




YARN Queue と Node Labels を指定してジョブを試してみる

今回の設定がきちんと動くか、こちらの Hortonworks コミュニティの記事を参考に、簡単に動作検証してみます。

今回は tst-hdp-m1 サーバーで hdfs ユーザーで実施します。
単なる sleep コマンドを敢えて YARN Queue と Node Labels を指定して実行するコマンドを3つ同時に実行します。
  • batch-analitics キューと high-spec-201806 ラベルを指定して実行
    hadoop jar \
     /usr/hdp/current/hadoop-yarn-client/hadoop-yarn-applications-distributedshell.jar \
     -shell_command "sleep 100" \
     -jar /usr/hdp/current/hadoop-yarn-client/hadoop-yarn-applications-distributedshell.jar \
     -queue batch-analitics \
     -node_label_expression high-spec-201806 \
    
  • batch-analitics キューと normal-spec ラベルを指定して実行
    hadoop jar \
     /usr/hdp/current/hadoop-yarn-client/hadoop-yarn-applications-distributedshell.jar \
     -shell_command "sleep 100" \
     -jar /usr/hdp/current/hadoop-yarn-client/hadoop-yarn-applications-distributedshell.jar \
     -queue batch-analitics \
     -node_label_expression normal-spec \
    
  • default キューと normal-spec ラベルを指定して実行
     hadoop jar \
     /usr/hdp/current/hadoop-yarn-client/hadoop-yarn-applications-distributedshell.jar \
     -shell_command "sleep 100" \
     -jar /usr/hdp/current/hadoop-yarn-client/hadoop-yarn-applications-distributedshell.jar 
     -queue default \
     -node_label_expression normal-spec \
    

結果、以下の図のように設定したキューを指定して動作できていることが確認できました。


まとめ

今回試してわかったことは、YARN の Configuration Group、Queue、Node Labels をうまく使って、Apache Ranger などの権限管理と組み合わせれば、割と容易に一つの大きな Hadoop クラスタをたくさんのコンテナのように分けて運用できそうということです。
思っていたよりは複雑ということはないので、みなさんもぜひ試してみてください。

最後に

次世代システム研究室では、データ分析エンジニアやアーキテクトを募集しています。ビッグデータの解析業務など次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。

皆さんのご応募をお待ちしています。