『[増補改訂]ビッグデータを支える技術 ――ラップトップ1台で学ぶデータ基盤のしくみ』より転載
本書は『ビッグデータを支える技術』の増補改訂版です。
「ビッグデータ」(big data)という言葉が広く用いられるようになって数年が経ち,以前であれば簡単には手を出せないと思われた大規模なデータ処理も,少し勉強すれば誰にでも扱えるものになってきました。筆者が前著『Googleを支える技術』(技術評論社,2008)の執筆にあたり「MapReduce」について学んでいた当時,それはどこか遠くの世界のように感じられたものですが,今ではもうありふれた技術になったのですから時代は変わったものです。
コンピュータの性能向上に伴い,ますます多くの物事がシステム化され,効率良く運用される時代になってきています。身近なところでは,たとえば「スマホで買い物をして,翌日には届けてもらえる」というとき,その背後では「決済システム」「在庫管理システム」「配送システム」などの多数のシステムが連携して動いています。
そのすべてのシステムがデータを生み出し,データを通してつながっています。データを見ることで,今どこで何が起きているのかを把握し,そして次に何が起きるだろうかと予想できます。データに基づいて次の指示を出すサイクルを自動化し,そのプロセスをまたシステムへと組み込むことで,さらなる仕事の効率化が図れます。
「機械学習」(machine learning)の技術などの発展によって,データを使ったシステム開発への期待は以前にも増して高まっています。今後もデータを活用して業務を改善する,あるいは「データ処理そのものをシステムの一部とする」ことが増えてくるのは間違いありません。
本書の内容
本書のテーマは「自動化されたデータ処理」です。ビッグデータと言うと,多くの人は「データ分析」を思い浮かべるかもしれませんが,本書で取り上げるのはデータの活用方法ではなく,「データ処理をどのようにシステム化するか」という問題です。
データの活用が重要であることに変わりはありませんが,だからと言ってデータの処理方法を知らなくても済むわけではありません。本書はおもに,これから「ビッグデータの技術を学ぼう」というエンジニアに向けて,最初に知っておくべき基本的なデータ処理の概念を広く取り上げることを目的としています。
データ分析における八割の時間は,データを準備するために費やされるとも言われています。世間では「データサイエンティストとして雇われたのに,データの前処理ばかりやっている」などといった嘆きも耳にします。「データを準備する」というエンジニアリングの部分を効率化しなければ,データ分析の苦労がなくなることはありません。
そのため本書では,まずはじめにデータ処理の過程で使われるソフトウェアやデータベース,プログラミング言語や可視化ツールなどの特徴を整理し,データを効率良く扱うための下地を整えます。その上で「ワークフロー管理」(workflow management)や「ストリーム処理」(stream processing)などといった「データ処理を自動化する技術」を見ていきます。
本書はなるべく平易な技術解説に努めており,ソフトウェアやシステム開発に興味のある人であれば問題なく読み進められるようにと心掛けています。実際にデータを扱う業務に携わる人に加えて,「データ処理のシステム開発とはどのようなものか」に関心のある人にも広く読んでもらえればと思っています。
本書はビッグデータの世界で使われる技術とその役割を,次々と見ていく体裁としています。個々の技術について踏み込んだ解説はしておらず,一つ一つの話題はネットで調べればわかることばかりです。そのためすでにこの分野で経験のある人からすると物足りなく思えるかもしれませんが,なるべく初学者が幅広い知識を得られることを目指して執筆しています。
本書で扱わない内容
データを利用する目的は多々ありますが,ここでは例として二つの分野を取り上げましょう。一つは「ビジネスインテリジェンス」(business intelligence)と呼ばれる分野で,企業の業績などを集計して,経営上の意思決定に役立てようとするものです。もう一つは「データマイニング」(data mining)と呼ばれる分野で,統計解析や機械学習などのアルゴリズムを駆使して,データから価値ある情報を見つけ出そうとするものです。
この二つの分野は重複する部分もありますが,基本的には必要な知識体系がまったく異なります。ところが,ビッグデータの技術はどちらの分野でも利用され,両方から強く影響を受けているため,どちらを主要な目的とするかで学ぶべき内容が変わります。一般的には,それぞれの分野の専門家に依頼してシステムを作り上げるところですが,本書では各分野の基礎知識を少しずつ取り上げています。
ビジネスインテリジェンスからは,データの可視化に関する考え方を紹介しています。とりわけ近年では「BIツール」(business intelligence tool)と呼ばれる可視化ソフトウェアが普及したことで,経営者でなくともプロジェクト単位でデータを見る人が増えています。本書では本格的なビジネスインテリジェンスについては説明しませんが,「MPPデータベース」(MPP database)のようなBIツールに関連する技術は取り上げています。
データマイニングからは,対話的なデータ分析環境の考え方を紹介しています。たとえば,「ノートブック」(notebook)と呼ばれるソフトウェアや,「データフレーム」(data frame)と呼ばれるデータ構造などは,データマイニングの世界から取り入れられたものです。本書ではデータマイニングそのものについては説明しませんが,そこで用いられるツール群は知っておく価値があります。
本書ではなるべく汎用的なデータ処理の技術を取り上げているため,特定の業界に特化したノウハウについては説明していません。たとえば,ビッグデータの技術が最もよく使われる分野の一つは「Webのアクセス解析」です。とりわけ「デジタルマーケティング」(digital marketing)の業界では,顧客の行動分析からネット広告の配信に至るまで,あらゆる用途でWebのアクセスログを活用します。しかし,その詳細は本書で扱える範囲を超えています。
また,近年ではあらゆるものをインターネットに接続する「IoT」(Internet of Things)が話題になっていますが,これも本書では取り上げていません。IoTはビッグデータとの関連も深く,たとえば,データマイニングの一分野である「異常検知」(anomaly detection)の技術で機械の故障を早期発見するといった試みもありますが,こうした応用も本書の対象外です。
ただし「多数のデバイスからデータを集める」ためのしくみは,ビッグデータの根幹となる要素の一つであり,その基本となる考え方は説明しています。たとえば,リアルタイムの「メッセージ配送」(message delivery)や「重複排除」(deduplication),そしてデータを格納するための「分散ストレージ」(distributed storage)などの技術です。
本書の後半では「特徴量ストア」(feature store)や「MLOps」(machine learning operations)のような機械学習に関連する話題も取り上げますが,機械学習の技術そのものは本書では扱いません。機械学習を活用したシステム開発で必要となるデータ処理の基盤や,日々のデータ処理を自動化する「オーケストレーション」(orchestration)の概念について理解を深めることが本書の目的となります。
本書の想定読者と前提とする予備知識について
本書はビッグデータを扱うエンジニアや,作業を自動化したいと考えるデータサイエンティストをおもな対象としています。エンジニアが対象であるのは,データ処理のためにスクリプト言語や自動化ツールを用いるためです。読み進めるにあたり,プログラミングに精通している必要はありませんが,システム開発の一般的な知識はある程度必要になります。
オペレーティングシステム(OS)やリレーショナルデータベース(RDB)の基本的な知識は前提とします。SQLのクエリを読めることも想定しますが,読めなくても支障はありません。ただし,テーブルの「結合」(join)のような概念は理解している必要があります。
プログラムのサンプルコードを読むにはPythonの知識が必要です。とは言え,第6章までは最小限のサンプルコードしか載せておらず,読み飛ばしてしまっても問題ありません。一方,第7章では多数のサンプルプログラムを使って,データ処理の実例を示しています。
動作確認環境について
サンプルコードの実行には「Ubuntu 20.04 LTS」(AMD64版)を利用します。ホストOSには「macOS Big Sur 11.1」を用いて,仮想マシンを作成するために「Multipass」を導入しました。WindowsでもMultipassが使えることは確認しており,サンプルコードの多くはそのまま動きますが,Webの管理画面など一部機能へのアクセスは制限される場合があります。
仮想マシンを作成するには最低でも8GBのメモリと20GBのディスクの空き容量が必要です。サンプルコードの実行過程では20GB近くのファイルをダウンロードすることになるため,Wi-Fi環境での実行を推奨します。仮想マシンでなくとも,Ubuntuの実行環境さえあればサンプルコードは動かせます。少なくともPythonとJava,そしてDockerさえ使える環境であればほとんど変更なしに動くはずです。一部のコードは「Google Colab」(Colaboratory)を使って,Webブラウザだけで動作確認できるようにもしてあります。
ビッグデータの処理には多数のコンピュータが使われますが,その技術を学ぶのには1台のラップトップがあれば十分です。そのため本書で紹介するソフトウェアは,どれも手軽に試せるオープンソースのものか,少なくとも無償版のあるものを選んでいます。ただし,一部のクラウドサービスなどは有償契約を前提としており,無償で使い続けられるとは限らないので注意してください。
本書ではHadoopやSparkなどの分散システムの概要を説明しますが,それらの具体的な設定方法は取り上げていません。最近はクラウドサービスを使ってシステム構築することも増えており,実際の設定は利用するサービスによって異なります。環境に応じてドキュメントを参照してください。
本書の構成
第1章「ビッグデータの基礎知識」は導入として,ビッグデータの技術が生まれた歴史的な背景を説明し,基本となる用語を整理しています。ここではビッグデータとの対比として,以前からある「スモールデータの技術」についても取り上げます。簡単なPythonスクリプトによるデータ処理や,BIツールの考え方を知ることで,第2章以降の技術に話を繋げます。
第2章「ビッグデータの探索」では,データの「対話的な集計と可視化」がテーマとなります。とりわけデータの性質がまだわかっていない初期の段階では,データの集計を何度もやり直すことで,徐々にデータに対する理解を深めるものです。第2章ではデータを秒単位で集計するための「データマート」(data mart)の性質についても説明します。
第3章「ビッグデータの分散処理」では,HadoopやSparkなどの「分散処理のフレームワーク」を使ってデータを加工,集計し,データマートを作り上げるプロセスを中心に説明します。データを集計するためにどの製品を選ぶかというのは非常に悩ましい問題ですが,第3章ではいくつかの選択肢とそれらの特徴を比較しています。
第4章「ビッグデータの蓄積」では,「データを集めて保存する」手順を説明します。これは単純なようで奥の深いテーマです。たとえば,何百万台ものセンサー機器からデータを集める場合,それをデータベースに書き込むだけでも大きな負荷となります。第4章では,いくつかの分散ストレージの特徴を取り上げつつ,分散ストレージにデータを取り込む「データインジェスション」(data ingestion)のプロセスを説明します。
第5章「ビッグデータのパイプライン」では,「データ処理を自動化する」手順を説明します。データ処理の自動化には,定期的にスケジュール実行される「バッチ処理」と,絶え間なく実行される「ストリーム処理」とがあります。第5章ではSparkを例として,バッチ処理とストリーム処理とが統合されたフレームワークを取り上げると共に,障害に強いデータ処理を実現するための「ワークフロー管理」の考え方についても説明します。
第6章「ビッグデータと機械学習」では,機械学習の前処理としてビッグデータがどのように加工されるのかを説明します。機械学習では「特徴量」(feature)と呼ばれる数値データを大量に必要とするため,集めたデータを定期的に,あるいはリアルタイムに集計して「特徴量ストア」(feature store)へと格納します。その過程では第3章から第5章で解説するビッグデータの技術が使われます。
最後に,第7章「[実践]ビッグデータ分析基盤の構築」は応用編として,第6章までに取り上げたソフトウェアを利用して「過去の気温と降水量の推移」を集計するサンプルプログラムを動かします。最初はデータの特徴が何もわかっていないところからスタートするので,pandasとSparkを用いた対話的なセッションでデータを分析します。
そうしてデータの理解が進み,そのデータで何を実現したいのかが定まれば,本番環境を想定して「データ処理の自動化」に取り組みます。第7章ではワークフロー管理のソフトウェアとして「Prefect」を導入し,毎日1回データマートを更新するバッチ処理を走らせます。
Prefectでは日々のデータ処理を実行する各タスクをDockerコンテナとして動かせます。近年では「サーバーレスアーキテクチャ」(serverless architecture)の普及により,自分でサーバー管理する必要のないシステムが人気を集めていますが,第7章の最後では「コンテナ化されたワークフロー」を実現するステップについても解説しています。
改訂版のおもな変更点
今回の改訂版では新しく「ビッグデータと機械学習」と題して新章(第6章)を書き起こしたのと同時に,第7章のサンプルコードを全面的に刷新し,より現代的なデータ処理の実例を手軽に学べるようにと努めました。
第6章は発展を続ける機械学習の分野に一歩踏み込んだ内容となっています。「特徴量ストア」や「MLOps」のような機械学習のフレームワークを実現するために,第5章までに学んだビッグデータの技術がどのように生かされるのかを説明しています。
第7章のサンプルコードでは,Twitterからデータ収集することはやめて,単純にテキストファイルをダウンロードする形へと変更しました。データ構造化のプロセスはHiveからSparkへと変更し,ワークフロー管理もAirflowからPrefectへと変更しました。
ソフトウェアのインストール手順はUbuntuのパッケージ,もしくはDockerコンテナを使うように変更しました。事前に設定済みのDockerコンテナを配布しており,以前よりも手軽に実行できるはずです。データ処理のワークフローを実装する部分でもDockerを活用しており,モダンなデータパイプラインの実装例として参考にしてもらえればと思います。
その他の小さな変更点として,データの可視化ツールは無償で使える「Googleデータポータル」と「Metabase」を中心とした解説に書き直すことで,より手軽に可視化の手順を試してみられるようにしました。
一方で,元々小節で取り上げるにとどめていましたが,初版にあったクラウドサービスの比較(旧6.4節「クラウドサービスによるデータパイプライン」)は削除しています。クラウドサービスは変化が早く,書籍の内容はすぐに陳腐化してしまうことがおもな理由です。
とはいえクラウドサービスの重要性が失われたことはなく,ビッグデータの基盤を考える上でクラウドサービスが第一の選択肢となる状況は今も変わりません。本書を通して,自分にとって必要な技術は何かという理解を深め,実際のサービス選択の一助となることを願っています。
本書ではビッグデータに関する多数の技術を取り上げますが,その中からどれを選ぶべきかという「正解」は用意していません。ビッグデータの技術は日々発展を続けており,何が正しい答えかは筆者にもわかりません。
本書で例として取り上げたソフトウェアは,どれも筆者の個人的な知識や経験から選んだものであり,あらゆるソフトウェアを客観的に評価した結果ではありません。あくまで理解を深めるための一例として紹介するものであり,特定のソフトウェアやサービスを推奨するものでないことはご理解ください。
本書で取り上げることができたのは,ビッグデータの技術を使いこなすために必要な知識のうちの一部でしかありませんが,これから学習を進めるにあたって,本書の解説が少しでも助けになれば幸いです。
2021年1月 著者