ビッグデータを支える技術
書籍リンク
読んだ時期
- 2023-06-01 頃
目的
- 「分散処理」周りにどんな技術があるのか、の概要を確認したくて読んだ
全体的な感想
- 分かったような分かってないような、みたいな気持ちにだけなった(目的通り)
- numpy, pandas などの python ライブラリが使われるのはこういう文脈なのね、と分かったり
- あとは具体的に触ることがあってから考えよう
- 手を動かしてみたければ 7 章をやってみるのが良さそう
〜〜
以下は読んだとこメモ。関連して調べたことも追記
データパイプライン
- ビッグデータはまず最初に「データレイク」へと格納され
- そこから一部のデータを「データマート」として取り出します
というのが「データパイプライン」の流れ
Hadoop と NoSQL
- Hadoop と NoSQL の関係
- 「NoSQL データベースに書き込み、Hadoop で分散処理する」
- Hadoop
- MapReduce を参考に作られている
- Google で開発された分散処理のフレームワーク
- Hive
- SQL のようなクエリ言語を Hadoop で実行するためのソフトウェア
- MapReduce を参考に作られている
- NoSQL データベース
- データの種類ごとの分類
- キーバリューストア (KVS)
- ドキュメントストア (JSONなど構造を持ったもの)
- ワイドカラムストア
- 代表的なアプリ
- Mong DB : ドキュメントストア
- Cassandra : ワイドカラムストア
- Redis : キーバリューストア
- データの種類ごとの分類
ビッグデータとデータウェアハウス
- エンタープライズデータウェアハウス (EDW)
- データウェアハウス
↑
これ自体はもともとあったが、Hadoop で分散処理するような文脈で、
「ビッグデータ」というキーワードが使われるようになった
・・・
多くのデータウェアハウスは製品として安定した性能を提供するために、
「アプライアンス」といって、抱き合わせて提供される。
データの柔軟性を考えて、以下のような使い分けがされたりするそうだ。
- 増え続けるデータは Hadoop に任せる
- 比較的小さなデータ、重要なデータなどは データウェアハウスに入れる
データ処理のためのクラウドサービス
- クラウド向け Hadoop
- Amazon Elastic MapReduce
- Azure HDInsight
- データウェアハウス
- Google BigQuery : 共有リソース
- Amazon Redshift : 占有リソース
Hadoop 後継
- Hadoop + Hive の問題
- 遅い
- 汎用的だが保守管理が難しい
- Hive 代替 : クエリエンジン ← SQL がが使えれば良いケース
- Impala : Hive 互換
- Presto : S3 + RDB のようにまたがって使いたいケース
- Amazon Athena で採用
- Hadoop (MapReduce) 代替 : 分散データ処理
- Apache Spark
- Google Cloud Dataflow
HTAP
HTAP : Hybrid Transactional/Analytical Processing
- OLTP : トランザクション処理 ← RDB の役割
- OLAP : 分析処理 ← DWH の役割
T と A のハイブリッドということか。
OL は オンラインの略
Spark や Cloud Dataflow は、RDB と データウェアハウスの橋渡しをする、というような位置づけ・・?
RDBMS の活用
- Amazon Aurora
- MySQL や PostgreSQL のストレージ部分を分散する
データパイプライン 再び
パイプラインの各段階
- データソース
- 中身はローデータ (raw data, 生データ)
- 必要に応じて「データレイク」に格納
- 生データを形式問わず一元的に格納する場所
- データウェアハウス
- 構造化・整形されたデータを保存し、分析に適した形にする
- データマート
- ユースケースごとに抽出・整形されたサブセット
- 多くの場合、SQL でアクセスされる
ETL ツールで「データソース」→「データウェアハウス」→「データマート」と次のフローにつなげる
- ETL ツールは下記の処理をするツール
- Extract (抽出)
- Transform (変換)
- Load (格納)
- ETL ツールの具体例
- AWS Glue
- Google Cloud Dataflow
- ...など
アドホック分析
あらかじめ定義されたレポートやダッシュボードではなく、
その場の目的・仮説に応じて都度実行する分析。
→ Python, R と言ったスクリプト言語がよく使われる
Python が使われる理由
- Pythonは汎用のスクリプト言語
- 幅広い分野のライブラリが入手可
- 特に以下のようなことでデータの前処理するのに向いている
- 外部システムのAPIを呼び出す
- 複雑な文字列処理
- Python は科学技術計算の分野で長年使われてきた
- 数値計算 (NumPy や SciPy など) のライブラリが充実
- 機械学習のフレームワークも充実
- データ処理の「データフレーム」ライブラリ (pandas) も使用可能
- 「データフレーム」自体は R の機能を Python で実現したもの
データフレーム
表形式のデータを抽象化したオブジェクトのこと
KPI モニタリング
- KPI : Key Performance Indiator
- 業界ごとの、重要な指標のこと
- 何でも取り入れようとすると多くなりがちだから、主要なキーに絞るという意図か
例:
- Web サービスの KPI
- DAU (Daily Active User)
- 継続率 (Customer Retention)
- ARPPU (Average Revenue Per Paid User)
- オンライン広告の KPI
- CTR (Click Through Rate)
- CPC (Cost Per Click)
- CPA (Cost Per Acquisition)
関連用語
- KPI モニタリングでは、「行動可能(actionable)」か、というのが重視されるそう
- 客観的なデータに基づいて次の action を判断 → 「データドリブン」な意思決定
クロス集計
- クロステーブル (matrix)
- これを k1 x k2 でセルの値が v のテーブルだとすると
- トランザクションテーブル
- これは (k1, k2, v) が1行の表
- ピボットテーブル
- これは「トランザクションテーブル」から「クロステーブル」に変換する操作のこと
- または、変換されて「クロステーブル」状態になった表のこと
- 逆のことはアンピボットだよ
- クロス集計
- カテゴリA × カテゴリB の出現数・合計・平均などを集計するもの
- これは「トランザクションテーブル」から group by 集計しつつ、「クロステーブル」に変換するような操作のこと
- ピボットと似ているが、ピボットは並べ替えてるだけ
pandas でのクロス集計
pd.merge(df1, df2, on='key1')のようにmerge関数で集計後pivot_table()でクロステーブル形式に出力- ちなみに アンピボットは
melt()
SQL でのクロス集計
- case などを使ってゴリゴリ。そこそこ面倒
- 詳細は略
- トランザクションテーブルを「縦持ち」、クロステーブルを「横持ち」というようだ
- 「横持ち」といったら転置されたものを想像するが、そうではなさそう
実行時間のイメージ
各段階で
- データレイク → データマート
- 数分から数時間
- データマート → 可視化ツール
- 数秒
関連用語
- レイテンシ : 処理の応答にかかる時間(の遅延)のこと
- スループット : 一定時間に処理できるデータの総量
目安
- メモリに乗り切るデータ量 → RDB で完結
- それを超えると ディスク I/O が発生する
高速化のための手法(それぞれ用語だけ)
- 圧縮と分散
- MPP (Massively Parallel Processing)
- Amazon RedShift, Google BigQuery
- MPP (Massively Parallel Processing)
- データを集計に適した形に変換
- 列指向ストレージ (カラムナーデータベース)
- 同じ列のデータを圧縮することができる
- 行指向ストレージの利点は失われる。つまり行追加/削除や行単位での検索(インデックスによる効率化)での速度を犠牲にする
- 列指向ストレージ (カラムナーデータベース)
行指向と列指向について
- 列指向 → 分析向き
- 行指向 → トランザクション向き
Jupyter Notebook
- Jupyter Notebook : 「分析の過程をあとから再現できるようにノートを留めておく」というような作業をするためのツール。環境?
- Jupyter の名前の由来は Julia + Python + R で、Julia 言語も使用可
- Google Colab というサービスを使うとクラウドで実行できる?
- 可視化ライブラリ matplotlib
- ダッシュボードツール Metabase, Kibana, Google データポータル
- Metabase X-ray によるダッシュボード 自動生成
- Kibana : JavaScript製。 Elasticsearch (全文検索に対応したデータストア)のフロントエンド
- Google データポータル: オンラインで使える可視化サービス
関連用語が分からない過ぎて、全くイメージわかない。 気が向いたら触ってみよう。
OLAP キューブ
- 2 次元のデータ = クロステーブルで表現可
- 多次元のデータ = OLAP キューブ
OLAP キューブ用のクエリ言語 (MDX)
関連の用語
- ファクトテーブル : トランザクションのように事実が記録されたもの
- ディメンションテーブル : ファクトテーブルから参照されるマスタデータなど
- 非正規化
- スタースキーマ
- 多次元モデルではカラムをディメンションとメジャーとに分類
データ形式と 列指向DB
データ形式
- 構造化データ
- スキーマが明確に定義されたデータ
- RDB のテーブル定義のこと
- 非構造化データ
- テキストデータなど
- CSV, JSON, XML など書式が決まってるものは「スキーマレスデータ」と呼び分けている
データ形式と列指向DB
- Apache ORC
- 構造化データを扱う
- Apache Parquet
- スキーマレスに近いデータ構造を扱う
- データ読み込みに計算リソースが消費される
- そこで Hadoop, Spark の分散処理が活用される
Hadoop
Hadoop は、分散システムを構成する多数のソフトウェアからなる集合体
基本コンポーネント
- 分散ファイルシステム : HDFS
- リソースマネージャ : YARN
- 分散データ処理 : MapReduce
YARN
アプリケーションが使用するCPUコアやメモリをコンテナと呼ばれる単位で管理する
→ アプリケーションごとに割り当てを管理して負荷を見て分散する
MapReduce
任意の Java プログラムを走らせる。
- 大きなデータ読み込むのに適しているが
- 小さなプログラムを実行するにはオーバーヘッドが大きすぎる
Hive on Tez という技術で高速化を目指しているとか
図を見ると、以下のようにやってるな。
入力データ → Map → 一時データ → Reduce → 中間データ → Map ...
ああ、map でデータ小分けして、そのデータで分散処理させつつ、結果を reduce で集計、みたいなことか・・?
Spark
大量のメモリを活用した高速なデータ処理の基盤
- MapReduce はメモリが足りずディスクI/Oを使う前提だった
- 使えるメモリが増えてきて、できるだけメモリで処理を完結させるためのものが Spark
Spark は分散データ処理 (MapReduce) を置き換えるもの。(Hadoop を置き換えるものではない)
→ では枠組みだけ MapReduce 残して、MapReduce から Spark を使うようなイメージか?と思ったがそういうことではないらしい
→ そこで使われるのが「データフロー」のためのフレームワークということ?
→ Spark, Google Cloud Dataflow が その役割をするので、結局、Hadoop を使うことはない、ということになる?
※ AWS で完結させる場合は こんな感じらしい
[データ] → S3 → AWS Glue → Athena / Redshift → QuickSight
※ Python で完結させる場合は、Prefect + Dask?
MapReduce に代わる新しいフレームワーク
DAG (diarected acyclic graph) :
新しいフレームワークに共通するデータ構造
「有向非循環グラフ」という
- ノードとノードが矢印で結ばれる (有向)
- 矢印をいくら辿っても同じノードには戻らない (非循環)
システムの内部的な表現なので、利用者が意識することはないそうだ。
遅延評価
5章
→ いったん飛ばす
7章
→ 手を動かしてみる・・?