メインコンテンツまでスキップ

『データベース指向アプリケーションデザイン』の10章「バッチ処理」を読んだのでそのメモ

· 約5分
moroball14

データベース指向アプリケーションデザイン』の 10 章「バッチ処理」を読んだのでそのメモ

3 つの異なるシステムのタイプを区別 サービス(オンラインシステム) バッチ処理(オフラインシステム) ストリーム処理システム(準リアルタイムシステム)

サービスは、クライアントからリクエストあるいは指示が来るのを待ち、レスポンスを返す。いわゆる API サーバーが一番身近かなー。

バッチ処理は、クライアントからのリクエストを待たず、あらかじめ定義された処理を実行する。スケジューリングされて実行という形が多い。

ストリーム処理は、オンライン処理とオフライン処理との間に位置する。

2004 年に発表されたバッチ処理のアルゴリズムである MapReduce Google をあれほどまでにスケーラブルにしたアルゴリズム

そんなすごいの!?

10.1 Unix のツールによるバッチ処理

ジョブのワーキングセット(ジョブがランダムアクセスしなければならないメモリの量) ワーキングセットが十分に小さいなら、インメモリのハッシュテーブルはノート PC 上でさえもうまく動作します 一方、ジョブのワーキングセットが利用可能なメモリ量よりも大きいなら、ソートのアプローチにはディスクを効率よく利用できる

Ruby を使ったバッチ処理、Unix を使ったバッチ処理、という話題があった。 バッチ処理は、データセットのサイズによって、パフォーマンスが大きく変わる。

プログラムをパイプで接続するという考え方は、今日 Unix の哲学と呼ばれるものの一部

Unix の哲学好き。でもちょっと忘れがちかもだから、時間作って読むかー。

10.2 MapReduce と分散ファイルシステム

Unix のツール群は入出力に stdin と stdout を使いますが、MapReduce ジョブは分散ファイルシステム上のファイルを読み書き この分散ファイルシステムは HDFS(Hadoop Distributed File System)と呼ばれる Google File System のオープンソースの再実装

HDFS 以外にもさまざまな分散ファイルシステム Amazon S3, Azure Blog Storage

HDFS は、シェアードナッシングの原則に基づいており、これはネットワークアタッチドストレージ(NAS)やストレージエリアネットワーク(SAN)のアーキテクチャにおける共有ディスクのアプローチとは対照的

シェアードナッシングの原則とは、複数のコンピュータで処理を分散して実行する分散システムの構成法の一つで、システムを構成するコンピュータ間で何も共有しない方式のこと

ref: https://e-words.jp/w/%E3%82%B7%E3%82%A7%E3%82%A2%E3%83%BC%E3%83%89%E3%83%8A%E3%83%83%E3%82%B7%E3%83%B3%E3%82%B0.html

MapReduce ジョブを作成するには、mapper と reducer という 2 つのコールバック関数

mapper は各入力レコードに対して 1 度ずつ呼び出され、入力レコードからキーと値のペアを生成する。1 つの入力レコードから次の入力レコードへの過程で状態を保持しない

reducer はキーと値のペアに対して繰り返し処理をしていく

大量のマシンにわたって演算処理を並列化できる

これってなぜ?そういう仕組みってことか?

10.2.2.1 事例: ユーザーのアクティビティ分析

あー、これはよくありそうだなー。なんとなく使い道わかる。 MapReduce って、ETL でよく使われるアルゴリズムなのかな? 非正規化するために MapReduce を行うイメージ。

バッチワークフローの出力 検索インデックスの構築 機械学習システムや、レコメンデーションシステムの構築

よく利用される用途はこの辺り。

10.2.4.3 バッチ処理の出力における哲学 Unix のツールと同じように、MapReduce のジョブはロジックを結線から分離し、関心事項を分離し、後日コードを再利用

なるほどなー。ありがたい。

Hadoop では、もっと構造化されたファイルフォーマットを使うことによって、これらのあまり価値がない構文変換を省けます

Hadoop とは、大規模データの蓄積・分析を分散処理技術によって実現するオープンソース。Hadoop は、MapReduce の実装である。

10.3 MapReduce を超えて

データフローエンジン

複数の処理のステージを経るデータの流れを明示的にモデル化するシステムのこと

10.3.1.2 耐障害性

あるタスクが失敗した場合、そのタスクを他のマシンで再起動さえすれば、分散ファイルシステムから同じ入力を読み取ることができるため、耐障害性に優れている

10.3.3 高レベル API と様々な言語

MapReduce が広く使われるようになってから長い時間を経て、分散バッチ処理のための実行エンジンは成熟してきました

MapReduce って実行エンジンだったのか?ということは、JavaScript にとっての Node.js のようなものかな?

Unix のツールと、これらのツールの設計哲学が発展して MapReduce やさらに最近のデータフローエンジンに取り込まれていった様子を見ていきました

いやー、Unix の哲学は偉大だ。 主に取り込まれた概念としては、ファイルとパイプ。 MapReduce においては、ファイルは分散ファイルシステムに、パイプはデータフローエンジンに取り込まれたイメージ。 データフローエンジンにはパイプに似た独自のデータ転送の仕組みが加えられ、中間状態を分散ファイルシステムに実態化せずに済むようになっている。

これの図がわかりやすい ↓

https://learn.microsoft.com/ja-jp/azure/hdinsight/hadoop/apache-hadoop-introduction

ちなみにここでは、

Apache Hadoop MapReduce は、膨大なデータを処理するジョブを記述するためのソフトウェアフレームワーク

とあって、実行エンジンなのかフレームワークなのかが、いまいち理解がつながっていない。