dshimizu/blog

とりとめのないITブログ

Hadoop 関連の各コンポーネントや構成を調べつつ、Amazon EMR の全体像がどんな感じになるのかの自分用メモ

はじめに

EMR を触ることになったけど Hadoop のこともそれほどわかっていないのにマネージドサービスのものを触ってもよくわからないので調べた自分用のメモ。

Hadoop

hadoop.apache.org

Hadoop 自体は、 Google が開発した MapReduceGoogle File System(GFS) の技術をもとにオープンソースとして開発されているもの、という感じで、Apache Software Foundation によって運営されているプロジェクトの1つ。

The ApacheHadoop® project develops open-source software for reliable, scalable, distributed computing.

The Apache Hadoop software library is a framework that allows for the distributed processing of large data sets across clusters of computers using simple programming models. It is designed to scale up from single servers to thousands of machines, each offering local computation and storage. Rather than rely on hardware to deliver high-availability, the library itself is designed to detect and handle failures at the application layer, so delivering a highly-available service on top of a cluster of computers, each of which may be prone to failures.

何をするものか、というと上記は公式ページの抜粋 *1であるけど、 Hadoop が動くクラスター全体で大規模なデータセットの分散処理を可能にするフレームワーク

単一のサーバーから数千台のサーバーまでスケールアップできるように設計されており、それぞれがローカルの計算とストレージを提供する。 Hadoop ライブラリ自体は、ハードウェアに依存して高可用性を提供するのではなく、アプリケーションのレイヤで障害を検出して処理するように設計されているため、コモディティなサーバーを束ねたクラスター上で高可用性サービスを提供する。

Hadoop 構成要素

調べると色々出てきてよくわからなくなるが、Wikipediaによると大まかには以下の4つのコンポーネントからなるらしい。*2

HDFS(Hadoop Distributed File System)

HDFSGoogle File System(GFS) に相当する Hadoop で利用される分散ファイルシステム。NameNode(マスター)とDataNode(スレーブ)で構成される。 Hadoop 全体としては、NameNodeはマスターノードに、DataNodeはスレーブノードの中で構成される。

HDFS でのデータのアクセス

NameNodeはメタ情報を管理し、DataNodeはデータの実体を保存する。 NameNodeがダウンするとHDFS自体が停止してしまう。NameNode自体の冗長化しようとすると、Apache ZooKeeperが利用したAct/Stb構成をとる必要がある。ZooKeeper についてはここでは記載しない。

データを保存する際、dfs.block.size で設定されたサイズに分割されたデータを1つのブロックとしてDataNodeへ保存する。EMR 5.33 系だとdfs.block.sizeのデフォルト128MB。 また、dfs.replication で設定された値分、他のDataNodeにデータのコピーが保存される。これによって特定のDataNode障害時のデータロストをできるだけ防ぐ。EMR 5.33 系だとデフォルトは 3。この場合3つ同じデータを持つことになるため、3台のDataNodeで100GBのストレージを持っていても、使える容量は300GBではなく実質100GB程度になる。

HDFS上のデータにアクセスする場合は、ブロックの配置先等の情報をNameNodeに問い合わせ、そこから取得した情報を用いてDataNodeにアクセスしてブロックを取得する。

YARN(Yet Another Resource Negotiator)

YARNはResourceManager(マスター)、NodeManager(スレーブ)、ApplicationMasterから構成される。

ResourceManager

クラスター全体のリソース管理を行うプロセス。Hadoopではマスターノードで実行される。 ResourceManagerにはSchedulerとApplicationsManagerの2つの主要コンポーネントがある。

Schedulerは文字通りスケジューリングやハードウェアリソースの割当を担い、ApplicationsManagerはジョブの送信を受け入れ、ApplicationMasterへのコンテナのネゴシエート、失敗時にApplicationMasterコンテナーを再始動などを行う。ここでのコンテナとは、特定のノードで特定の量のリソース(メモリ、CPUなど)を使用する権限をアプリケーションに付与する仕組みのこと。

NodeManager

実際にアプリケーション(ジョブ)を実行するプロセス。Hadoopではスレーブノードで実行される。 コンテナのリソース使用量(CPU、メモリー、ディスク、ネットワーク)を監視し、それをApplicationMasterと連携する役目も担う。

Application Master

ResourceManager(ApplicationsManager/Scheduler) と適切なリソースコンテナをネゴシエートすると言ったやり取りをし、NodeManager とアプリケーションのステータスを追跡し、進行状況を監視する、といったやり取りをする。 実行するアプリケーションごとに1つ、スレーブノードで実行される。

MapReduce

論文によると以下のように大規模なデータセットを処理、または生成するためのプログラミングモデル、関連する実装、とのこと。*3

あんまりちゃんとわかってないが、Map処理でデータをKey, Value形式に分割し、Reduce処理でそのデータを集約する、と言った感じの動きするものらしい。

Hadoop での MapReduce は YARN の仕組みの上で動く模様。 *4

Hadoop Common

共通して利用されるライブラリ群。

多分この辺りのものを指しているのではないかと思われるけど具体的にはわかっていない。

EMR 概要図

多分こんな感じだと思っている。誤りに気づいたら都度アップデートしていく。

参考