DNET_Hadoop - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
- 戻る(分散処理)
- Apache Hadoop
- Apache Spark
- Apache Hadoopは
- Javaで書かれている。
- 数千ノードおよびペタバイト級の分散処理を支えるOSSフレームワーク。
- Google MapReduceおよびGoogle File System(GFS)論文に触発されたもの。
- 実行プラン作成の観点において、手続き型言語と宣言型言語の中間的なもの。
※ 参考:
- 目的別 > 分散(バッチ)系(分散処理:分散(バッチ)系の該当節を参照)
- プロダクト > 分散(バッチ)系(分散処理:分散(バッチ)系の該当節を参照)
-
ワークロード
- 非構造化データを対象としたETL(Extract-Transform-Load)処理を想定。
- 並列データベースの構造化データに対する分析クエリのような処理は想定していない。
-
高い
- 耐障害性
- スケーラビリティ
-
抽象化インターフェース
-
複数の計算機上で効率的に処理を行う、
データ処理用のプログラミング・モデル -
プログラミング・モデルが動作する処理系
- Hadoop YARN(Yet Another Resource Negotiator)
- Hadoop 2.2から利用可能なリソース管理コンポーネント
旧管理コンポーネントとの違い
-
分散リソース制御機構
- MapReduce V2
- Hadoop YARN(とApplicationMaster)
-
課題の解決
- クラスタ規模の拡大: JobTrackerの改善
- MapReduce以外の分散処理の実行: ...
- リソース管理の効率化: TaskTrackerの改善
マスタ・スレーブ型の構成
- マスタの役割を担当するのがResourceManager
- スレーブの役割を担当するのがNodeManager
- マスタも高可用(HA)構成を取ることができる。
- マスタが任意のタイミングで切り替わっても動作が停止しない
- マスタが保持している管理情報は投入されるジョブ数に比例して増加はするが、
- 管理情報(ジョブの投入状況および進捗状況の変更)を Apache ZooKeeperに保持して捌く。
計算リソースを管理する基盤システム(リソース管理基盤システム)
計算機クラスタを複数用いることは必ずしも容易ではない。
-
1つの計算機クラスタ上で複数の処理系を用いる場合
複数の処理系の間で計算資源(計算リソース)を分離できない -
処理系毎に計算機クラスタを用意する場合
- データの一貫性の管理や運用による手間が余計にかかる。
- データが巨大である場合、計算機クラスタ間におけるデータの
移動や同期による性能的なオーバーヘッドが大きくなる。
-
Apache Mesos、Apache YARN、Google Borgが
広く普及しつつあり、いずれもマスタ・スレーブ型のアーキテクチャを採る。 -
マスタ・スレーブ型は、
-
スケーラビリティよりも一貫性や単純さを重視する傾向がある。
-
反面、マスタが
- 単一障害点となり可用性が低下する場合
- ボトルネックとなり高いスケーラビリティが実現できない場合
がある。
-
(マスタ・スレーブ型の機能概要)
-
マスタ
- スレーブからクラスタ全体の計算リソースの情報を収集する。
- その情報を元に、クライアントからの計算リソース要求に応じ
どのスレーブのリソースを確保するかをスケジューリングする。
-
スレーブ
スレーブが稼働する各ローカルノードが保持する計算リソースを管理する。- 現在使用中の計算リソースと未使用の計算リソースを逐次マスタに報告する。
- マスタからの計算リソースの要求に応じて計算リソースを確保する。
- 分散ファイルシステムのレプリケーションによりブロックの高い可用性を実現。
- 中間データを二次記憶に適宜書き出すことにより、ジョブのリランが可能。
-
ディスク入出力性能を最大限に活用する。
-
大きなブロック単位の入出力
従来のNFSなどの分散ファイルシステムと比較し、
高いシーケンシャルアクセス性能を活用できる。 -
無共有型のアーキテクチャ
- 並列ディスク走査
- 高いスケーラビリティを実現可能
-
-
ネットワーク入出力を最小限に抑える。
-
近年におけるコモディティサーバでは、
ネットワークスイッチのI/O性能が各計算機のI/O性能よりも低い。 -
従って、種々の効率化技法が用いられる。
-
転送データ圧縮
-
集約処理
・通常の処理
Map側で集約キーによって出力データを分割、
ネットワークを介して分配し、Reduce側でキー毎の集約を行う。
・可換則と結合則を満たす集約処理
Map側で集約処理(部分集約)を行い、
ネットワークへのデータ転送量の削減を試みる。
-
-
- map()とreduce()なる2つの関数だけをプログラマに定義させる。
- その他の処理はすべて処理系で行う。
-
クラスタ規模の拡大
Hadoop 1系までのMapReduceエンジンにおける1つのマスタ(JobTracker)が
以下の「クラスタのリソース管理」を担当する必要があったため、
負荷が大きく、Hadoopクラスタの台数は1000台程度が限界であった。 -
MapReduce以外の分散処理の実行
Hadoopで分散処理するためには、必ずMapReduceの仕組みに当てはめる必要があった。 -
リソース管理の効率化
- Hadoop 1系までのMapReduceエンジンにおけるスレーブ(TaskTracker)ではMapタスク用、
Reduceタスク用にそれぞれスロットが用意されており、そこにMapReduceの各タスクが割り当てられる。 - ここで、Mapタスク用のスロットに空きがない場合は、Reduceタスク用のスロットに空きがあったとしても
Mapタスクをこれ以上割り当てることができず、TaskTrackerのリソース使用率が低下する問題があった。
- Hadoop 1系までのMapReduceエンジンにおけるスレーブ(TaskTracker)ではMapタスク用、
-
YARN上では、MapReduceジョブごとにMapReduceマスタを立ち上げる。
-
MapReduceからクラスタの
- リソース管理
- ジョブ・スケジューリング
を分離したことにより、
-
アプリケーションの記述性が柔軟になった。
などの様々な分散処理フレームワークが動作するようになった。
-
YARNのクライアントがResourceManagerに対してMapReduceジョブを投入する。
-
ResourceManagerがMapReduceマスタ用コンテナを確保しようと試みる。
-
MapReduceマスタはジョブに必要なコンテナをResourceManagerに要求する。
-
- コンテナをNodeManagerから確保するように指示を出し、
- MapReduceスレーブ用コンテナを確保する。
-
MapReduceマスタは、
- リクエストの応答としてそのコンテナの情報を受け取り、
- MapReduceの処理を開始する。
-
MapReduce処理が完了すると、
- MapReduceマスタがジョブの完了をResourceManagerに伝え、
- ResourceManagerは当該リソースを開放する。
-
FIFO(First-In-First-Out)
投入された順番にジョブを実行する。- スケジューリングの挙動が運用者にとって理解しやすい。
- 投入されるジョブの数に比例して、後のジョブの実行完了時間が遅くなる。
-
Fair
稼働中のアプリケーションそれぞれに平等にリソースを配分する。- ジョブは、投入されたジョブの順番に関わらず計算リソースを利用できる。
- 特定の条件にマッチしたジョブの優先順位を上げることができる。
-
Capacity
グループ毎にリソースを配分する。-
グループごとに運用者が定義した割合でリソースを分配できる。
-
以下の状況を回避できる。
- 特定の組織が計算リソースを占有してしまう。
- 優先順位の低いアプリケーションが大量に立ち上がることにより優先順位の高いジョブが動作できない。
-
Hadoopは、以下のモジュールによって構成されている。
他のモジュールから共通して利用されるライブラリ群。
-
MapReduceの実装。
- 可能な限り入力データを保持するDataNodeと同一ノードでMapタスクが実行されるようにスケジューリングされる。
- これにより、大規模データ処理においてもネットワークの負荷を抑えることが可能である。
-
JobTracker、TaskTrackerによるMapReduceはMRv1と呼ばれる。
HDFS以外のファイル・システムもサポートしている。
- Amazon Simple Storage Service (S3)
- OpenStack Swift
- Microsoft Azure
- FTP、HTTP、およびHTTPS経由で
アクセス可能なファイル・システム
MapReduceエンジンはひとつのJobTrackerを持ち、
クライアントはこのJobTrackerに向けてMapReduceジョブを投入する。
- クライアントがYARN上でMapReduceを実行する場合、ResourceManagerにMapReduceジョブを投入する。
-
MRv1と異なりJobTrackerは存在せず、ジョブ毎のApplicationMasterが
障害時に再起動されてMapReduceジョブが再実行される。
HDFS:Hadoop独自の分散ファイル・システム。
-
Googleの分散ファイルシステム、Google File System(GFS)のクローン
-
シンプルなアーキテクチャで、膨大なデータ量をライトワンスで格納
-
データスループット指向で、低レイテンシーではない。
-
大きなファイルを複数のブロック単位(デフォルトで128MB)に分割して、それらを複数のノードにまたがり格納する。
-
そのブロックの複製(レプリカ)を複数の異なるノードに格納することで信頼性を確保している(標準で3重化、RAID不要)。
-
-
HDFSはマスタ・スレーブ型の構成
-
HDFSクライアントを使ってアクセスする。
HTTP、FTP、Fuseなどからもアクセスできる(専用のHDFSクライアント経由)。 -
通常のFSにマウントできなかったが、Hadoop 2.2以降はNFSv3マウントに対応。
マスタの役割を担当する。
-
HDFSに関するメタ情報(ファイルとブロックの対応関係など)を保持し、各DataNodeが実データをブロック単位で保持する。
-
任意のDataNodeが故障した場合は、自動でそれを検知し、故障したDataNodeの保持ブロックを別のDataNodeから参照するよう命令する。
-
このようにしてDataNodeが故障した場合も自動的にレプリケーション数が維持されるため、DataNodeが故障してもサービスに影響は発生しない。
-
単一障害点であったが、Hadoop 2.2でHA機能が実装されたため単一障害点ではなくなった。
- 状態変更は既存の Apache ZooKeeperを用いずMulti Paxosを実装して用いることにより、
- メッセージ数の削減による高性能化を実現する。
スレーブの役割を担当する。
-
実データをブロック単位で保持する。
-
レプリケーション数のデフォルトは3で、この場合、
- 2つのデータを同じラック内のノードに、
- 残り1つを異なるラック内のノードに
保存する。
-
数1000台規模までスケールアウト可能。
その場合、数10PB規模のデータを格納できる。
Hadoopクラスタの
- リソース管理
- ジョブ・スケジューリング
を担当。
旧マスタ(リソース管理、ジョブ・スケジューリング)ノード
- MapReduceジョブが投入されると、JobTrackerはクラスタ中の利用可能なTaskTrackerに仕事を依頼する。
- 何らかの異常によってJobTrackerが停止すると、実行中のMapReduceジョブも停止する。
旧スレーブ(割り当てられた処理の実行)ノード
- 1筐体上でDataNodeとTaskTrackerが動く。
- TaskTrackerが停止するか、実行中のタスクがタイムアウトすると、その部分のタスクは再スケジュールされる。
- 旧管理コンポーネントの後継
- Hadoop 2.2から利用可能。
-
投入されたMapReduceジョブを管理するマスタ・ノード。
-
MapReduceジョブが投入されると、ResourceManagerはApplicationMasterをNodeManager上で立ち上げる。
-
処理ノードを管理するスレーブ・ノード
-
1筐体上でDataNodeとNodeManagerが動く。
-
MapReduceタスクの実行コンテナ。
-
計算リソース(CPU、メモリ、ネットワーク / ディスク帯域, etc.)の集合をコンテナと称する。
-
ApplicationMasterもそのコンテナ上で動作する。
-
汎用化したコンテナ単位でリソースを割り当てるので、
MapReduce以外のアプリケーションにもリソースを配分できる。
-
-
アプリケーションを管理するノード
-
MapReduceを含む各アプリケーション用に
それぞれ専用のApplicationMasterが実行される。-
最初のNodeManagerがApplicationMasterになる。
-
NodeManagerへのMapReduceタスクの割り当て・進捗管理を担当する。
-
必要なリソースは都度ResourceManagerに問合せ払い出してもらう。
-
Hadoop MapReduceと比べて
アプリケーションの記述性が柔軟で、より高効率な実行が可能。
- Apache Spark
- Apache Tez
- Apache Flink
クエリを低い遅延(レイテンシ)で実行可能
- Apache Impala
- Apache Drill
- Facebook Presto
大量のストリームデータを低い遅延(レイテンシ)で処理可能
- Apache Storm
- Spark Streaming
- Apache Samza
- Twitter Heron
ノーチラス・テクノロジーズが開発した、
Hadoop用の開発・運用フレームワーク。
-
Hadoopの概念と基本的知識
https://www.slideshare.net/sasakipochi/hadoop-43231811 -
分散処理技術「Hadoop」とは:NTTデータのHadoopソリューション
https://oss.nttdata.com/hadoop/hadoop.html
- Apache Hadoop
https://ja.wikipedia.org/wiki/Apache_Hadoop
- MapReduce
https://ja.wikipedia.org/wiki/MapReduce
- Google File System
https://ja.wikipedia.org/wiki/Google_File_System
Hadoopはどのように動くのか
Hadoopの設計と実装~並列データ処理系Hadoop MapReduce
- 第13回[1]
https://gihyo.jp/admin/serial/01/how_hadoop_works/0013 - 第14回[2]
https://gihyo.jp/admin/serial/01/how_hadoop_works/0014
計算機クラスタのためのリソース管理基盤 Hadoop YARN
-
【特集記事】Hadoopの過去・現在、そして未来 | DataCenter Cafe
https://cafe-dc.com/other/hadoop-past-present-and-future/ -
Hadoopビッグデータ基盤の歴史を振り返る #cwt2015
https://www.slideshare.net/Cloudera_jp/hadoop-cwt2015 -
「Hadoopの時代は終わった」の意味を正しく理解する - 科学と非科学の迷宮
https://shiumachi.hatenablog.com/entry/2017/07/10/080827 -
HadoopからDocker、そしてKubernetesの登場
分散システムの歴史を紐解く - ログミーTech
https://logmi.jp/tech/articles/297612 -
SQL視点で辿るHadoopのだいたいの歴史 - Qiita
https://qiita.com/underttree/items/9f22bdff54df90cf6165
- Hadoopと愉快な仲間たち - Qiita
https://qiita.com/DG0426/items/7072b35761d43b78b634
- あの日見たYARNのお仕事を僕達はまだ知らない。
https://qiita.com/keigodasu/items/09f7e0a15d721b0b5212 - YARN 上における分散処理基盤のリソース管理について
https://qiita.com/oza_x86/items/758b20d43d5171275f9e
移行メモ
- 「MRv2」の節に「MapReduceジョブが停止した場合、JobTrackerを再起動して MapReduceジョブを再実行する必要がある」とあったが、 MRv2(YARN)には JobTracker が存在せず、同ページの他の記述とも矛盾するため、 「JobTracker は存在せず、ジョブ毎の ApplicationMaster が再起動される」旨に改めた。
- 「NodeManager」の「汎用化したコンテナ単位でリソースを割り当てるので、」で 文が途切れていたため、「MapReduce 以外のアプリケーションにもリソースを配分できる。」 と結びを補った。
- 誤記・脱字を修正した。「分析クエリような処理」→「分析クエリのような処理」、 「コモディティサーバはでは」→「コモディティサーバでは」、 「YARN上でMapReduce上が動作し」→「YARN上でMapReduceが動作し」、 「クエリを低い(レイテンシ)で実行可能」→「低い遅延(レイテンシ)で実行可能」、 「計算リソースの管理する基盤システム」→「計算リソースを管理する基盤システム」、 「NodeManagerヘの」(カタカナのヘ)→「への」、 「進捗管理)」の余分な閉じ括弧を除去した。
- 元の PukiWiki は「Hadoop MapReduce」「Hadoop YARN」「特性」「構成」「処理系」 「機能」などの同名見出しをページ内で繰り返しており、 GitHub Wiki ではアンカが衝突するため、括弧で文脈を補って一意にした。
Tags: 移行, Hadoop, MapReduce, YARN, HDFS, 分散処理, ビッグデータ, NameNode, DataNode, ResourceManager