皆さん、こんにちは。株式会社BTMの風間と申します。
先日、業務で初めて「Apache Hive」を扱う機会がありました。Hiveを調べている時に「Hadoop」という単語が出てきたのですが、恥ずかしながら「Hadoopって何?」という状態でした。
そこで自分自身の備忘録も兼ねて、Hadoopの基本をまとめてみました。
1. Hadoopとは
「Apache Hadoop」は、膨大なデータを「汎用的なコンピュータの集合体」で効率よく保存・処理するためのオープンソースの分散処理フレームワークです。主にJavaで開発されています。
「特殊な超高性能マシン1台で頑張るのではなく、どこでも調達できる汎用的なサーバーを並列に動かして、超巨大なデータをさばこう」という仕組みになっています。
Hadoopは、Googleが公開した以下の2つの論文をベースに開発されました。
分散処理は難しく聞こえますが、「数千ページある分厚い本の中から『エンジニア』という単語が何個あるか数える」という作業を想像してみてください。
- 1人でやる場合: 1ページ目から順に、一人でコツコツ読み進めます。ページ数が膨大になると、終わるまでに何日もかかってしまいます
- みんなでやる場合: 本を数百ページごとに小分けして、数十人の仲間に配ります。仲間が同時に自分の持ち分を数え、最後に結果を合算します
後者の方が、圧倒的に早く終わります。このように「巨大なデータを切り分けて、みんなで一斉に処理する」のが分散処理であり、Hadoopの基本的な考え方です。
2. Hadoopのエコシステムについて
Hadoopは、単一のソフトウェアではなく、多数のコンポーネント(HBase, Spark, ZooKeeperなど)からなる巨大な「エコシステム」です。
この記事では、その中でも最も基盤となる 「HDFS(保存)」 と 「MapReduce(計算)」 、そして私が扱った 「Hive(SQLインターフェース)」 について簡単にまとめます。
3. HDFSについて
HDFS(Hadoop Distributed File System)は、巨大なファイルを複数のサーバーに分散して保存する「分散ストレージ」です。
例えば容量が数TBという巨大なファイルを扱う場合、HDFSはそれを128MBなどの「ブロック」単位に分割します。そして分割したデータをDataNodeと呼ばれる複数のサーバーに保存します。
ファイルを分割しているのは、本を章ごとに小分けして配るのと同じで、後から皆で一斉に(並列に)読み取れるようにするためです。
また、各ブロックのコピーを作成し、別のDataNodeにも保存します。これにより1台のサーバーが故障してもバックアップがあるため、全体として作業が止まらない「耐障害性」を確保しています。
ファイルは分割されますが、管理役のサーバー(NameNode)のおかげで、ユーザーはブロックを意識せず1ファイルとして見ることができ、普通のファイル操作と同じ感覚でファイルを利用できます。
4. MapReduceについて
HDFSに保存された膨大なデータを「計算」する仕組みがMapReduceです。
ファイルからデータをMap(抽出)し、Reduce(集計)します。
開発者はこのMapとReduceの処理をJavaなどで実装します。実装にはHadoopが提供する「MapReduce API」を利用します。
このAPIに沿ってロジックを書くことで、分散処理に必要な以下のような複雑な制御は全てHadoopが自動で行ってくれます。
- どのサーバーにプログラムを配るか
- どのサーバーにどのデータブロックを読み込ませるか
- 途中でサーバーが壊れたら、どのサーバーでやり直すか
また、MapReduceは全てのデータを 「キー(Key)」と「バリュー(Value)」のペア で扱います。
「大量のログからエラー件数を数える」という処理を考えると次のような流れとなります。
-
Mapフェーズ:
開発者がAPIを使って「『Error』という文字を見つけたら、Keyを『Error』、Valueを『1』としたペア(Error: 1)を作れ」というプログラムを書きます。これがデータを持つ各サーバーで並列実行されます -
Shuffle(シャッフル)フェーズ:
ここはシステムが自動で行います。バラバラのサーバーで作られたペアの中から、同じKey(Error)を持つものを1箇所に集めます -
Reduceフェーズ:
開発者がAPIを使って「集まったバリュー(1, 1, 1...)を全部足せ」というプログラムを書きます。最終的に「Error合計 500件」といった結果が出力されます
5. Hiveについて
「集計したいだけでJavaで実装するのは大変だな…」という課題を解決してくれるのが「Apache Hive」です。HiveはSQL(HiveQL)を解釈し、裏側で自動的にMapReduceを生成・実行依頼してくれる翻訳機のような存在です。
例えば、HDFSに次のようなサーバーのログファイル(カンマ区切り)があるとします。そして、ここからエラーログの件数を集計したいとします。
2026-01-10,200,OK
2026-01-10,500,Internal Server Error
2026-01-11,200,OK
この場合、最初にファイルの構造をテーブルとして定義します。
CREATE TABLE access_logs (
log_date STRING,
status_code INT,
message STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 'HDFS上のログファイルが保存されているディレクトリのパス';
そしてSQLで集計します。
SELECT log_date, COUNT(*)
FROM access_logs
WHERE status_code >= 500
GROUP BY log_date;
-- 結果
2026-01-10 1
HiveはこのようにMapReduceの処理を実装しなくても、RDBMSを扱うような感覚で利用できます。
RDBMSは最初に型を定義し保存時に型のチェックをしますが、Hiveはファイルを保存してSELECTする瞬間に初めて定義を当てはめて解釈します。
MySQLなどのRDBMSと比較すると次のようになります。
| 比較項目 | RDBMS (MySQLなど) | Hadoop (+ Hive) |
|---|---|---|
| スキーマ適用 | Schema on Write (書き込み時) | Schema on Read (読み込み時) |
| 主な用途 | リアルタイムな検索・更新 | 巨大なデータのバッチ分析 |
| 拡張性 | スケールアップ(サーバー1台を強くする) | スケールアウト(サーバーの台数を増やす) |
| 更新処理 |
UPDATE や DELETE が得意 |
基本は「追記」のみ |
| 応答速度 | ミリ秒〜秒(爆速) | 数秒〜数時間(じっくり) |
※上記のコードの実行は以下の環境にて行っています。
mac OS 15.7.1, Hadoop 3.4.2, Hive 3.1.3
まとめ
Hadoopの「汎用的なサーバーを束ねて力技で解決する」という仕組みは、大量のデータを扱うにはとても合理的で、勉強になりました。Hadoopが、ログ解析・機械学習・データ変換・データレイクなどで利用されている理由が分かりました。
まだ触り始めたばかりなので、使いこなせるように日々精進したいと思います。
株式会社BTMではエンジニアの採用をしております。
ご興味がある方はぜひコチラをご覧ください