金融データ分析基盤の構築 - Hadoop(5)

前回:


今回やること

  1. YARNのドキュメント読み

  2. YARN設定の手順まとめ

  3. 2をAnsibleのPlaybook形式に落とし込む

  4. 構築&デバッグ

YARNのドキュメント読み

YARNのアーキテクチャ

YARN(Yet-Another-Resource-Negotiator)は、リソース管理とジョブ管理を担当するシステムとなっており、主にResourceManager (RM), ApplicationMaster (AM)の二つの要素からなる。

RMはノード全体のリソースの管理を主に行い、各ノードのリソース情報をもとにジョブへのリソース割り当てなどを行う。下の図のように、基本的な構成はRMが全体に一つであるが、HA構成も取れるようになっている。

AMは大きく分けて二つの機能がある。一つは、RMへのリソースの交渉で、タスクが割り振られたときにRMへのリソースを要求するのはAMの役割だ。もう一つは、タスクの実行とモニタリングとなっている。

https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/YARN.html

加えて、RMの内部にはSchedulerとApplicationManagerの二つの要素があり、それぞれ責任範囲を明確に分けている。

Schedulerは純粋なスケジューラとなっており、その時々の状況(各ノードのCPU, メモリ使用率など)を考慮しつつリソースを割りあてる機能のみを備えている。そして、ApplicationManagerはジョブの送信を受け入れて最初のコンテナであるApplicationMasterを起動する(障害時には再起動も)。ApplicationMasterの方はSchedulerに対してリソースの交渉などを行う。

このYARNはMapReduceなどの処理を行うための基盤として用いられる。

YARNの基本設定

YARNの基本的な設定や起動方法はこちらに書かれている。

ちなみに、現時点でKerberosを利用した認証を導入しているので、こちらのセキュアな設定についても見ておく必要がある。

HDFSの時に設定済みのものを除くと、必要な設定は以下の通り。

  1. YARNの基本設定

  2. KerberosのYARN用プリンシパル作成

  3. 2の設定Keytabファイルの配置&設定

YARNの設定手順のまとめ

全ノード共通:

  • yarn.acl.enable:ACL(Access Control List)を有効化するか

  • yarn.admin.acl:管理者設定用ACL。*はすべて許可、スペースはすべて拒否

  • yarn.log-aggregation-enable:ログ集約を有効化するか

ResourceManage:

  • それぞれの要素のIPアドレス・ポート

    • yarn.resourcemanager.address

    • yarn.resourcemanager.scheduler.address

    • yarn.resourcemanager.resource-tracker.address

    • yarn.resourcemanager.admin.address

    • yarn.resourcemanager.webapp.address

  • yarn.resourcemanager.hostname:ホスト名

  • yarn.resourcemanager.scheduler.class:Capacity, Fairなど選べる

  • yarn.scheduler.minimum-allocation-mb:MB単位

  • yarn.scheduler.maximum-allocation-mb:MB単位

  • yarn.resourcemanager.nodes.(include|exclude)-path

NodeManager:

  • yarn.nodemanager.resource.memory-mb:コンテナが利用できるメモリ上限

  • yarn.nodemanager.vmem-pmem-ratio:仮想/物理メモリの比率

  • yarn.nodemanager.local-dirs:中間データが書かれる場所(複数可)

  • yarn.nodemanager.log-dirs:ログの場所

  • yarn.nodemanager.log.retain-seconds:ログ期間

  • yarn.nodemanager.remote-app-log-dir:HDFS上のログ。ログ集約有効時のみ

  • yarn.nodemanager.remote-app-log-dir-suffix:ログのサフィックス

  • yarn.nodemanager.aux-services:MapReduceに必要なサービス?

  • yarn.nodemanager.env-whitelist:コンテナ内で利用できる環境変数

その他:

  • yarn.log-aggregation.retain-seconds:集計ログの削除期間。-1は無効

  • yarn.log-aggregation.retain-check-interval-seconds:集計ログのチェック間隔

  • ヘルスチェック用の設定など

  • セキュリティ設定

これらの設定を適切に行い、同じ設定ファイルを各ノードに設置する感じで問題ないはず。

AnsibleでPlaybook形式に落とし込む

手順は全体の記事で書いたのとほぼ同じで、デフォルト変数を設定してそこからテンプレートで設定ファイルを作成。それらを各ノードに配置するのと、KDCサーバから取ってきたKeytabファイルを配置するという感じ。

# tasks/yarn.yaml

- name: Create HDFS user
  user:
    name: yarn
    group: hadoop
    state: present
    shell: /bin/bash

- name: Create a Keytab dir
  file:
    path: /etc/security/keytab
    state: "directory"

- name: Copy keytab files
  copy:
    src: "{{ item }}"
    dest: "/etc/security/keytab/{{ item }}"
    owner: yarn
    group: hadoop
    mode: "0600"
  loop:
    - "rm.service.keytab"
    - "nm.service.keytab"

- name: Copy setting files to hadoop dir
  template:
    src: yarn-site.xml.j2
    dest: /opt/hadoop/etc/hadoop/yarn-site.xml
    group: hadoop
    mode: "0644"
    directory_mode: "0755"
# defaults/main.yaml

hadoop_config:

...

  yarn-site:
    yarn.resourcemanager.hostname: hadoop-namenode1.home
    yarn.http.policy: HTTPS_ONLY
    yarn.resourcemanager.webapp.https.address: hadoop-namenode1.home:8090
    yarn.resourcemanager.principal: rm/_HOST@HOME
    yarn.resourcemanager.keytab: /etc/security/keytab/rm.service.keytab
    yarn.nodemanager.principal: nm/_HOST@HOME
    yarn.nodemanager.keytab: /etc/security/keytab/nm.service.keytab
    yarn.nodemanager.container-executor.class: org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor	
    yarn.nodemanager.linux-container-executor.group: hadoop
    yarn.nodemanager.linux-container-executor.path: /opt/hadoop/bin/container-executor
    yarn.nodemanager.webapp.https.address: 0.0.0.0:8044
# templates/yarn-site.xml.j2

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<configuration>
{% for key, value in hadoop_config['yarn-site'].items() %}
  <property>
    <name>{{ key }}</name>
    <value>{{ value }}</value>
  </property>
{% endfor %}
</configuration>

Kerberosのプリンシパル(rm/_HOST@HOME, nm/_HOST@HOME)は事前に作成しておく。これらの作成ができたら、Playbookを実行する。

問題発生

上記のように設定したところ、以下の問題が発生した。
実は、ドキュメントで見逃している部分があり、それが原因のものがいくつかあった。

  1. etc/hadoop/container-executor.cfgのgroupを設定

  2. bin/container-executorの権限を変更(4750)

  3. yarn.http.policyでHTTPS_ONLYを設定

  4. OpenSSLのバージョンを1.1にダウングレード

1, 2は実はドキュメントに書いてあって見逃した内容だった。
ドキュメントでは以下のように書いてあり、container-executorの設定ファイルや権限などがちゃんと指示されていた。

The executable must have specific permissions: 6050 or --Sr-s--- permissions user-owned by root (super-user) and group-owned by a special group (e.g. hadoop) of which the NodeManager Unix user is the group member and no ordinary application user is. If any application user belongs to this special group, security will be compromised. This special group name should be specified for the configuration property yarn.nodemanager.linux-container-executor.group in both conf/yarn-site.xml and conf/container-executor.cfg.

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SecureMode.html

3, 4に関しては、ドキュメントに記載されているのは見つけられなかった。

OpenSSLのバージョンを下げる

ノードにインストールされていたOpenSSLのバージョンは3.0だったが、YARNのログを見ると1.1が必要とされているようだった。しかし、パッケージマネージャ経由だと1.1がインストールできなさそうだったので、ソースからビルドする必要があった。

wget https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1/
tar -xf openssl-1.1.1.tar.gz
cd openssl-1.1.1
./config
make
sudo make install

このあと、既にOpenSSL3.0が入っていたので、update-alternativesを使って新しく追加した方のバージョンをデフォルトにした。

上記の対応をしたら正常にYARNが起動するようになった。

確認(YARNの管理画面表示)

起動しているかの確認として、YARNの管理画面の表示を行った。

実際になにかジョブを投げたわけではないので動作確認まではできていないが、とりあえず起動しているということは確認できた。

次やること

次はMapReduceの設定を行う。
MapReduceまで設定できたらHadoopの基本構成はとりあえず設定できたことになるので、そのあと、各設定が適切かもう一度見直す。(よくわからないけどとりあえず設定したものもあるし)


ログをみるとまだWARINGが結構あるから、それもぼちぼち見ていきたいところ。一旦起動に問題なければいいかと思っておいておいたけど、いざジョブを投げたりしたときにエラーが出そうな気もする。

あと、OpenSSLのバージョンが1.1になってしまうのもちょっと心配。
Hadoopのバージョン自体はそこまで古くないけど、ContainerExecutorが古そうな気がしている。このへんもちゃんと調べてみる。

いいなと思ったら応援しよう!