Apache Hadoop
Apache Hadoopの概要
Hadoop(ハドゥープ)は、大規模データの蓄積と分析を分散して処理するフレームワークであり、Java言語で実装されている。 Hadoopの元になったのは、Googleの大量データを効率的に処理するための分散処理基盤であるMapReduceとGoogle File Systemである。
Googleはこのシステムに関する論文を2004年に公開し、それを参考にDoug CuttingとMike Cafarellaによって開発された。Hadoopという名前は、Dougの息子が黄色い象のぬいぐるみに付けた名前に由来し、意味がなく、簡単で、他の場所で使われていないという理由で採用された。黄色い象はHadoopのマスコットキャラクターでもある。

Hadoopは分散処理基盤であるため、各処理をクラスター内のマシンに分け(Map)、各マシンで処理された結果を集約(Reduce)して最終的な結果を得る。
近年、大量データ(BigData)の中から目的のデータを抽出したり、保存されたデータから何らかの傾向を読み取ったりするなど、データマイニングへの要求が高まっている。また、BigDataを処理できるだけでなく、より短時間でそのような情報を算出したいという要求も増えている。
以前はBigDataを処理するためにデータウェアハウスのような専用製品を使用する必要があった。Hadoopは、このようなデータ処理を一般的なサーバーマシンを複数台接続(スケールアウト)することで可能にする。
複数のサーバーで構成されるHadoopシステムは、複数台に分散されることでシステムの柔軟性を高める。処理性能を向上させるには、Hadoopクラスターにシステムを追加するだけでよい。Hadoopクラスターシステムは一般的なサーバーマシンで構成できるため、ハードウェア調達が容易である。またソフトウェア面でも、クラスターに追加するサーバーにHadoopシステムをインストールして設定するだけでHadoopクラスターをスケールアップできる。この特徴から、ハードウェア、ソフトウェアの両面で拡張性が高いと言える。
近年はクラウドサービスを使用して複数台のサーバーを簡単に起動できるようになったため、Hadoopを使用してデータ処理を行いたい場合にだけクラウド上にHadoopクラスターを構築できる。さらに性能が不足すればサーバーを追加し、リソースが余ればサーバーを減らし、1つの処理が終わった時点でHadoopクラスターのすべてのマシンを解放する、といった使い方も可能であるため、今後ますます利用場面が増えると考えられる。
Hadoopバージョン1まではMapReduceのみの並列処理フレームワークだったが、Hadoopバージョン2からはStorm、Spark、Tez/Impalaなどの他の並列処理フレームワークを利用できるようになった。また、Hadoop上のデータに対するMapReduce(Java)以外の処理インターフェースも増えた。例えばImpalaやTezで動作するHiveやPigを通じて、ユーザーは使い慣れたSQLとほぼ同等のクエリを使用してデータへアクセスできる。さらにStormやSparkではストリーミングによるリアルタイムデータ処理が可能になり、HDFS上に存在するデータ以外でもHadoopシステムを利用できるようになっている。
Hadoopの特徴
Hadoopは次の4つのCoreモジュールで構成されている。
- Hadoop Distributed File System (HDFS)
- Hadoop MapReduce
- Hadoop Common
- Hadoop YARN
また、次の2つはHadoopプロジェクトとは別のモジュールである。
- Apache Ozone
- Apache Submarine
HDFS(Hadoop Distributed File System)
Hadoop固有の分散ファイルシステムである。ユーザーには1つの大きなファイルシステムに見えるが、各ノードにまたがってファイルを保存する。1つのノードで障害が発生してもデータの欠損がないよう、デフォルトで3つのノードに同じデータを保持(三重化)している。
MapReduce
分散されたデータに対して並列に処理を行うためのフレームワークである。Mapステップでは各スレーブノードのデータに対して処理を行い、ReduceステップでMapステップにより複数ノードに分散・実行された処理結果の集約を行う。
Hadoop Common
Hadoopの機能を支援するユーティリティ集合である。
YARN(Yet Another Resource Negotiator)
Hadoopバージョン1までは独立したコンポーネントではなかったが、Hadoopバージョン2ではリソース管理を専門とするモジュールとして独立した。MapReduceリソース、ジョブスケジューリングだけでなく、Giraph、Storm、Spark、Tez/Impalaなど他の分散処理フレームワークのリソース管理も可能になった。
Apache Ozone
Hadoopで分散オブジェクトストレージを実現するためのプロジェクトである。数千億規模のファイルとブロックへ拡張できるよう設計されており、YARNやKubernetesのようなコンテナ環境での動作もサポートする。S3およびHadoop File System APIなど複数のプロトコルを使用してアクセスできる。元々はHadoopのサブプロジェクトだったが、Apacheトップレベルプロジェクトの一つとして独立した。
Apache Submarine
YARNのようなリソース管理プラットフォーム上でディープラーニングアプリケーション(TensorFlow、PyTorch、MxNetなど)を実行できるようにするプロジェクトである。元々はHadoopのサブプロジェクトだったが、Apacheトップレベルプロジェクトの一つとして独立した。Hadoop 2.7.3以上で使用できる。
Hadoopの使用例
HadoopはMapReduceの代わりに、より高速に処理できるApache Sparkを使用できる。詳細はhttps://openstandia.jp/solution/hadoop-spark/を参照する。
Hadoopの動作環境
HadoopはJava言語で作られているため、JVMが必要である。2022年4月時点の安定版であるHadoop 3.3.2ではJava 8およびJava 11をサポートする。JVMが実行される環境であればOSは問わない。
Hadoopが実行されるOS
- 主要Linuxディストリビューション
- Windows
- MacOSX
HadoopはOpenJDKで正常に動作することが確認されている。各JDKの動作検証結果は、以下のHadoop Wikiページで確認できる。
https://cwiki.apache.org/confluence/display/HADOOP/Hadoop+Java+Versions
Hadoopはコンパイル済みバイナリパッケージと、ユーザーが直接コンパイルするソース版の両方を提供する。
コンパイル済みバイナリパッケージはすぐに使用できる一方で、拡張できない設定もあるため、ユーザーが必要な機能を有効にするにはソースからビルドする必要がある場合もある。
Hadoopライセンス
HadoopはApacheのトップレベルプロジェクトの一つである。
ライセンスはApache License 2.0であり、ユーザーはソフトウェアの使用、配布、修正、派生版配布に制限を受けない。
Hadoop公式サイト
Hadoopの公式サイトは以下のURLである。 http://hadoop.apache.org/
また、Hadoop公式WikiページにはHadoopに関するさまざまな情報がある。 https://cwiki.apache.org/confluence/display/HADOOP/Home
Hadoopダウンロード
https://hadoop.apache.org/releases.html
Hadoopを構成する3つのレイヤー
Hadoopアーキテクチャは主に次の3つのレイヤーで構成される。
- 分散処理エンジン(HadoopではHadoop MapReduceを使用)
- リソースマネージャー(HadoopではHadoop YARNを使用)
- 分散ファイルシステム(HadoopではHDFSを使用)
そして、Hadoopはデータにアクセスするためにクエリエンジンを使用することが多い。
Hadoopはすべてのコンピューターに上記の構成をインストールし、データの読み書きと処理を分散する。
分散処理エンジン
分散処理エンジンは、Hadoopで並列分散処理を担当するソフトウェア群である。
基本的にはMapReduceという分散処理エンジンが実行される。
代表的な分散処理エンジンの特徴は次のとおりである。下に行くほど速い。
- MapReduce: 中間結果をHDFS(ストレージ)へ出力
- Tez: 中間結果をYARNコンテナ(ストレージ)へ出力
- Spark: 中間結果をメモリへ出力
なお、MapReduceは終わらないコンテンツのように見えるため、TezやSparkを使用することを推奨する。
リソースマネージャー
リソースマネージャーは、Hadoopでリソース(CPU、メモリ)管理を担当する。
MapReduceで使用するリソースマネージャーは、アプリケーションレベルコンテナを管理するHadoop YARNである。
そのほかに、OSレベルコンテナを管理するApache Mesosもある。こちらはDockerのような技術(Linuxコンテナ)を利用する。
分散ファイルシステム
分散ファイルシステムは、Hadoopでデータの読み書き分散を担当する。Hadoopで使用される分散ファイルシステムには次が含まれる。
- HDFS: Hadoop標準ファイルシステム
- EMRFS: Amazon S3をストレージとして使用するファイルシステム
- MapR-FS: C言語でHDFSを書き直したファイルシステム。高速である。
そのほかにもCloud StorageまたはBlob Storageをストレージとして使用できるように見えるが、内部的にどの分散ファイルシステムを使用するかは分からない。
Hadoopエコシステム一覧
デフォルトではないHadoopを構成するソフトウェア、または周辺ソフトウェアをHadoopエコシステムという。
Hadoopエコシステムは次のように組み合わせて、さまざまな分散処理を実行できる。
- データウェアハウス構成例: Hadoop + Tez + Hive
- Hiveを使用してHadoopをSQLで操作できる。
- 機械学習構成例: Hadoop + Spark
- 機械学習でよく発生する反復処理をSparkのインメモリ処理で効率化できる。
- 全文検索構成例: Hadoop + Elasticsearch
- Elasticsearch for Apache Hadoopを使用して全文検索サービスを実装できる。
- Hadoopの分散ファイルシステムとしてElasticsearchクラスターを活用する。
- ストリーム処理構成例: 各サーバーおよびIoTデバイス –> Kafka –> Hadoop
- 複数サーバーおよびIoTデバイスからストリーム処理を行い、Hadoopにデータを集約するにはKafkaを使用する。
以下に代表的なHadoopエコシステムと関連システム、およびその機能を紹介する。
| Hadoopエコシステム | 実現する機能 |
|---|---|
| Apache Accumulo | KVS型のNoSQL。セキュリティ重視 |
| Apache Atlas | ガバナンス制御、コンプライアンス対応 |
| Cascading | MapReduceを簡単に扱うAPI |
| Apache Drill | エッジ機器データを操作する分散SQLエンジン |
| Apache Falcon | データライフサイクル管理 |
| Apache Flume | 複数データソースからHadoopへ非構造化データを集約(ストリームデータ処理) |
| Apache HBase | KVS型NoSQL |
| Apache Hive | SQLライク(HiveQL)なクエリでデータを操作できる。耐障害性重視の場合。DWH実現 |
| Apache Hue | HadoopおよびHadoopエコシステムをGUIで操作 |
| Apache Impala | SQLライク(Impala SQL)なクエリでデータを操作できる。速度重視の場合。リアルタイム処理実現 |
| Apache Kafka | 複数データソースからHadoopへ非構造化データを集約(ストリームデータ処理)。Flumeとの差は別途参照 |
| Apache Knox | 中央集中型認証およびアクセス管理 |
| Apache Mahout | 線形代数、統計分析、機械学習ライブラリ |
| Apache Mesos | OSレベルコンテナを管理するリソースマネージャー |
| Apache Oozie | ジョブスケジューラー |
| Apache Phoenix | HBaseをデータストアとして使用するリアルタイムRDB |
| Apache Pig | データ処理(ETL)ツール |
| Apache Ranger | 認証済みユーザーへ属性ベースのアクセス権限を付与 |
| Apache Sentry | 認証済みユーザーへロールベースのアクセス権限を付与 |
| Apache Slider | YARNアプリケーション制御。長時間起動している場合はKillするなど |
| Apache Solr | 全文検索(Elasticsearchで使用される) |
| Apache Spark | 機械学習、SQL操作、R言語、グラフをメモリ内で処理 |
| Apache Sqoop | RDBMSからHadoopへ構造化データをインポート、エクスポート |
| Apache Tez | MapReduceより高速な分散処理フレームワーク |
| Presto | 中間結果をメモリへ出力するSQLクエリエンジン |