はじめに
最近よく耳にする「データレイクハウス」。
「データウェアハウス」と「データレイク」の“いいとこ取り”と言われていますが、最初に聞いたときは「本当にそんな都合のいい仕組みがあるの?」と思いました。
調べてみても専門用語が次々に出てきて、初学者にはハードルが高く感じました。私自身もまさにその一人です。
そこで本記事では、単に一般的な解説をまとめるのではなく、私自身が「ここがわからない」とつまずいた点を仕組みまで調べ直し、整理した内容を紹介します。
専門家による完璧な解説ではありませんが、「これを読めば全体像がつかめて、大まかな仕組みも理解できた!」と思っていただけるような、初学者目線の入門記事を目指しています。ぜひ気軽に読んでみてください。
データ基盤の変遷
「データレイクハウス」が登場した背景には、これまでのデータ基盤が抱えてきた課題と、それを解決しようとする流れがあります。まずは、この流れを理解することが、データレイクハウスを理解する第一歩となります。
データウェアハウス
データ分析といえば、まずは「データウェアハウス」です。
各システムからデータを抽出・統合し、あらかじめ定義したスキーマに従って整理・管理することで、効率的な分析を可能にする仕組みです。
整ったデータを高速かつ信頼性高く分析できる一方で、スキーマ定義が固定的であるため、ログや画像といった非構造化データには柔軟に対応できないという制約があります。
スキーマとは?
データベースにおける「設計図」です。
例えば「顧客情報」というテーブルを作るなら、
- 顧客ID(数値)
- 氏名(文字列)
- 登録日(日時)
といった列をあらかじめ定義しておきます。この設計図(=スキーマ)に沿ってデータが格納されるため、DWHでは常に整ったデータを扱うことができます。
データレイク
データウェアハウスの制約を補う形で登場したのが「データレイク」です。
生のデータをそのまま保存し、必要に応じて後から加工するという発想で、柔軟性が高く、安価なオブジェクトストレージを利用できる点が評価されています。
ただし、あらゆる形式のデータを気軽に保存できるがゆえに、整理や管理が追いつかず「データスワンプ」に陥りやすいという課題があります。
データスワンプとは?
どこにどんなデータがあるのかわからず、活用できない状態を指します。
データレイクハウス
この両者の長所を組み合わせたのが「データレイクハウス」です。
オブジェクトストレージによる柔軟な保存
構造化からログ・画像・動画まで、あらゆるデータをそのまま保存できる。
テーブル形式での厳密な管理とクエリ性能
スキーマ変更や更新・削除、タイムトラベルに対応し、データベース並みの信頼性を持つ。
この2つを組み合わせることで、データウェアハウスの「信頼性」とデータレイクの「柔軟性」を両立できるようになりました。
つまり、データ基盤の進化の延長線上に生まれた自然な答えが「データレイクハウス」と言うことができます。
ここまでは、多くの解説記事でも触れられている内容です。
概要や必要性、メリットのイメージは掴めると思います。
ただ、データ初学者からすると「なぜそれが実現できるのか」が見えにくく、万能なすごい仕組みのような表面的な理解で終わってしまいがちです。私自身も最初はまったく理解できませんでした。
そこで、ここからはもう一歩踏み込み、データレイクハウスの仕組みをできるだけシンプルに解説していきます。
データレイクハウスとは?
まずは、データレイクハウスの一般的なアーキテクチャ図を見てみましょう。
出典: Apache Hudi Blog - What is a Data Lakehouse?
上記の図の中でデータレイクハウスの仕組みを支えているのは、Lake Storage、File formats、Table formats、Compute engine の4つの要素です。私自身も、この4つを理解したことで「データレイクハウスって結局どう動いているのか」が一気に腑に落ちました。
イメージしやすいように、これらを「大きな倉庫」にたとえてみます。
まず、Lake Storage は「どんな荷物でもとりあえず置いておける巨大な倉庫」です。書類でも家具でも機械でも、とにかく全部ここに集められます。
ただ、倉庫に山積みにするだけでは探すのが大変です。そこで役立つのが File formats です。これは「段ボール箱の詰め方」の工夫にあたります。同じ種類の荷物をきちんとまとめて詰めておくことで、必要なときに効率よく取り出せるようになります。
さらに、箱が増えてくると「どこに何があるのか」が分からなくなってしまいます。ここで登場するのが Table formats 。これは「在庫管理システム」のようなもので、倉庫にある膨大な荷物をカタログ化し、どこに置かれているか、どういう中身なのかをすぐに検索できるようにしてくれます。
最後に、倉庫から実際に荷物を取り出して使える形にしてくれるのが Compute engine です。作業員やフォークリフトのように、在庫管理システムの指示を受けて必要な荷物を取り出し、利用しやすい形に整えてくれる存在です。
この4つが揃うことで、データレイクハウスは「何でも貯められる倉庫」(データレイクの強み)でありながら「整理されていてすぐ使える基盤」(データウェアハウスの強み)として機能するのです。
ここからは、それぞれの要素を一つずつ取り上げ、初学者向けにゼロから解説していきます。ただ単に用語を紹介するだけでなく、「なぜデータレイクハウスに必要なのか」という背景にも触れていきます。
Lake Storage
データレイクハウスの基盤となるのが Lake Storage です。
これは一般的にクラウドの オブジェクトストレージ(Amazon S3、Azure Data Lake Storage、Google Cloud Storage、IBM Cloud Object Storage など)を指します。
オブジェクトストレージとは、従来のファイル単位・ブロック単位ではなく「オブジェクト」という単位でデータを管理するストレージのことです。「ファイル単位?ブロック単位?」という部分から私自身は疑問だったので、従来のデータ管理方式を整理しつつ、オブジェクトストレージがなぜデータレイクハウスの基盤に適しているのかを整理していきます。
各方式のデータ管理方法のイメージ図です。
出典: 【2022年最新】クラウドストレージの仕組みと主なサービス
ファイルストレージ
PCのフォルダ構造と同じで、階層によって場所を表現します。
例えば /home/user/docs/report.docx
のように、パスでファイルの場所を特定します。
人間には直感的で分かりやすい一方、ファイル数が膨大になると階層が複雑になり、管理が難しくなります。さらに階層構造は並列処理に弱いため、大量データを扱うクラウド環境には向きません。
並列処理とは?
一度に複数の処理を同時に実行して全体を高速化する仕組みのことです。
例えば「1冊の本を1人で読む」と時間がかかりますが、「章ごとに複数人で分担して同時に読む」と早く終わるイメージです。
ブロックストレージ
データを一定サイズのブロックに分割して保存する方式です。必要な場所に直接アクセスできるため高速な読み書きが可能で、データベースやトランザクション処理に向いています。
ただし、ブロックには「意味」がありません。
例えば、本をページごとに裁断して保存するイメージです。ページ単位なら取り出しは早いですが、それだけでは内容が理解できません。これが「非構造化データ(画像や動画など)」を扱うのに向かない理由です。
さらに、ブロックストレージは「1台の大きなディスク」として設計されているため、クラウドのように無限に拡張するのは難しく、スケーラビリティに限界があります。そのため、「何でも保存できる倉庫」を目指すデータレイクハウスには適していません。
トランザクション処理とは?
銀行の入出金のように「処理がすべて成功するか、失敗したら全部なかったことにする」仕組みです。
オブジェクトストレージ
データを「オブジェクト」という単位で保存する方式です。
オブジェクトは以下の3つで構成されます:
- データ本体
- メタデータ(属性情報)
- ユニークなID
この仕組みにより、階層構造に縛られず「オブジェクトごと」に直接アクセスできます。結果として、容量をほぼ無制限に拡張でき、大量データを低コストで保存可能です。
また、構造化データ(表形式)だけでなく、ログや画像、動画といった非構造化データも同じ仕組みで扱えるため、「とりあえず何でも置ける場所」 として利用できます。
柔軟性と拡張性の高さから、オブジェクトストレージはデータレイクハウスの基盤に最も適した方式です。
メタデータとは?
データそのものではなく「データについての情報」のことです。
例:ファイルの場合は「名前」「作成日」「保存場所」など。
つまり、オブジェクトストレージはデータレイクハウスにおける「何でも貯められる大きな倉庫」の役割を担っています。
実は、従来のデータレイクでもオブジェクトストレージが基盤として使われています。データレイクハウスとの大きな違いは、「置くだけ」か「整理して使える」か です。
データレイクは、倉庫にとにかくモノを詰め込むイメージ。一方データレイクハウスは、これから解説するフォーマットや管理の仕組みを取り入れることで、すぐに活用できる基盤 へと進化しています。
File formats
オブジェクトストレージという「大きな倉庫」にデータを入れただけでは、まだ扱いにくいままです。そこで重要になるのが File formats、つまり「データをどの形式で保存するか」という入れ物のルールです。
身近な例で言えば、画像ならJPEGやPNG、音楽ならMP3といった形式があります。データ分析の世界でも同じように、効率よく保存・取り出すための形式があり、大きく行志向と列志向に分けられます。
行志向(Row-oriented)
1件ごとのレコードを丸ごと保存する方式です。
CSV が代表例で、例えば「顧客ID, 氏名, 購入金額」の3列なら次のように保存されます。
例:
1, 山田, 1000
2, 佐藤, 2000
3, 鈴木, 3000
1行ごとに完結しているため、1件のデータをそのまま取り出す処理に向いています。
列志向(Column-oriented)
列ごとにデータをまとめて保存する方式です。代表例は Parquet や ORC です。
例:
顧客ID: [1, 2, 3]
氏名: [山田, 佐藤, 鈴木]
購入金額: [1000, 2000, 3000]
例えば「購入金額の合計」を求める場合、行志向では全ての行を読み込む必要がありますが、列志向なら購入金額の列だけを読み込めば済むので効率的です。
さらに、列ごとに似た値が並ぶため圧縮効率が高いという特徴もあります。「購入金額」が [1000, 1000, 1000, 1000...]
といった繰り返しの場合、列志向では「1000が〇回続く」とまとめて保存できるため、ストレージ容量を大きく削減できます。
この効率性と圧縮率の高さから、データレイクハウスでは列志向フォーマット(特に Parquet)が主流です。
データ形式の種類
ここまでの説明は「構造化データ」(表形式で表せるデータ)が前提でした。
しかし現実には、扱うデータは大きく3種類に分けられます。
- 構造化データ(売上や顧客マスタなど) → Parquet などの列志向フォーマットで保存
- 半構造化データ(JSON, ログなど) → JSONのまま置くか、Parquetに変換して整理
- 非構造化データ(画像・音声・PDFなど) → 元の形式で保存し、必要に応じて加工
特に非構造化データはそのままでは分析できないので、
- 画像 → 特徴量ベクトル化して検索
- 音声 → 文字起こししてテキスト分析
- PDF → テキスト抽出してRAGに活用
といった前処理をしてから利用するのが一般的です。
検証:行志向(CSV)と列志向(Parquet)の比較
理屈は理解できたので、実際にCSV(行志向)とParquet(列志向)を使って簡単に検証してみました。
import os, time
import pandas as pd
import numpy as np
def size_mb(p):
return os.path.getsize(p)/1024/1024
def main():
# ダミーデータ生成(100万行)
n = 1_000_000
df = pd.DataFrame({
"都道府県コード": np.random.randint(1, 48, size=n),
"市区町村コード": np.random.randint(1, 1000, size=n),
"人口": np.random.randint(100, 100000, size=n),
"世帯数": np.random.randint(1, 30000, size=n),
})
df.to_csv("test.csv", index=False, encoding="utf-8")
# Parquetへ変換
df.to_parquet("test.parquet")
# サイズ比較
print(f"CSV: {size_mb('test.csv'):.2f} MB")
print(f"Parquet: {size_mb('test.parquet'):.2f} MB")
# 読み取り速度比較
t0 = time.time(); pd.read_csv("test.csv", usecols=["都道府県コード"]); t1 = time.time()
t2 = time.time(); pd.read_parquet("test.parquet", columns=["都道府県コード"]); t3 = time.time()
print(f"read_csv(usecols=1): {t1 - t0:.3f}s")
print(f"read_parquet(columns=1): {t3 - t2:.3f}s")
if __name__ == "__main__":
main()
実行結果(環境によって数値は変わりますが、傾向は同じです):
CSV: 17.38 MB
Parquet: 6.29 MB
read_csv(usecols=1): 0.056s
read_parquet(columns=1): 0.017s
ファイルサイズも読み取り速度も、Parquetの方が効率的であることが確認できました。
Table formats
Parquet のようなファイルフォーマットは、1つのファイルを効率よく保存・読み込むことに優れています。しかし実際のデータレイクには、数百万ものファイルが保存されます。すると、こんな課題が出てきます。
- 必要なデータがどのファイルに入っているのかわからない
- ファイルをまたいで更新や削除をどうやって管理するのか
- スキーマが変わったらどうするか
こうした課題を解決するのが Table formats です。
Table format とは、オブジェクトストレージに保存された膨大なファイルを、「1つの大きなテーブル(表)」として扱えるようにする仕組みです。これにより、ユーザーは「どのファイルにデータがあるのか」を気にする必要がなくなり、「売上を合計して」「2023年のデータだけ見せて」といった指示を、SQL(=表計算の延長のような言語)で簡単に実行できるようになります。
つまり、ただのファイルの集まりを、まるでデータベースのように検索・更新できるようにするのが Table format です。
代表例には Apache Iceberg、Delta Lake、Apache Hudi があります。
ここでは最も普及している Apache Iceberg を例に、その仕組みを簡単に見ていきます。
Apache Iceberg のアーキテクチャ図
Iceberg を構成する要素は大きく5つあります。
Iceberg Catalog
- 役割:各テーブルの「最新のメタデータファイルの場所」を記録する
- たとえ:図書館の「総合目録システム」
どの本がどの棚にあるかを一元的に管理する
Metadata File
- 役割:テーブルの「説明書」
- スキーマ(列名・データ型)
- パーティション方法
- 利用可能なスナップショットの一覧
- たとえ:本についている「目録カード」
このカードを見れば「本の構成」や「どの版か」がわかる
Manifest List
- 役割:ある時点のスナップショットを構成する「マニフェストファイルの一覧」
- たとえ:コレクションの「目次ページ」
「この本棚とこの本棚を見れば全部そろう」と示してくれる
Manifest File
- 役割:データファイルの「在庫台帳」
- 各データファイルの場所
どの列にどんな値が多いかなどの統計情報 - たとえ:棚ごとの在庫帳簿
「この棚には1万冊のうち5千冊は歴史書」といった情報が記録されている
Data File
- 役割:実際のデータが保存されているファイル
- 形式:Parquet や ORC などの列志向フォーマットが一般的
- たとえ:図書館に並んでいる「本」そのもの
Iceberg はこれらの仕組みを利用して、必要なファイルだけを効率よく読み込むことができます。
これらのテーブルフォーマットを利用することで、
- データの追加・更新・削除を安全に実行できる
- バージョン管理やロールバック(タイムトラベル)が可能
- スキーマの変更(列の追加・削除)にも対応できる
といった、従来の DWH に近い信頼性をデータレイク上で実現できます。
内部の仕組みは少し複雑ですが、データレイクハウスを理解するうえでは「ファイルの寄せ集めを、1つのデータベースのように扱える仕組み」とイメージできれば十分です。
さらに詳しく知りたい方は、以下の記事がとても分かりやすく解説しているのでおすすめです。
つまり、「ただのファイルの集まり」を「ちゃんとしたデータベースのように扱える」ようにする仕組みが Table format です。
Compute Engine
ここまでで、
- ファイルフォーマットは「1つのファイルを効率よく扱う仕組み」
- テーブルフォーマットは「多数のファイルをまとめて整理する仕組み」
というところまで整理できました。
しかし、データは保存・整理するだけでは活用できません。
実際にSQLを使って集計や分析をする“計算の仕組み” が必要です。
その役割を担うのがコンピュートエンジン(Compute Engine) です。
コンピュートエンジンとは?
倉庫の例えでいえば、保存されている荷物を取り出し、必要な情報を揃えて届けてくれる「作業員やフォークリフト」のような存在です。
データレイクハウスでは、対象となるデータがペタバイト級に膨れ上がるため、1台のサーバーで処理するのは現実的ではありません。そこで処理を小さなタスクに分割し、クラスタ内の複数ノードで並列に実行する仕組みが使われます。これが分散SQLエンジンです。
代表的な分散SQLエンジン
- Apache Spark SQL
- Presto / Trino
- Apache Hive (LLAP/Tez)
- クラウドに組み込まれたもの(Snowflake, BigQuery, Redshift Spectrum など)
仕組みの流れ
- ユーザーが「売上の合計を出して」といったSQLを実行する
- テーブルフォーマットが「どのファイルを読むべきか」を教える
- 分散SQLエンジンが処理を細かく分けて数十〜数百台のサーバーに割り当てる
- 各サーバーが並行してデータを処理し、最終的な結果を集約して返す
つまり、コンピュートエンジン = データレイクハウスの頭脳であり心臓です。これがあるからこそ、ただのファイル群に対しても従来のDWHのように、高速でスケーラブルな分析が可能になります。
まとめ
本記事では、データレイクハウスについて以下の流れで整理しました。
-
データ基盤の変遷
- データウェアハウス:整ったデータを高速に扱えるが柔軟性に欠ける
- データレイク:柔軟で安価に保存できるが整理が難しい
- → 両者の「いいとこ取り」として登場したのがデータレイクハウス
-
データレイクハウスを支える4つの要素
- Lake Storage:オブジェクトストレージで「とりあえず何でも置ける」
- File formats:Parquet などで効率よく保存・圧縮
- Table formats:Iceberg や Delta Lake で「データベースのように整理」
- Compute Engine:Spark や Trino が並列処理で高速に分析
データレイクハウスは、データウェアハウスの「信頼性」とデータレイクの「柔軟性」を両立させるために生まれた進化形です。
仕組みを分解して見ていくと「なぜ便利なのか」「どうやって実現しているのか」がイメージしやすくなり、ただのメリットの羅列ではなく腹落ちした理解に近づけると思います。
これからデータ基盤や分析環境に触れる方にとって、データレイクハウスは避けて通れない重要なコンセプトです。まずは基本を押さえたうえで、実際のプロダクト(Snowflake、Databricks、watsonx.data など)に触れてみるのがおすすめです。