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