Apache Hadoop ( / h ə ˈ duː p / ) は、信頼性が高くスケーラブルな分散コンピューティングのためのオープンソースソフトウェアユーティリティの集合体です。MapReduceプログラミングモデルを使用して、ビッグデータの分散ストレージと処理のためのソフトウェアフレームワークを提供します。Hadoop は元々、汎用ハードウェアで構築されたコンピュータクラスタ向けに設計されており、現在でもその用途が一般的です。[ 3 ]その後、より高性能なハードウェアのクラスタでも使用されるようになりました。[ 4 ] [ 5 ] Hadoop のすべてのモジュールは、ハードウェア障害はよくあることであり、フレームワークによって自動的に処理されるべきであるという基本的な前提に基づいて設計されています。[ 6 ]
Apache Hadoop の中核は、Hadoop 分散ファイルシステム (HDFS) と呼ばれるストレージ部分と、MapReduce プログラミング モデルである処理部分で構成されています。Hadoop はファイルを大きなブロックに分割し、クラスタ内のノードに分散します。次に、パッケージ化されたコードをノードに転送して、データを並列処理します。このアプローチは、ノードがアクセスできるデータを操作できるデータ局所性 [ 7 ] を活用しています。これにより、計算とデータが高速ネットワークを介して分散される並列ファイルシステムに依存する従来型のスーパーコンピュータ アーキテクチャよりも、データセットをより高速かつ効率的に処理できます。[ 8 ] [ 9 ]
Apache Hadoopの基本フレームワークは、以下のモジュールで構成されています。
Hadoopという用語は、基本モジュールとサブモジュールの両方、およびエコシステム[ 12 ]、つまりHadoopの上にまたはHadoopと並行してインストールできる追加のソフトウェアパッケージの集合体(Apache Pig、Apache Hive、Apache HBase、Apache Phoenix、Apache Spark、Apache ZooKeeper、Apache Impala、 Apache Flume、 Apache Sqoop、Apache Oozie、Apache Stormなど)の両方を指す場合によく使用されます。[ 13 ]
Apache Hadoop の MapReduce および HDFS コンポーネントは、MapReduceおよびGoogle ファイルシステムに関するGoogle の論文から着想を得ています。[ 14 ]
Hadoopフレームワーク自体は主にJavaプログラミング言語で記述されており、一部はC言語のネイティブコード、コマンドラインユーティリティはシェルスクリプトとして記述されています。Perl言語はHadoop Streamingで簡単に使用でき、ユーザープログラムのマップとリデュース部分を実装できます。[ 15 ]
Hadoop の共同創設者であるDoug Cutting 氏とMike Cafarella氏によると、Hadoop のアイデアは、2003 年 10 月に公開されたGoogle File System の論文で考案されたとのことです。 [ 16 ] [ 17 ]この概念は、Google の論文「MapReduce: Simplified Data Processing on Large Clusters」で拡張されました。[ 18 ]開発はApache Nutchプロジェクトで開始されましたが、2006 年 1 月に新しい Hadoop サブプロジェクトに移されました。[ 19 ]当時Yahoo!で働いていた Doug Cutting 氏は、息子のおもちゃの象にちなんでこのプロジェクトに名前を付けました。 [ 20 ] Nutch から抽出された最初のコードは、HDFS 用に約 5,000 行、MapReduce 用に約 6,000 行のコードで構成されていました。
2006 年 3 月、オーウェン・オマリーが Hadoop プロジェクトに初めてコミットしました。[ 21 ] Hadoop 0.1.0 は 2006 年 4 月にリリースされました。[ 22 ]プロジェクトへの貢献を通じて進化を続けています。[ 23 ] Hadoop 分散ファイルシステムの最初の設計ドキュメントは、2007 年にドゥルバ・ボルタクルによって書かれました。 [ 24 ]
Hadoopは、ファイルシステムとオペレーティングシステムレベルの抽象化を提供するHadoop Commonパッケージ、MapReduceエンジン(MapReduce/MR1またはYARN/MR2のいずれか)[ 32 ]、およびHadoop分散ファイルシステム(HDFS)で構成されています。Hadoop Commonパッケージには、Hadoopを起動するために必要なJavaアーカイブ(JAR)ファイルとスクリプトが含まれています。
作業の効率的なスケジューリングのために、Hadoop 互換のファイルシステムはすべて、ラックの名前、具体的にはワーカー ノードがあるネットワーク スイッチの名前であるロケーション認識機能を提供する必要があります。Hadoop アプリケーションはこの情報を使用して、データがあるノードでコードを実行し、それができない場合は同じラック/スイッチで実行してバックボーン トラフィックを削減できます。HDFS は、複数のラック間でデータの冗長性を確保するためにデータを複製する際にこの方法を使用します。このアプローチにより、ラックの電源障害やスイッチの障害の影響が軽減されます。これらのハードウェア障害のいずれかが発生した場合でも、データは引き続き利用可能です。[ 33 ]

小規模な Hadoop クラスターは、単一のマスターノードと複数のワーカーノードで構成されます。マスターノードは、ジョブトラッカー、タスクトラッカー、ネームノード、およびデータノードで構成されます。スレーブノードまたはワーカーノードは、データノードとタスクトラッカーの両方として機能しますが、データ専用および計算専用のワーカーノードを持つことも可能です。これらは通常、非標準的なアプリケーションでのみ使用されます。[ 34 ]
HadoopにはJava Runtime Environment(JRE)1.6以上が必要です。標準の起動およびシャットダウンスクリプトでは、クラスタ内のノード間でSecure Shell (SSH)が設定されている必要があります。 [ 35 ]
大規模なクラスタでは、HDFSノードは、ファイルシステムインデックスをホストする専用のNameNodeサーバーと、NameNodeのメモリ構造のスナップショットを生成してファイルシステムの破損やデータ損失を防ぐセカンダリNameNodeによって管理されます。同様に、スタンドアロンのJobTrackerサーバーは、ノード間でのジョブスケジューリングを管理できます。Hadoop MapReduceを別のファイルシステムで使用する場合、HDFSのNameNode、セカンダリNameNode、およびDataNodeアーキテクチャは、ファイルシステム固有の同等のものに置き換えられます。
Hadoop分散ファイルシステム(HDFS)は、Hadoopフレームワーク向けにJavaで記述された、分散型でスケーラブルかつ移植性の高いファイルシステムです。HadoopインスタンスはHDFSとMapReduceに分割されます。HDFSはデータの保存に使用され、MapReduceはデータの処理に使用されます。HDFSには以下の5つのサービスがあります。
上部の3つはマスターサービス/デーモン/ノードで、下部の2つはスレーブサービスです。マスターサービス同士、そしてスレーブサービス同士も通信できます。ネームノードはマスターノードであり、データノードはその対応するスレーブノードで、両者は通信可能です。
ネームノード: HDFSは、マスターノードと呼ばれる1つのネームノードのみで構成されています。マスターノードは、ファイルの追跡、ファイルシステムの管理、および保存されているすべてのデータのメタデータを保持します。具体的には、ネームノードには、ブロック数、データが格納されているデータノードの場所、レプリケーションの保存場所などの詳細情報が含まれています。ネームノードはクライアントと直接通信します。
データノード:データノードは、データをブロックとして格納します。これはスレーブノードとも呼ばれ、クライアントが読み書きを行うHDFSに実際のデータを保存します。これらはスレーブデーモンです。すべてのデータノードは、3秒ごとにネームノードにハートビートメッセージを送信し、自身が稼働していることを伝えます。このようにして、ネームノードがデータノードから2分間ハートビートを受信しない場合、そのデータノードはダウンしていると判断し、他のデータノードでブロック複製プロセスを開始します。
セカンダリネームノード:これは、ネームノードにあるファイルシステムメタデータのチェックポイントのみを処理するためのものです。これはチェックポイントノードとも呼ばれます。ネームノードのヘルパーノードです。セカンダリネームノードは、ネームノードにfsimageファイルとeditlogファイルを作成して送信するように指示し、それに基づいてセカンダリネームノードによって圧縮されたfsimageファイルが作成されます。[ 36 ]
ジョブトラッカー:ジョブトラッカーは、クライアントからMapReduce実行のリクエストを受け取ります。ジョブトラッカーは、処理に使用されるデータの場所を知るためにネームノードと通信します。ネームノードは、必要な処理データのメタデータを応答します。
タスク トラッカー:ジョブ トラッカーのスレーブ ノードであり、ジョブ トラッカーからタスクを受け取ります。また、ジョブ トラッカーからコードも受け取ります。タスク トラッカーはコードを受け取り、ファイルに適用します。ファイルにコードを適用するプロセスはマッパーと呼ばれます。[ 37 ]
Hadoopクラスタは、名目上は単一のネームノードとデータノードのクラスタで構成されますが、ネームノードの重要性から冗長化オプションも利用可能です。各データノードは、HDFS固有のブロックプロトコルを使用して、ネットワーク経由でデータブロックを提供します。ファイルシステムは通信にTCP/IPソケットを使用します。クライアントはリモートプロシージャコール(RPC)を使用して相互に通信します。
HDFS は、複数のマシンにまたがって大容量ファイル (通常ギガバイトからテラバイトの範囲[ 38 ] ) を保存します。複数のホスト間でデータを複製することで信頼性を実現し、理論的にはホスト上で冗長アレイ (RAID)ストレージを必要としません (ただし、入出力 (I/O) パフォーマンスを向上させるために、一部の RAID 構成は依然として有用です)。デフォルトの複製値である 3 では、データは 3 つのノードに保存されます。2 つのノードは同じラックに、1 つのノードは別のラックにあります。データ ノードは相互に通信して、データのバランスを再調整したり、コピーを移動したり、データの複製レベルを高く保ったりすることができます。HDFS は、POSIX ファイルシステムの要件が Hadoop アプリケーションの目標と異なるため、完全に POSIX に準拠していません。完全に POSIX に準拠したファイルシステムを持たないことのトレードオフは、データスループットのパフォーマンスの向上と、Append などの非 POSIX 操作のサポートです。[ 39 ]
2012年5月、HDFSに高可用性機能が追加され、[ 40 ] NameNodeと呼ばれるメインのメタデータサーバーがバックアップに手動でフェイルオーバーできるようになりました。このプロジェクトでは、自動フェイルオーバーの開発も開始されています。
HDFSファイルシステムには、いわゆるセカンダリネームノードが含まれています。これは、プライマリネームノードがオフラインになったときのバックアップネームノードと誤解される可能性のある紛らわしい用語です。実際には、セカンダリネームノードは定期的にプライマリネームノードに接続し、プライマリネームノードのディレクトリ情報のスナップショットを作成し、それをローカルまたはリモートディレクトリに保存します。これらのチェックポイントイメージを使用すると、ファイルシステムアクションのジャーナル全体を再生することなく、障害が発生したプライマリネームノードを再起動し、ログを編集して最新のディレクトリ構造を作成できます。ネームノードはメタデータの保存と管理の単一ポイントであるため、特に多数の小さなファイルなど、膨大な数のファイルをサポートする際のボトルネックになる可能性があります。新しく追加されたHDFS Federationは、複数のネームノードによって提供される複数の名前空間を許可することで、この問題をある程度解決することを目的としています。さらに、HDFSには、小さなファイルの問題、スケーラビリティの問題、単一障害点(SPoF)、大規模なメタデータ要求のボトルネックなどの問題があります。 HDFS を使用する利点の 1 つは、ジョブ トラッカーとタスク トラッカー間のデータ認識です。ジョブ トラッカーは、データの場所を認識した上で、マップ ジョブまたはリデュース ジョブをタスク トラッカーにスケジュールします。たとえば、ノード A にデータ (a、b、c) があり、ノード X にデータ (x、y、z) がある場合、ジョブ トラッカーはノード A に (a、b、c) のマップ タスクまたはリデュース タスクを実行するようにスケジュールし、ノード X には (x、y、z) のマップ タスクまたはリデュース タスクを実行するようにスケジュールします。これにより、ネットワークを流れるトラフィックの量が減り、不要なデータ転送が防止されます。Hadoop を他のファイルシステムで使用する場合、この利点は必ずしも利用できるとは限りません。これは、データ集約型のジョブで実証されているように、ジョブの完了時間に大きな影響を与える可能性があります。[ 41 ]
HDFSは主に不変ファイル向けに設計されており、同時書き込み操作を必要とするシステムには適さない可能性がある。[ 39 ]
HDFSは、 Linuxおよび一部の他のUnixシステム上のFilesystem in Userspace(FUSE)仮想ファイルシステムに直接マウントできます。
ファイルへのアクセスは、ネイティブの Java API、Thrift API (C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、 Cocoa、Smalltalk、OCamlなど多数の言語でクライアントを生成)、コマンドラインインターフェイス、 HTTP経由のHDFS-UI Web アプリケーション、またはサードパーティのネットワーク クライアント ライブラリを介して実現できます。[ 42 ]
HDFS は、さまざまなハードウェア プラットフォーム間での移植性と、さまざまな基盤となるオペレーティングシステムとの互換性を考慮して設計されています。HDFS の設計では移植性の制限が導入され、Java 実装では HDFS が実行されているプラットフォーム固有の機能を使用できないため、パフォーマンスのボトルネックが発生します。[ 43 ]エンタープライズ レベルのインフラストラクチャに広く統合されているため、大規模な HDFS パフォーマンスの監視はますます重要な問題になっています。エンド ツー エンドのパフォーマンスを監視するには、データ ノード、ネーム ノード、および基盤となるオペレーティングシステムからのメトリックを追跡する必要があります。[ 44 ]現在、 Hortonworks、Cloudera、Datadogなど、HDFS のパフォーマンスを追跡するための監視プラットフォームがいくつかあります。
Hadoopは、基盤となるオペレーティングシステムがURLを使用するだけでマウントできる分散ファイルシステムであれば、直接操作できますfile://。しかし、これにはローカリティの喪失という代償が伴います。ネットワークトラフィックを削減するために、Hadoopはデータに最も近いサーバーを把握する必要があります。この情報は、Hadoop専用のファイルシステムブリッジによって提供されます。
2011年5月時点で、Apache Hadoopにバンドルされているサポート対象ファイルシステムは以下のとおりでした。
サードパーティ製のファイルシステムブリッジも多数開発されているが、いずれも現時点ではHadoopディストリビューションには含まれていない。ただし、一部の商用Hadoopディストリビューションでは、代替ファイルシステムがデフォルトとして提供されている(具体的にはIBMとMapR)。
ファイルシステムの最上位には MapReduce エンジンがあり、これは 1 つのJobTrackerで構成され、クライアント アプリケーションは MapReduce ジョブをこの JobTracker に送信します。JobTracker は、クラスタ内の利用可能なTaskTrackerノードに作業を割り当て、作業がデータにできるだけ近い場所にあるように努めます。ラック認識ファイルシステムにより、JobTracker はどのノードにデータがあり、近くに他のマシンがあるかを把握できます。作業がデータが存在する実際のノードで実行できない場合は、同じラック内のノードが優先されます。これにより、メイン バックボーン ネットワークのネットワーク トラフィックが削減されます。TaskTracker が失敗またはタイムアウトした場合、ジョブのその部分は再スケジュールされます。各ノードの TaskTracker は、実行中のジョブが JVM をクラッシュした場合に TaskTracker 自体が失敗しないように、個別のJava 仮想マシン(JVM) プロセスを生成します。TaskTracker から JobTracker へは、数分ごとにハートビートが送信され、その状態が確認されます。ジョブトラッカーとタスクトラッカーのステータスと情報はJettyによって公開されており、ウェブブラウザから閲覧できます。
このアプローチの既知の限界は以下のとおりです。
Hadoop はデフォルトではFIFOスケジューリングを使用し、オプションで 5 つのスケジューリング優先度を使用してワークキューからジョブをスケジュールします。[ 51 ]バージョン 0.19 では、ジョブスケジューラが JobTracker からリファクタリングされ、代替スケジューラ (次に説明するFair スケジューラやCapacity スケジューラなど) を使用する機能が追加されました。[ 52 ]
フェアスケジューラはFacebookによって開発されました。[ 53 ]フェアスケジューラの目標は、小規模ジョブに対して高速な応答時間と、本番ジョブに対してサービス品質(QoS) を提供することです。フェアスケジューラには 3 つの基本概念があります。[ 54 ]
デフォルトでは、分類されていないジョブはデフォルトのプールに割り当てられます。プールでは、マップスロットの最小数、リデューススロット数、および実行中のジョブ数の上限を指定する必要があります。
容量スケジューラはYahoo!によって開発されました。容量スケジューラは、フェアスケジューラと同様のいくつかの機能をサポートしています。[ 55 ]
ジョブが実行中になると、割り込みは発生しません。
Hadoop 1 と Hadoop 2 の最大の違いは、Hadoop 1 の MapReduce エンジンに代わって YARN (Yet Another Resource Negotiator) が追加されたことです。YARN は、さまざまなアプリケーションにリソースを効率的に割り当てることを目指しています。YARN は 2 つのデーモンを実行し、それぞれ異なるタスクを実行します。1 つは、ジョブの追跡とアプリケーションへのリソース割り当てを行うリソースマネージャ、もう 1 つは、実行の進行状況を監視するアプリケーションマスターです。
Hadoop 3には重要な機能がいくつかあります。例えば、 Hadoop 2ではネームノードが1つだけでしたが、Hadoop 3では複数のネームノードを持つことが可能になり、単一障害点の問題を解決しています。
Hadoop 3では、 Dockerの原理に基づいて動作するコンテナが採用されており、アプリケーション開発にかかる時間を短縮できます。
最も大きな変更点の1つは、Hadoop 3がイレイジャーコーディングによってストレージのオーバーヘッドを削減したことです。
また、Hadoop 3 ではクラスター内で GPU ハードウェアの使用が許可されており、これは Hadoop クラスター上でディープラーニングアルゴリズムを実行する上で非常に大きな利点となります。[ 56 ]
HDFS は MapReduce ジョブに限定されません。他のアプリケーションにも使用でき、その多くは Apache で開発中です。そのリストには、HBaseデータベース、Apache Mahout機械学習システム、Apache Hiveデータウェアハウスが含まれます。理論的には、Hadoop は、リアルタイムではなくバッチ指向で、データ集約型であり、並列処理の恩恵を受けるあらゆるワークロードに使用できます。また、ラムダ アーキテクチャ、Apache Storm、Flink、Spark Streamingなどのリアルタイム システムを補完するためにも使用できます。[ 57 ]
Hadoopの商用アプリケーションには以下が含まれます。[ 58 ]
2008年2月19日、Yahoo! Inc.は、世界最大のHadoop本番アプリケーションだと主張するものをリリースしました。Yahoo! Search Webmapは、10,000コアを超えるLinuxクラスタ上で動作するHadoopアプリケーションで、Yahoo!のすべてのWeb検索クエリで使用されるデータを生成しました。[ 59 ] Yahoo!には複数のHadoopクラスタがあり、HDFSファイルシステムやMapReduceジョブは複数のデータセンターに分散されていません。すべてのHadoopクラスタノードは、Hadoopディストリビューションを含むLinuxイメージをブートストラップします。クラスタが実行する作業には、Yahoo!検索エンジンのインデックス計算が含まれていることが知られています。2009年6月、Yahoo!はHadoopバージョンのソースコードをオープンソースコミュニティに公開しました。[ 60 ]
2010年、Facebookは世界最大のHadoopクラスターを保有しており、ストレージ容量は21PBであると主張した。[ 61 ] 2012年6月には、データが100PBに増加したと発表し[ 62 ]、同年後半には、データが1日あたり約0.5PBずつ増加していると発表しました。[ 63 ]
2013年現在Hadoopの採用は広く普及し、Fortune 50企業の半数以上がHadoopを使用していた。[ 64 ]
Hadoopとビッグデータ処理の誕生、成長、キュレーションに関する影響力のある論文には、Jeffrey Dean、Sanjay Ghemawat (2004) MapReduce: Simplified Data Processing on Large Clusters、Google などがあります。この論文は、Doug Cutting が Map-Reduce フレームワークのオープンソース実装を開発するきっかけとなりました。彼はそれを息子のおもちゃの象にちなんで Hadoop と名付けました。
Nutchの一部をHadoopという新しいサブプロジェクトに分割することを決定しました。