2017年に技術評論社から出版された「ビッグデータを支える技術」を増補改定し、2021年版として新たに出版されることになりました。
> WEB+DB PRESS plusシリーズ > [増補改訂]ビッグデータを支える技術 > ——ラップトップ1台で学ぶデータ基盤のしくみ > https://gihyo.jp/book/2021/978-4-297-11952-2改訂の背景
本書では、筆者がトレジャーデータ株式会社に在籍していたときの経験をもとに、「ビッグデータを扱うシステムがどのように構築されているか」という基礎的な概念を解説しています。今回の改訂版では、記述が古くなってしまった部分を手直ししたのに加えて、機械学習やコンテナ技術などの話題をいくつか盛り込みました。
本書の概要については次のページにまとめられています。
もともとは旧第6章のサンプルコードを書き直すくらいのつもりだったのが、なんだかんだと書き足す内容が増えてしまって、結果的に初版と比べると60ページほど厚くなってしまいました。書き換えたページと合わせると、おおよそ100ページくらいが今回の改訂での新たな内容となります。
とはいえ、この4年間でビッグデータの技術が大きく変わったわけではなく、初版に書いたことの大部分は今でも通用するものと思っています。本書の内容はもともと「技術のコンセプトを理解する」、あるいは「技術用語を整理する」ことを主としていますが、ビッグデータの基盤技術そのものは2016年くらいには完成していたのではないかな、というのが筆者の印象です。
これからビッグデータの技術を学ぼうとする初学者にとっては、本書を読むことでこの分野の全体像を理解する助けになればと思います。一方、初版を読んでくださった方にとっては、今回の改訂版を読む価値があるかどうかは悩ましいところで、得られるものがあるかは人によって違いそうです。以下に主な変更点をまとめましたので参考にしてください。
改訂版での変更内容
新しく「ビッグデータと機械学習」と題して、第6章を新規に追加しました。内容はいわゆる「特徴量ストア」(Feature Store)と「MLOps」についての概要説明となります。
特徴量ストアは2018年頃から広がり始めたコンセプトで、「機械学習のデータに特化したストレージを構築しよう」とするものです。2020年末に「Amazon SageMaker Feature Store」がリリースされるなど、まだまだ普及するのはこれからかと思います。
今回の改訂版では、三つの特徴量ストア(Michelangelo、Hopsworks、Feast)のアーキテクチャを見ながら、「特徴量ストアがどのように作られているのか、そのためにビッグデータの技術がどう使われるのか」を説明しています。どの特徴量ストアでもKafkaとSparkが使われているのが興味深いところです。
一方、MLOpsについては「Kubeflow」の機能を簡単に取り上げるに留めています。既にMLOpsを理解している人にとっては目新しい話はありませんが、データパイプラインを構築する上で「汎用的なワークフロー管理ツール(Airflowなど)を使うのか、それともMLOpsに特化したパイプラインのツールの方がいいのか」は判断の分かれるところかと思うので、データ基盤を考える上での一つの選択肢として紹介しています。
ワークフロー管理ツールは、ここ数年で本当にいろいろなものが登場し、選択肢に迷うくらいになりました。現時点での定番は「Apache Airflow」かと思いますが、筆者も3年くらいは使っていたものの何かと不都合を感じるようになり、もっといい選択肢を常に探しています。
現在はもっぱら「Prefect」を利用していて、今回の改訂でも迷った末にPrefectをメインに取り上げることにしました。Prefectはコア機能はオープンソースになっているものの、商用のクラウドサービスもやっているので、純粋なオープンソースソフトウェアとは言えない部分もありますが、Kubenatesで簡単に動かせるので個人的には気に入っています。
サンプルコードの再実装
新しい第7章では、旧第6章を全面的に書き直して、テキストデータを加工、集計するための具体的なサンプルコードを載せています。今回はHomebrewに依存するのはやめて、Ubuntu 20.04とDockerで実装しました。(仮想マシンとしてMultipassを利用します)
より手軽にサンプルコードを実行できるように、一部のコードはGoogle Colabでも動くようにしてあります。
Google ColabってSparkも動くんですね。いい時代になりましたね!
今回のサンプルコードでは、以下のステップでデータパイプラインを実行します。
- Webサイトからテキストファイルをダウンロード
- S3互換のオブジェクトストレージに保存(データレイク作成)
- SparkによるETLプロセス(データ構造化)
- Prestoによるデータマート作成
- Metabaseによるダッシュボード(可視化)
最初はこれらを手作業で順に実行し、そして最後にワークフロー管理ツール(Prefect)を使って自動化します。
ワークフローのコンテナ化
Prefectを選択した一つの理由は、ワークフローをコンテナ化するのが簡単だからです。最近はもうコンテナ技術を使わずにデータ処理する時代ではなくなりつつありますが、Prefectでは次のようなコードでDockerイメージをビルドしてレジストリに登録し、Kubernetesなどの環境で実行できるようにしてくれます。
from prefect import task, Flow
from prefect.environments.storage import Docker
# タスクを実装
@task
def my_task():
# do something
...
# ワークフロー(タスクの実行順序)を定義
with Flow('my-flow') as flow:
my_task()
# Dockerイメージをビルドしてレジストリにデプロイ
flow.storage = Docker(
registry_url='ghcr.io/my-project',
)
# Prefectサーバーにメタ情報を登録(実行開始)
flow.register(project_name='my-project')
ただ残念ながら、Prefectのマニュアルはちょっと読みづらく、ソースコードを読まなければ仕様を理解できないことも何度かありました。開発は活発で、仕様変更もよくあるので、書籍で取り上げるにはまだ時期尚早だったかもしれませんが、ワークフローのコンテナ化とはどのようなものであるかが伝わればと思います。
ちなみに本書では記述が間に合いませんでしたが、最新のPrefect 0.14ではKubernetes環境でのリソース割り当て方法が変更されていて、次のようにワークフロー単位で簡単に指定できるようになったようです。
# Run on Kubernetes with a custom resource configuration
flow.run_config = KubernetesRun(cpu_request=2, memory_request="4Gi")
データの可視化
データを可視化するソフトウェアは、オープンソースの「Metabase」やクラウドサービスである「Googleデータポータル」を中心に書き直しました(第2章、第7章)。どちらも無料で使えるので最初の一歩として導入しやすいかと思います。
補足:今回の改訂では書けなかったこと
迷った末に書かなかった話題を以下にいくつかまとめておきます。
メッセージ配送
Apache Kafkaのバージョン0.11以降では「exactly-once」なメッセージ配送に対応しており、Kafka 2.5ではそれが更に使いやすくなったという話がありますが、今回の改訂版ではそこまでカバーできませんでした。
Kafkaはメッセージ配送のデファクトスタンダードのようになってきたので、もっと詳しく踏み込んだ方がよかったのですが、本書では全体的にストリーム処理よりもバッチ処理を優先して取り上げました。
一方で「バッチ処理によるETLはもうやめて、ストリーム処理だけで統一しよう」という主張もよく見るようになりました。
この議論について自分は強い意見を持っていませんが、さすがにETLを完全になくすのは無理だし、学習の順番としてはKafkaよりもまずETLのやり方を覚えるのが先だろうと思っています。
とはいえ、ストリーム処理の方が適しているデータがあるのは確かなので、本来ならKafkaを使った簡単なサンプルコードを用意した方がよかったかもしれません。
ワークフロー管理
ワークフロー管理の実例についてはPrefectのみを取り上げましたが、多数のSQLを実行するようなワークフローでは宣言型のツールを使う方が簡単です。筆者は以前は「Digdag」を使っていましたが、最近はSQLの実行に特化した「dbt」を使い始めています。Prefectにはdbtを実行するタスクも組み込まれていて、ワークフローの大きな流れはPrefectで記述しながら、SQLの実行部分はdbtに任せる、といった記述の仕方もありそうです。
「コンテナネイティブのワークフローエンジン」とも呼ばれる「Argo」についても記述できませんでした。Kubernetesの周辺ではずいぶん人気があるようですが、自分はやはりPythonでワークフローを記述する方がしっくりきます。「1タスク=1コンテナ」である重いワークフローだとArgoが向いているのかもしれません。
データ転送を中心とするETLプロセス、データマートを作成するためのSQL実行、機械学習のための特徴量エンジニアリング、そして機械学習の訓練やデプロイを実行するパイプラインなど、目的によって最適なツールは違ってくるかもしれません。とはいえ、あまり利用するツールを増やしたくもないので悩ましいところです。
Dask
「Dask」を使ったデータ処理についてもほとんど取り上げられませんでした。メモリに収まるデータにはpandas、多数のコンピュータを使った分散処理にはSparkを使うのが標準的になってきましたが、Daskはその中間くらいのデータ処理に適しています。
Daskを使うような人は機械学習系のエンジニアやデータサイエンティストに限られるので、本書の主な対象読者であるデータエンジニアの職分からは外れるかもしれません。ただ、最近は機械学習系のエンジニアが増えているようなので、本来ならもっと踏み込んで記述しておくべきだったかもしれません。
クラウドサービス
クラウドサービスを使ったデータ基盤については何も書けませんでした。「AWS」や「Google Cloud」のようなプラットフォームで提供されるサービスに加えて、「Snowflake」や「Databricks」のようなマルチクラウドで提供されるサービス、あるいは「Treasure Data CDP」のように専門化されたデータプラットホームまで含めて考えると、もはや何も書かない方がいいと割り切ることにしました。
本書で取り上げた話題は、どのサービスを使う場合にも必要な普遍的なものばかりなので、基礎を整理するつもりで読んで頂ければと思っています。
改訂版の目次(第6章以降)
出版社のページから転載:
第6章 ビッグデータと機械学習
6.1 特徴量ストア
- 機械学習のための特徴量ストア
- 特徴量ストアによるデータ管理
- 特徴量ストアの実装例
6.2 MLOps
- 機械学習のためにデータパイプラインを構築する
- MLOpsの全体構成 ……三段階の発展
- MLOpsと特徴量ストア
- Kubeflow ……機械学習のオーケストレーション
- その他の機能 ……Metadata,Katib,Tools for Servingなど
6.3 まとめ
第7章 [実践]ビッグデータ分析基盤の構築
7.1 ノートブックとアドホック分析
- 学習にあたって
- サンプルデータの内容 ……5分ごとの気温
- 作業環境の構築 ……MultipassでUbuntu 20.04を起動する
- PythonスクリプトによるCSVファイルの収集
- データの内容を確認する ……pandas
- Sparkによる分散環境を整える
- 可視化によるデータ検証 ……Tableau Public
7.2 バッチ型のデータパイプライン
- Dockerによる環境構築 ……ラップトップ上での開発環境
- オブジェクトストレージ ……MinIO
- 構造化データの管理 ……Hiveメタストア
- オブジェクトストレージへのデータ転送
- ETLプロセス ……Spark
- クエリエンジンによるデータ集計 ……Presto
- ダッシュボードツールによる可視化 ……Metabase
- 特徴量エンジニアリング ……SQLとSpark
7.3 ワークフロー管理ツールによる自動化
- Prefect ……スクリプト型のワークフロー管理
- バッチ型のデータパイプラインを定義する
- 本番環境におけるワークフロー管理
- ワークフローのオーケストレーション ……ロジックと構成定義とを分離する
- 作業環境の削除 ……multipass delete
7.4 まとめ