「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>分散処理]] --Apache Hadoop --[[Apache Spark]] *目次 [#tfa037d5] #contents *概要 [#obdf758b] -Apache Hadoopは --Javaで書かれている。 --数千ノードおよびペタバイト級の分散処理を支えるOSSフレームワーク。 --Google [[MapReduce>#l29e344a]]および[[Google File System(GFS)>#uc4c35e7]]論文に触発されたもの。 --実行プラン作成の観点において、手続き型言語と宣言型言語の中間的なもの。 >※ 参考: --[[目的別 > 分散(バッチ)系>分散処理#jb20d368]] --[[プロダクト > 分散(バッチ)系>分散処理#ked24982]] **Hadoop MapReduce [#y0681858] ***特性 [#y5be412a] -ワークロード --非構造化データを対象としたETL(Extract-Transform-Load)処理を想定。 --並列データベースの構造化データに対する分析クエリような処理は想定していない。 -高い --耐障害性 --スケーラビリティ -抽象化インターフェース ***構成 [#d638a90d] -[[MapReduce>#l29e344a]]処理系 -高速なファイルの読み書きが可能な分散ファイルシステム --[[HDFS>#l2a0cd99]] --[[ソレ以外>#u357a307]] ***処理系 [#bd937444] -複数の計算機上で効率的に処理を行う、~ データ処理用のプログラミング・モデル -プログラミング・モデルが動作する処理系 **Hadoop YARN [#vb7fabb0] -Hadoop YARN(Yet Another Resource Negotiator) -Hadoop 2.2から利用可能なリソース管理コンポーネント ***特性 [#vda1e297] [[旧管理コンポーネント>#a8d32de3]]との違い -分散リソース制御機構 --MapReduce V2 --Hadoop YARN(と[[ApplicationMaster>#ma4d2909]]) -[[課題>#uab2f1a3]]の解決 --クラスタ規模の拡大: [[JobTracker>#r9d168f4]]の改善 --[[MapReduce>#l29e344a]]以外の分散処理の実行: ... --リソース管理の効率化: [[TaskTracker>#v632e4fe]]の改善 ***構成 [#yb816f53] マスタ ・スレーブ型の構成 -マスタの役割を担当するのが[[ResourceManager>#y41d95ad]] -スレーブの役割を担当するのが[[NodeManager>#ka1e70e1]] ***処理系 [#df2cf5e6] -マスタも高可用(HA)構成を取ることができる。 -マスタが任意のタイミングで切り替わっても動作が停止しない --マスタが保持している管理情報は投入されるジョブ数に比例して増加はするが、 --管理情報(ジョブの投入状況および進捗状況の変更)を[[Apache ZooKeeper]]に保持して捌く。 *詳細 [#c84994b5] **リソース管理基盤システム [#oa5d57cf] 計算リソースの管理する基盤システム(リソース管理基盤システム) ***懸念 [#l3e538f9] 計算機クラスタを複数用いることは必ずしも容易ではない。 -1つの計算機クラスタ上で複数の処理系を用いる場合~ 複数の処理系の間で計算資源(計算リソース)を分離できない -処理系毎に計算機クラスタを用意する場合 --データの一貫性の管理や運用による手間が余計にかかる。 --データが巨大である場合計算機クラスタ間におけるデータの~ 移動や同期による性能的なオーバーヘッドが大きくなる。 ***方式 [#s517c496] -Apache Mesos,[[Apache YARN>#ke539051]],Google Borgが~ 広く普及しつつあり、いずれもマスタ・スレーブ型のアーキテクチャを採る。 -マスタ・スレーブ型は、 --スケーラビリティよりも一貫性や単純さを重視する傾向がある。 --反面、マスタが ---単一障害点となり可用性が低下する場合 ---ボトルネックとなり高いスケーラビリティが実現できない場合 - >がある。 ***機能 [#tc5a9dc6] (マスタ・スレーブ型の機能概要) -マスタ --スレーブからクラスタ全体の計算リソースの情報を収集する。 --その情報を元に,クライアントからの計算リソース要求に応じ~ どのスレーブのリソースを確保するかをスケジューリングする。 -スレーブ~ スレーブが稼働する各ローカルノードが保持する計算リソースを管理する。 --現在使用中の計算リソースと未使用の計算リソースを逐次マスタに報告する。 --マスタから計算リソースの要求に応じて計算リソースを確保する。 **Hadoop MapReduce [#vb32d67b] ***耐障害性設計 [#s89593bf] -分散ファイルシステムのレプリケーションによりブロックの高い可用性を実現。 -中間データを二次記憶に適宜書き出すことにより、ジョブのリランが可能。 ***スケーラビリティ設計 [#ld37d79d] -ディスク入出力性能を最大限に活用する。 --大きなブロック単位の入出力~ 従来のNFSなどの分散ファイルシステムと比較し、~ 高いシーケンシャルアクセス性能を活用できる。 --無共有型のアーキテクチャ ---並列ディスク走査 ---高いスケーラビリティを実現可能 -ネットワーク入出力を最小限に抑える。 --近年におけるコモディティサーバはでは、~ ネットワークスイッチのI/O性能が各計算機のI/O性能よりも低い。 --従って、種々の効率化技法が用いられる。 ---転送データ圧縮 ---集約処理~ ・通常の処理~ Map側で集約キーによって出力データを分割、~ ネットワークを介して分配し、Reduce側でキー毎の集約を行う。~ ~ ・可換則と結合則を満たす集約処理~ Map側で集約処理(部分集約)を行い、~ ネットワークへのデータ転送量の削減を試みる。 ***抽象化インターフェース設計 [#sbffb5e7] -map()とreduce()なる2つの関数だけをプログラマに定義させる。 -その他の処理はすべて処理系で行う。 **Hadoop YARN [#ke539051] ***課題 [#uab2f1a3] -クラスタ規模の拡大~ Hadoop 1系までの[[MapReduce>#l29e344a]]エンジンにおける1つのマスタ([[JobTracker>#r9d168f4]])が~ 以下の「クラスタのリソース管理」を担当する必要があったため、~ 負荷が大きく、Hadoopクラスタの台数は1000台程度が限界であった。 --クラスタ内で実行される[[MapReduce>#l29e344a]]ジョブのスケジューリング --[[MapReduce>#l29e344a]]ジョブの各タスクに対する入力データの割り当てや進捗管理) -[[MapReduce>#l29e344a]]以外の分散処理の実行~ Hadoopで分散処理するためには、必ず[[MapReduce>#l29e344a]]の仕組みに当てはめる必要があった。 --[[MapReduce>#l29e344a]]が2回以上連続するような処理を実行する場合、 ---前段の[[MapReduce>#l29e344a]]ジョブの処理結果を[[HDFS>#l2a0cd99]]に書き込み、 ---それを後続の[[MapReduce>#l29e344a]]で読み込む、という流れになる。 --ここで[[HDFS>#l2a0cd99]]に中間データを書き込むため、処理が非効率である。~ 多段の[[MapReduce>#l29e344a]]となるような処理を高速化するために、~ [[MapReduce>#l29e344a]]フレームワークとは異なる分散処理が必要であった。 -リソース管理の効率化 --Hadoop 1系までの[[MapReduce>#l29e344a]]エンジンにおけるスレーブ([[TaskTracker>#v632e4fe]])ではMapタスク用、~ Reduceタスク用にそれぞれスロットが用意されており、そこに[[MapReduce>#l29e344a]]の各タスクが割り当てられる。 --ここで、Mapタスク用のスロットに空きがない場合は、Reduceタスク用のスロットに空きがあったとしても~ Mapタスクをこれ以上割り当てることができず、[[TaskTracker>#v632e4fe]]のリソース使用率が低下する問題があった。 ***機能 [#w0113d01] -YARN上では、MapReduceジョブごとにMapReduceマスタを立ち上げる。 -[[MapReduce>#l29e344a]]からクラスタの --リソース管理 --ジョブ・スケジューリング >を分離したことにより、 --アプリケーションの記述性が柔軟になった。 --[[YARN>#kbbf8cab]]上では[[MapReduce>#l29e344a]]以外にも、 ---[[分散処理>#l53ced38]] ---[[SQLクエリエンジン>#ba1a28d5]] ---[[分散ストリーム処理>#j27192bd]] - >などの様々な[[分散処理フレームワーク>#z3a4ca3c]]が動作するようになった。 ***動作フロー [#p9dd76a8] -YARNのクライアントが[[ResourceManager>#y41d95ad]]に対して[[MapReduce>#l29e344a]]ジョブを投入する。 -[[ResourceManager>#y41d95ad]]が[[MapReduce>#l29e344a]]マスタ用コンテナを確保しようと試みる。 -[[MapReduce>#l29e344a]]マスタ用のコンテナが確保されると[[MapReduce>#l29e344a]]マスタが起動し、 -[[MapReduce>#l29e344a]]マスタはジョブに必要なコンテナを[[ResourceManager>#y41d95ad]]に要求する。 -[[ResourceManager>#y41d95ad]]は, --コンテナを[[NodeManager>#ka1e70e1]]から確保するように指示を出し、 --[[MapReduce>#l29e344a]]スレーブ用コンテナを確保する。 -[[MapReduce>#l29e344a]]マスタは, --リクエストの応答としてそのコンテナの情報を受け取り、 --[[MapReduce>#l29e344a]]の処理を開始する。 -[[MapReduce>#l29e344a]]処理が完了すると, --MapReduceマスタがジョブの完了を[[ResourceManager>#y41d95ad]]に伝え, --[[ResourceManager>#y41d95ad]]は当該リソースを開放する。 ***スケジューリング・アルゴリズム [#wf6ace41] -FIFO(First-In-First-Out)~ 投入された順番にジョブを実行する。 --スケジューリングの挙動が運用者にとって理解しやすい。 --投入されるジョブの数に比例して,後のジョブの実行完了時間が遅くなる。 -Fair~ 稼働中のアプリケーションそれぞれに平等にリソースを配分する。 --ジョブは、投入されたジョブの順番に関わらず計算リソースを利用できる。 --特定の条件にマッチしたジョブの優先順位を上げることができる。 -Capacity~ グループ毎にリソースを配分する。 --グループごとに運用者が定義した割合でリソースを分配できる。 --以下の状況を回避できる。 ---特定の組織が計算リソースを占有してしまう。 ---優先順位の低いアプリケーションが大量に立ち上がることにより優先順位の高いジョブが動作できない。 *アーキテクチャ [#a044803a] Hadoopは、以下のモジュールによって構成されている。 -[[Hadoop Common>#uc3d5768]] -[[Hadoop MapReduce>#b9ef92ab]] -[[Hadoop Distributed File System (HDFS)>#l2a0cd99]] -管理コンポーネント --[[旧管理コンポーネント>#a8d32de3]] --[[Hadoop Yet Another Resource Negotiator (YARN)>#kbbf8cab]] **Hadoop Common [#uc3d5768] 他のモジュールから共通して利用されるライブラリ群。 **Hadoop MapReduce [#b9ef92ab] -[[MapReduce>#l29e344a]]の実装。 --可能な限り入力データを保持する[[DataNode>#r71e974a]]と同一ノードでMapタスクが実行されるようにスケジューリングされる。 --これにより、大規模データ処理においてもネットワークの負荷を抑えることが可能である。 -[[JobTracker>#r9d168f4]]、[[TaskTracker>#v632e4fe]]による[[MapReduce>#l29e344a]]は[[MRv1>#kcc53ae0]]と呼ばれる。 -Hadoop 2系以降は、[[MRv1>#kcc53ae0]]をサポートしていない。~ [[YARN>#kbbf8cab]]上で[[MapReduce>#l29e344a]]上が動作し、[[MRv2>#la093707]]と呼ばれる。 ***ファイル・システム [#u357a307] [[HDFS>#l2a0cd99]]以外のファイル・システムもサポートしている。 -Amazon Simple Storage Service (S3) -OpenStack Swift -Microsoft Azure -FTP、HTTP、およびHTTPS経由で~ アクセス可能なファイル・システム ***MRv1 [#kcc53ae0] [[MapReduce>#l29e344a]]エンジンはひとつの[[JobTracker>#r9d168f4]]を持ち、~ クライアントはこの[[JobTracker>#r9d168f4]]に向けて[[MapReduce>#l29e344a]]ジョブを投入する。 ***MRv2 [#la093707] -クライアントが[[YARN>#kbbf8cab]]上で[[MapReduce>#l29e344a]]を実行する場合、[[ResourceManager>#y41d95ad]]に[[MapReduce>#l29e344a]]ジョブを投入する。 -[[MapReduce>#l29e344a]]ジョブが停止した場合、[[JobTracker>#r9d168f4]]を再起動して[[MapReduce>#l29e344a]]ジョブを再実行する必要がある。 **Hadoop Distributed File System (HDFS) [#l2a0cd99] HDFS:Hadoop独自の分散ファイル・システム。 -Googleの分散ファイルシステム、[[Google File System(GFS)>#uc4c35e7]]のクローン -シンプルなアーキテクチャで、膨大なデータ量をライトワンスで格納 -データスループット指向で、低レイテンシーではない。 --大きなファイルを複数のブロック単位(デフォルトで128MB)に分割して、それらを複数のノードにまたがり格納する。 --そのブロックの複製(レプリカ)を複数の異なるノードに格納することで信頼性を確保している(標準で3重化、RAID不要)。 -HDFSはマスタ・スレーブ型の構成 -HDFSクライアントを使ってアクセスする。~ HTTP、FTP、Fuseなどからもアクセスできる(専用のHDFSクライアント経由)。 -通常のFSにマウントできなかったが、Hadoop 2.2以降はNFSv3マウントに対応。 ***NameNode [#ca7d0d6e] マスタの役割を担当する。 -HDFSに関するメタ情報(ファイルとブロックの対応関係など)を保持し、各[[DataNode>#r71e974a]]が実データをブロック単位で保持する。 -任意の[[DataNode>#r71e974a]]が故障した場合は、自動でそれを検知し、故障した[[DataNode>#r71e974a]]の保持ブロックを別の[[DataNode>#r71e974a]]から参照するよう命令する。 -このようにして[[DataNode>#r71e974a]]が故障した場合も自動的にレプリケーション数が維持されるため、[[DataNode>#r71e974a]]が故障してもサービスに影響は発生しない。 -単一障害点であったが、Hadoop 2.2でHA機能が実装されたため単一障害点ではなくなった。 --状態変更は既存の[[Apache ZooKeeper]]を用いずMulti Paxosを実装して用いる。 --ことにより,メッセージ数の削減による高性能化を実現する。 ***DataNode [#r71e974a] スレーブの役割を担当する。 -実データをブロック単位で保持する。 -レプリケーション数のデフォルトは3で、この場合、 --2つのデータを同じラック内のノードに、 --残り1つを異なるラック内のノードに >保存する。 -数1000台規模までスケールアウト可能。~ その場合、数10PB規模のデータを格納できる。 **旧管理コンポーネント [#a8d32de3] Hadoopクラスタの -リソース管理 -ジョブ・スケジューリング を担当。 ***JobTracker [#r9d168f4] 旧マスタ(リソース管理、ジョブ・スケジューリング)ノード -[[MapReduce>#b9ef92ab]]ジョブが投入されると、[[JobTracker>#r9d168f4]]はクラスタ中の利用可能な[[TaskTracker>#v632e4fe]]に仕事を依頼する。 -何らかの異常によって[[JobTracker>#r9d168f4]]が停止すると、実行中の[[MapReduce>#b9ef92ab]]ジョブも停止する。 ***TaskTracker [#v632e4fe] 旧スレーブ(割り当てられた処理の実行)ノード -1筐体上で[[DataNode>#r71e974a]]と[[TaskTracker>#v632e4fe]]が動く。 -[[TaskTracker>#v632e4fe]]が停止するか、実行中のタスクがタイムアウトすると、その部分のタスクは再スケジュールされる。 **Hadoop Yet Another Resource Negotiator (YARN) [#kbbf8cab] -[[旧管理コンポーネント>#a8d32de3]]の後継 -Hadoop 2.2から利用可能。 ***ResourceManager [#y41d95ad] -投入された[[MapReduce>#b9ef92ab]]ジョブを管理するマスタ・ノード。 -[[MapReduce>#b9ef92ab]]ジョブが投入されると、[[ResourceManager>#y41d95ad]]は[[ApplicationMaster>#ma4d2909]]を[[NodeManager>#ka1e70e1]]上で立ち上げる。 ***NodeManager [#ka1e70e1] -処理ノードを管理するスレーブ・ノード -1筐体上で[[DataNode>#r71e974a]]と[[NodeManager>#ka1e70e1]]が動く。 -[[MapReduce>#b9ef92ab]]タスクの実行コンテナ。 --計算リソース(CPU、メモリ、ネットワーク / ディスク帯域, etc.)の集合をコンテナと称する。 --[[ApplicationMaster>#ma4d2909]]もそのコンテナ上で動作する。 --汎用化したコンテナ単位でリソースを割り当てるので、 ***ApplicationMaster [#ma4d2909] -アプリケーションを管理するノード -[[MapReduce>#b9ef92ab]]を含む各アプリケーション用に~ それぞれ専用のApplicationMasterが実行される。 --最初の[[NodeManager>#ka1e70e1]]が[[ApplicationMaster>#ma4d2909]]になる。 --[[NodeManager>#ka1e70e1]]ヘの[[MapReduce>#b9ef92ab]]タスクの割り当て進捗管理を担当する。 --必要なリソースは都度[[ResourceManager>#y41d95ad]]に問合せ払い出してもらう。 *エコシステム [#l99f9094] **分散処理フレームワーク [#z3a4ca3c] Hadoop MapReduceと比べて ***分散処理エンジン [#l53ced38] アプリケーションの記述性が柔軟で、より高効率な実行が可能。 -[[Apache Spark]] -[[Apache Tez]] -Apache Flink ***SQLクエリエンジン [#ba1a28d5] クエリを低い(レイテンシ)で実行可能 -[[Apache Impala]] -[[Apache Drill]] -Facebook Presto ***分散ストリーム処理 [#j27192bd] 大量のストリームデータを低い遅延(レイテンシ)で処理可能 -[[Apache Storm]] -[[Spark Streaming]] -[[Apache Samza]] -Twitter Heron **DWH、データストア [#b1f1754b] ***[[Apache Hive]](DWH) [#qe92d339] ***[[Apache Impala]](DWH) [#v8ad3b2f] ***HBase、Kudu [#uc9bf89a] -[[Apache HBase]] -[[Apache Kudu]] **[[Asakusa Framework]] [#dee51df9] ノーチラス・テクノロジーズが開発した、~ Hadoop用の開発・運用フレームワーク。 *参考 [#f76f444f] -Hadoopの概念と基本的知識~ https://www.slideshare.net/sasakipochi/hadoop-43231811 -分散処理技術「Hadoop」とは:NTTデータのHadoopソリューション~ https://oss.nttdata.com/hadoop/hadoop.html **Wikipedia [#k87a363b] -Apache Hadoop~ https://ja.wikipedia.org/wiki/Apache_Hadoop ***MapReduce [#l29e344a] -MapReduce~ https://ja.wikipedia.org/wiki/MapReduce ***Google File System(GFS) [#uc4c35e7] -Google File System~ https://ja.wikipedia.org/wiki/Google_File_System **gihyo.jp … 技術評論社 [#r8aff958] Hadoopはどのように動くのか ***Hadoop MapReduce [#gd508729] 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 [#h693517e] 計算機クラスタのためのリソース管理基盤 Hadoop YARN -第15回~ https://gihyo.jp/admin/serial/01/how_hadoop_works/0015 **Hadoopの [#c9395558] ***歴史 [#reddea41] -【特集記事】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 ***エコシステム [#w3cca958] -Hadoopと愉快な仲間たち - Qiita~ https://qiita.com/DG0426/items/7072b35761d43b78b634 **Qiita [#ba347491] ***Hadoop [#ve64479e] ***YARN [#d5518b0e] -あの日見たYARNのお仕事を僕達はまだ知らない。~ https://qiita.com/keigodasu/items/09f7e0a15d721b0b5212 -YARN 上における分散処理基盤のリソース管理について~ https://qiita.com/oza_x86/items/758b20d43d5171275f9e -Spark and YARN~ https://qiita.com/imaifactory/items/f35ef03bfa4f268b1b83 -Spark on YARN のアーキテクチャ~ https://qiita.com/kojish/items/c845112265cbb7a5577a