ビッグデータを支える技術 (西田圭介)
書籍情報
- 著者:西田圭介(著)
- 発行日:2017-10-05
- ISBN:9784774192253
- URL:https://gihyo.jp/book/2017/978-4-7741-9225-3
書籍目次
- 本書について
- 本書の内容
- 本性で扱わない内容
- 本書の想定読者と前提とする予備知識について
- 本書の構成
- 第1章 ビッグデータの基礎知識
- 1.1 [背景]ビッグデータの定着
- 分散システムによるデータ処理の高速化 ビッグデータの扱いづらさを乗り越える二大技術
- ビッグデータ技術への要求 HadoopとNoSQLの台頭
- Hadoop 多数のコンピュータで大量のデータ処理
- NoSQLデータベース 頻繁な読み書き&分散処理に強みあり
- HadoopとNoSQLデータベースの組み合わせ 現実的なコストで大規模データ処理を実現
- 分散システムのビジネス利用の開拓 データウェアハウスとの共存
- 自分でできる! データ分析の間口の広がり クラウドサービスとデータディスカバリで加速したビッグデータ活用
- Column スモールデータ&ビッグデータの活用 スモールデータの技術も重要
- データディスカバリの基礎知識 セルフサービスのBIツール
- 分散システムによるデータ処理の高速化 ビッグデータの扱いづらさを乗り越える二大技術
- 1.2 ビッグデータ時代のデータ分析基盤
- [再入門]ビッグデータの技術 分散システムを活用してデータを加工していく仕組み
- データパイプライン データ収集からワークフロー管理まで
- データ収集 バルク型とストリーミング型のデータ転送
- ストリーム処理とバッチ処理
- 分散ストレージ オブジェクトストレージ,NoSQLデータベース
- 分散データ処理 クエリエンジン,ETLプロセス
- ワークフロー管理
- データウェアハウスとデータマート データパイプラインの基本形
- データレイク あらゆるデータをそのまま貯蔵
- データレイクとデータマート 必要なデータはデータマートにまとめる
- データ分析基盤を段階的に発展させる チームと役割分担,スモールスタートと拡張
- アドホック分析とダッシュボードツール
- Column データパイプラインの大きな流れは変わらない
- データマートとワークフロー管理
- データを集める目的 「検索」「加工」「可視化」の3つの例
- データの検索
- データの加工
- データの可視化
- Column 基幹系システムと情報系システムを分離しよう
- 確証的データ解析と探索的データ解析
- [再入門]ビッグデータの技術 分散システムを活用してデータを加工していく仕組み
- 1.3 [速習]スクリプト言語によるアドホック分析とデータフレーム
- データ処理とスクリプト言語 人気のPythonと,データフレーム
- データフレーム,基礎の基礎 「配列の配列」から作成
- Webサーバーのアクセスログの例 pandasのデータフレームで簡単処理
- データの前処理で使えるpandasの関数
- 時系列データを対話的に集計する データフレームをそのまま用いてデータ集計
- Column スモールデータの技術をうまく使っていく
- SQLの結果をデータフレームとして活用する
- 実行結果を確認するところではデータフレームを使う
- 1.4 BIツールとモニタリング
- スプレッドシートによるモニタリング プロジェクトの現状を把握する
- データに基づく意思決定 KPIモニタリング
- 月次レポート スプレッドシートによるレポート作成とその限界
- 変化を捉えて詳細を理解する BIツールの活用
- モニタリングの基本戦略とBIツール 定期的なレポートによる変化の把握と再集計
- Tip BIツールは,自分でデータを見るために。
- 手作業と自動化すべきこととの境界を見極める
- 手作業で済むことは手作業で済ませる
- 自動化したいときにはデータマートを作る
- 1.5 まとめ
- 1.1 [背景]ビッグデータの定着
- 第2章 ビッグデータの探索
- 2.1 基本のクロス集計
- トランザクションテーブル,クロステーブル,ピボットテーブル クロス集計の考え方
- ピボットテーブル機能によるクロス集計
- ルックアップテーブル テーブルを結合して属性を増やす
- BIツールによるクロス集計
- pandasによるクロス集計
- SQLによるテーブルの集約 大量データのクロス集計の事前準備
- Column テーブルの縦横変換(1) [SQL編]
- Column テーブルの縦横変換(2) [pandas編]
- データ集約→「データマート」→可視化 システム構成はデータマートの大きさで決まる
- トランザクションテーブル,クロステーブル,ピボットテーブル クロス集計の考え方
- 2.2 列指向ストレージによる高速化
- データベースの遅延を小さくする
- データ処理の遅延 遅延の小さいデータマート作成のための基礎知識
- 「圧縮」と「分散」によって遅延を小さくする MPPの技術
- 列指向データベースのアプローチ カラムを圧縮してディスクI/Oを減らす
- Column スループットとレイテンシ
- 行指向データベース 各行がディスク上で一連のデータとして書き込まれる
- 列指向データベース カラムごとにデータをまとめておく
- MPPデータベースのアプローチ 並列化によってマルチコアを活用する
- MPPデータベースと対話型クエリエンジン
- Column リソース消費を制限する 列指向ストレージ×MPPによる高速化と注意点
- データベースの遅延を小さくする
- 2.3 アドホック分析と可視化ツール
- Jupyter Notebookによるアドホック分析 ノートブックに分析過程を記録する
- ノートブック内での可視化
- ノートブックによるワークフロー 一連のタスクをまとめて実行
- Tip ノートブックの共有
- ダッシュボードツール 定期的に集計結果を可視化する
- Redash SQLによるクエリの実行結果をそのまま可視化
- Column データマートは必要なくなるか?
- Superset 画面上でマウス操作によってグラフを作る
- Column CSVファイルによる簡易的なデータマート
- Kibana Elasticsearchのフロントエンドでリアルタイムに作成
- Column 可視化ツールの選択の指針 どれを使う?
- BIツール 対話的なダッシュボード
- 1つのデータを多角的に分析する
- Jupyter Notebookによるアドホック分析 ノートブックに分析過程を記録する
- 2.4 データマートの基本構造
- 可視化に適したデータマートを作る OLAP
- 多次元モデルとOLAPキューブ
- MPPデータベースと非正規化テーブル
- テーブルを非正規化する
- ファクトテーブルとディメンジョンテーブル
- スタースキーマと非正規化 ファクトテーブルを中心に複数のディメンジョンテーブルを結合
- 非正規化テーブル データマートに正規化は必要ない
- Tip データウェアハウスとスタースキーマ
- 多次元モデル 可視化に備えてテーブルを抽象化する
- モデルの定義を拡張する
- Column ブレイクダウン分析
- 可視化に適したデータマートを作る OLAP
- 2.5 まとめ
- 2.1 基本のクロス集計
- 第3章 ビッグデータの分散処理
- 3.1 大規模分散処理のフレームワーク
- 構造化データと非構造化データ
- スキーマレスデータ 基本書式はある,スキーマは定めない
- データ構造化のパイプライン テーブル形式にして列指向ストレージに長期保存
- 列指向ストレージの作成 分散ストレージ上に作成して効率良くデータ集計
- Hadoop 分散データ処理の共通プラットフォーム
- 分散システムのコンポーネント HDFS,YARN,MapReduce
- 分散ファイルシステムとリソースマネージャ HDFS,YARN
- Tip YARNコンテナ
- 分散データ処理とクエリエンジン MapReduce,Hive
- Hive on Tez
- Tip Hive on Spark
- 対話型クエリエンジン ImpalaやPresto
- Spark インメモリ型の高速なデータ処理
- MapReduceを置き換える Sparkの位置付け
- 構造化データと非構造化データ
- 3.2 クエリエンジン
- データマート構築のパイプライン
- Hiveによる構造化データの作成
- 列指向ストレージへの変換 データ集計の高速化(バッチ型クエリエンジン向け)
- Hiveで非正規化テーブルを作成する
- サブクエリ内でレコード数を削減する 早い段階でファクトテーブルを小さくする
- データの偏りを避ける 分散システムの性能発揮のために
- Tip ベストプラクティス
- 対話型クエリエンジンPrestoのしくみ Prestoで構造化データを集計する
- プラグイン可能なストレージ 1つのクエリの中から複数のデータソースに接続可能
- CPU処理の最適化 読み込みもコードも並列実行
- Tip Prestoのリソース管理
- インメモリ処理による高速化 クエリ実行には極力,対話型クエリエンジンを
- 分散結合とブロードキャスト結合
- 列指向ストレージの集計 Prestoによる高速集計
- データ分析のフレームワークを選択する MPPデータベース,Hive,Presto,Spark
- MPPデータベース 完成した非正規化テーブルの高速集計に向いている
- Hive データ量に左右されないクエリエンジン
- Presto 速度重視&対話型特化のクエリエンジン
- Spark 分散システムを使ったプログラミング環境
- Column Mesosによるリソース管理
- 3.3 データマートの構築
- ファクトテーブル 時系列データを蓄積する
- テーブルパーティショニング 物理的なパーティションに分割
- データマートの置換
- Tip データ量を最初に見積もる
- サマリーテーブル レコード数を削減する
- スナップショットテーブル マスタの状態を記録する
- Column サマリーテーブルからの数値計算に注意
- Column スナップショットの日付に注意
- Tip スナップショット時に非正規化する
- 履歴テーブル マスタの変化を記録する
- [最終ステップ]ディメンジョンを追加して非正規化テーブルを完成させる
- データ集約の基本形
- ファクトテーブル 時系列データを蓄積する
- 3.4 まとめ
- 3.1 大規模分散処理のフレームワーク
- 第4章 ビッグデータの蓄積
- 4.1 バルク型とストリーミング型のデータ収集
- オブジェクトストレージとデータインジェスション 分散ストレージにデータを取り込む
- データインジェスション
- バルク型のデータ転送 ETLサーバー設置の必要性
- ファイルサイズの適正化は比較的簡単
- データ転送のワークフロー ワークフロー管理ツールとの親和性
- ストリーミング型のメッセージ配送 次々と送られてくる小さなデータを扱うために
- Webブラウザからのメッセージ配送 Fluentd,Logstash,Webイベントトラッキング
- Column Fluentdによるメッセージ配送
- モバイルアプリからのメッセージ配送 MBaaS,SDK
- デバイスからのメッセージ配送 MQTTを例に
- メッセージ配送の共通化 異なる部分と共通する部分を分離して考える
- オブジェクトストレージとデータインジェスション 分散ストレージにデータを取り込む
- 4.2 [性能×信頼性]メッセージ配送のトレードオフ
- メッセージブローカ ストレージの性能問題を解決する中間層の設置
- プッシュ型とプル型 スケーラビリティ向上とファイルサイズ適正化
- メッセージルーティング
- メッセージ配送を確実に行うのは難しい 信頼性の問題と3つの設計方式
- at most once
- exactly once
- at least once 重複排除は利用者に任されている
- Tip 信頼性のないメッセージ配送
- 重複排除は高コストなオペレーション
- オフセットを用いた重複排除
- ユニークIDによる重複排除
- エンドツーエンドの信頼性
- ユニークIDを用いた重複排除の方法 NoSQLデータベース,SQL
- データインジェスションのパイプライン 長期的なデータ分析に適したストレージ
- 重複を考慮したシステム設計 ビッグデータシステムにおける「重複」の考え方
- Column メッセージブローカと信頼性
- メッセージブローカ ストレージの性能問題を解決する中間層の設置
- 4.3 時系列データの最適化
- プロセス時間とイベント時間 データ分析の対象はおもにイベント時間
- プロセス時間による分割と問題点 極力避けたいフルスキャン
- 時系列インデックス イベント時間による集計の効率化(1)
- 述語プッシュダウン イベント時間による集計の効率化(2)
- Tip 頻繁な書き込みは最適化の効果を下げる
- イベント時間による分割 テーブルパーティショニング,時系列テーブル
- データマートをイベント時間で並び替える
- 4.4 非構造化データの分散ストレージ
- [基本戦略]NoSQLデータベースによるデータ活用
- 分散KVS ディスクへの書き込み性能を高める
- Amazon DynamoDB
- Tip DynamoDB StreamsとKinesis Stream
- Column [基礎知識]ACID特性とCAP定理
- ワイドカラムストア 構造化データを分散して格納する
- Apache Cassandra
- ドキュメントストア スキーマレスデータを管理する
- Tip RDBとドキュメントストア
- MongoDB
- 検索エンジン キーワード検索でデータを絞り込む
- Column フルスキャンによる全文検索
- Elasticsearch
- Tip ドキュメントストアとしてのElasticsearch
- Splunk
- Column モバイル機器の時計は狂っている(!?) 壊れたデータは除外する
- 4.5 まとめ
- 4.1 バルク型とストリーミング型のデータ収集
- 第5章 ビッグデータのパイプライン
- 5.1 ワークフロー管理
- [基礎知識]ワークフロー管理 データの流れを一元管理する
- ワークフロー管理ツール
- ワークフロー管理ツールとタスク
- 基本機能とビッグデータで求められる機能
- 宣言型とスクリプト型 ワークフロー管理ツールの種類
- Column 自家製のワークフロー管理ツール
- エラーからのリカバリー方法を先に考える
- リカバリーとフローの再実行
- Column ワークフローのバージョン管理
- Tip タスクをなるべく小さく保つ
- リトライ 何度も繰り返すエラーは自動化したい
- バックフィル 一定期間のフローを連続して実行する仕組み
- 冪等な操作としてタスクを記述する 同じタスクを何度実行しても同じ結果になる
- アトミック操作
- 冪等な操作 追記と置換
- 冪等な追記
- Column タスク内部でのリトライ制御
- アトミックな追記
- ワークフロー全体を冪等にする
- タスクキュー リソースの消費量をコントロールする
- ボトルネックの解消
- タスク数の適正化 大き過ぎず,小さ過ぎず,程良く分割
- [基礎知識]ワークフロー管理 データの流れを一元管理する
- 5.2 バッチ型のデータフロー
- MapReduceの時代は終わった データフローとワークフロー
- MapReduceの仕組み
- MapReduceに代わる新しいフレームワーク DAGによる内部表現
- SparkにおけるDAG
- データフローとワークフローとを組み合わせる
- データを取り込むフロー
- データを書き出すフロー
- データフローとSQLとを使い分ける データウェアハウスのパイプラインとデータマートのパイプラン
- 対話的なフロー アドホック分析のパイプライン
- MapReduceの時代は終わった データフローとワークフロー
- 5.3 ストリーミング型のデータフロー
- バッチ処理とストリーム処理とで経路を分ける
- ストリーム処理とバッチ処理とを統合する
- Spark StreamingにおけるDAG
- Column ストリーム処理による1次集計
- ストリーム処理の結果をバッチ処理で置き換える ストリーム処理の二つの問題への対処
- ラムダアーキテクチャ バッチレイヤ,サービングレイヤ,スピードレイヤ
- カッパアーキテクチャ
- アウトオブオーダーなデータ処理
- 本来のデータの姿は「イベント時間」から得られる
- イベント時間ウィンドウイング
- 5.4 まとめ
- 5.1 ワークフロー管理
- 第6章 ビッグデータ分析基盤の構築
- 6.1 スキーマレスデータのアドホック分析
- スキーマレスデータを収集する
- 試験環境の構築
- 対話的な実行環境の準備
- Column データ分析の環境を仮想化する Docker
- Sparkによる分散環境 データ量が増えても対応可能に
- MongoDBのアドホック集計
- テキストデータの加工 スクリプト言語の活用
- SparkプログラムにおけるDAGの実行
- データを集約してデータマートを構築する
- カーディナリティの削減 可視化のプロセスに効く
- Column pandasからCSVファイル以外の出力
- CSVファイルの作成 spark-csvライブラリ,pandasのデータフレーム
- BIツールでデータを可視化する
- Column デスクトップ型のBIツールとWeb型のBIツール
- スキーマレスデータを収集する
- 6.2 Hadoopによるデータパイプライン
- 日次のバッチ処理をタスク化する
- [タスク1]Embulkによるデータ抽出
- [タスク2]Hiveによるデータ構造化
- [タスク3]Prestoによるデータ集約
- 6.3 ワークフロー管理ツールによる自動化
- Airflow スクリプト型のワークフロー管理
- ワークフローの定義
- タスクの定義
- ワークフローをターミナルから実行する
- airflow test
- Column Pythonスクリプトをワークフローに組み込む
- airflow backfill
- スケジューラを起動してDAGを定期実行する
- エラーからのリカバリー
- スケジュールの設定
- Tip ワークフローの更新
- タスクが消費するリソースを制御する
- タスクの分散処理 リモートでワーカーを実行する
- Tip 一時ディレクトリ
- Hadoopのデータパイプラインを実行する
- Airflow スクリプト型のワークフロー管理
- 6.4 クラウドサービスによるデータパイプライン
- データ分析とクラウドサービスの関係
- Amazon Web Services
- Google Cloud Platform
- Treasure Data
- Digdag 宣言型のワークフロー管理
- Column Amazon RedshiftとGoogle BigQueryの違い
- 6.5 まとめ
- Column ビッグデータと機械学習の関係 データを使って価値を生み出す
- 6.1 スキーマレスデータのアドホック分析