NetflixGenieの紹介
1. 概要
このチュートリアルでは、Netflixが抽象的な方法でクラスターにジョブを送信するために開発したGenieエンジンについて説明します。
このチュートリアルでは、HadoopやSparkなどのビッグデータ処理に関する基本的な知識をお勧めします。
2. なぜ魔神?
さまざまなサイズの多数のHadoopクラスターを含むクラウドにさまざまなタスクを送信する必要がある
多くのユーザーがクラスターを作成したり、構成について知りたくないと仮定すると、これは実際の問題になる可能性があります。 ユーザーがインフラストラクチャのセットアップに対処することなく、単にジョブを送信して結果を取り戻す方法を提供するのはどうですか?
3. 魔神とは何ですか?
Netflixは、前述の問題を正確に解決するために、分散エンジンとしてGenieを構築しました。 ジョブを送信するための統合されたRESTfulAPIを提供するエンジン自律的に。 Genieは、起動ジョブを構成から分離し、クラスターのスケーリングを柔軟に行えるようにします。
ただし、Genieはクラスター自体をスケーリングしません。ユーザーのニーズに一致するクラスターでジョブを開始することにより、ユーザーのタスクを実行するだけです。
スケジューリングは、Genieが構築されたものでもありません。 主な目的は、単一のジョブレベルでのジョブ管理です。
ワークフローのスケジューリングには、 ApacheOozieなどの他のツールを使用する必要があります。 実際、Netflixは次のように明確に述べています。
Genieは、Oozieのようなワークフロースケジューラではありません。 Genieの実行単位は、単一のHadoop、Hive、またはPigジョブです。 Genieはワークフローをスケジュールしたり実行したりしません。実際、Netflixでエンタープライズスケジューラ(UC4)を使用してETLを実行しています。
それでも、Genieは、クラスター、アプリケーション、コマンドなどのリソースを管理するためのAPIを提供しています。 リソースを登録すると、ユーザーはこれらのリソースを見つけて、ジョブの送信を開始できます。
最後に、Genieは多かれ少なかれNetflixの特定のニーズに合わせて調整されたオープンソースプロジェクトであることは注目に値します。 これは、Netflixの急速に変化するクラウド環境で重要な役割を果たし、Netflixのテクノロジースタックと統合されます。
4. 魔神の行動
それでは、Genieを使用してジョブを送信する方法をよりよく理解するために、Genieの動作を見てみましょう。 はじめに、GitHubで入手できるGenieデモについて説明します。
4.1. 前提条件
この例には以下が必要です。
- 最新のDockerおよびDockerComposeバージョン(または両方を含むDocker Desktop)
- 次の空きポート:8080、8088、19888、19070、19075、8089、19889、19071、および19076
- 少なくとも8GBのRAMを備えた比較的強力なマシンで、そのうち4GBをDockerに割り当てる必要があります
- 少なくとも4GBのディスクスペース
4.2. クラスターのセットアップ
まず、 docker-compose.yml を選択したフォルダーにダウンロードして、 DockerComposeを使用してクラスターをセットアップする必要があります。 このために、demoDirという名前の新しいディレクトリを作成しましょう。 作成ファイルは、1つずつ調査する5つのサービスを定義します。
まず、ポート8080をGenieUIにマップするgenie_demo_app_3.3.9という名前のコンテナーで実行されるGenieサーバーを見てみましょう。
genie:
image: netflixoss/genie-app:3.3.9
ports:
- "8080:8080"
depends_on:
- genie-hadoop-prod
- genie-hadoop-test
- genie-apache
tty: true
container_name: genie_demo_app_3.3.9
2番目のサービスはgenie_demo_apache_3.3.9で、デモに必要なファイルのダウンロードに使用されます。
genie-apache:
image: netflixoss/genie-demo-apache:3.3.9
tty: true
container_name: genie_demo_apache_3.3.9
次に、Genieクライアントがあります。これには、Genieを使用してジョブを送信するためのサンプルスクリプトが含まれています。 そのコンテナ名はgenie_demo_client_3.3.9です。
genie-client:
image: netflixoss/genie-demo-client:3.3.9
depends_on:
- genie
tty: true
container_name: genie_demo_client_3.3.9
次は、本番(SLA)Hadoopクラスターです。 このサービスは、提出されたジョブを受け取ります。 クラスターリソースマネージャーはポート8088にマップされますが、履歴サーバーは19888を取得します。
ここで小さな調整を行い、名前付きノードとデータノードをそれぞれポート19070と19075にマップします。
genie-hadoop-prod:
image: sequenceiq/hadoop-docker:2.7.1
command: /bin/bash -c "/usr/local/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver
&& /etc/bootstrap.sh -bash"
ports:
- "19888:19888"
- "19070:50070"
- "19075:50075"
- "8088:8088"
tty: true
container_name: genie_demo_hadoop_prod_3.3.9
最後に、テストクラスターを表すテストHadoopコンテナーを調べてみましょう。 本番クラスターと同様に、ポート8089(リソースマネージャー)、19889(履歴サーバー)、19071(名前付きノード)、および19076(データノード)が割り当てられます。
genie-hadoop-test:
image: sequenceiq/hadoop-docker:2.7.1
command: /bin/bash -c "/usr/local/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver
&& /etc/bootstrap.sh -bash"
ports:
- "19889:19888"
- "19071:50070"
- "19076:50075"
- "8089:8088"
tty: true
container_name: genie_demo_hadoop_test_3.3.9
しましょう docker-composeを実行して、上記のコンテナを起動しますから
cd demoDir
docker-compose up -d
以下をチェックすることで、クラスターが稼働して準備ができていることを確認できます。
- Genie UI: http:// localhost:8080
- SLAクラスターリソースマネージャーのUI: http:// localhost:8088
- TESTクラスターリソースマネージャーUI: http:// localhost:8089
4.3. Initデモ
これで、デモコンテナーの実行後、 dockerexecコマンドを使用してクライアントコンテナーにログインできます。
docker exec -it genie_demo_client_3.3.9 /bin/bash
ここで、クライアントコンテナー内で、initスクリプトを実行して、クラスターを準備してジョブを受け入れます。
./init_demo.py
デモが正常に実行されると、Genie UIはクラスター、コマンド、およびアプリケーションタブにデータを表示します。
4.4. ジョブの送信
別の例として、Sparkジョブを送信して、πの最初の10桁を計算してみましょう。 対応するリテラルを引数としてスクリプトに渡すことにより、テストまたはSLAのいずれかにジョブを送信できます。
./run_spark_submit_job.py sla 2.0.1
./run_spark_submit_job.py test 2.0.1
Genie UIの[ジョブ]タブから、各ジョブの説明のフォルダーアイコンをクリックして、出力フォルダーに移動できます。 そこから、正常に終了すると、stdout。の下に計算値が表示されます。
HadoopリソースマネージャーUIには、クラスタージョブも表示されます。
最後に、クライアントコンテナを終了し、以下を実行してすべてのデモコンテナを停止および削除します。
docker-compose down
イメージは引き続きディスク上で利用可能であり、いつでもデモコンテナを再開できます。
5. 結論
このチュートリアルでは、Netflixが開発したジョブ管理ツールであるGenieを紹介しました。
次に、デモを実行しました。これにより、実際のシナリオでGenieを使用する方法の実際的な例が得られました。
いつものように、コード例はGitHubのです。