Apache Hadoop

Apache Hadoopの概要

Hadoop(ハドゥープ)は、大規模データの蓄積と分析を分散して処理するフレームワークであり、Java言語で実装されている。 Hadoopの元になったのは、Googleの大量データを効率的に処理するための分散処理基盤であるMapReduceとGoogle File Systemである。

Googleはこのシステムに関する論文を2004年に公開し、それを参考にDoug CuttingとMike Cafarellaによって開発された。Hadoopという名前は、Dougの息子が黄色い象のぬいぐるみに付けた名前に由来し、意味がなく、簡単で、他の場所で使われていないという理由で採用された。黄色い象はHadoopのマスコットキャラクターでもある。

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クエリエンジン