第6章. Cloud上のApache Sparkによるベイズ分類器
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
管理するクラスタがないBigQueryでクエリを実行することに慣れてしまったので、Hadoopクラスタの設定と管理に戻るのが怖い。しかし、クラウド上のデータサイエンスのツアーを約束したし、多くの企業でHadoopは重要な役割を果たしている。
この章では、フライトの到着遅延を予測するベイズモデルを作成することで、データサイエンスの問題の次の段階に取り組む。BigQueryとSpark SQLを含む統合ワークフローを通してこれを行う。
この章のコード・スニペットはすべて、この本のGitHubリポジトリの06_dataprocフォルダにある。この章で説明されているステップの実行方法については、そのディレクトリのREADME.mdファイルを参照のこと。
MapReduceとHadoopエコシステム
MapReduceは、Jeff DeanとSanjay Ghemawatによる論文で、マシンのクラスタ上で大規模データセットを処理する方法として説明された。キーと値のペアを処理して中間的なキーと値のペアを生成するmap 関数と、同じキーに関連するすべての中間値をマージするreduce 関数である。柔軟で一般化されたフレームワークは、コモディティマシンのクラスタ上でこのMapReduceモデルに従って書かれたプログラムを実行することができる。このようなMapReduceフレームワークは、分散システムアプリケーションを書くことを難しくしている細部の多くを引き受けてくれる。例えば、フレームワークは入力データのパーティション分割を適切に行い、マシンのセット全体でプログラムを実行するスケジュールを立て、ジョブやマシンの障害を処理する。
MapReduceの仕組み
大規模なデータセットがあり、そのデータセットに対して単語の出現頻度を計算したいとする。MapReduce以前は、これは非常に難しい問題だった。一つのアプローチは、スケールアップすることだろう。つまり、非常に大きくて強力なマシンを手に入れることだ。1このマシンは現在の単語頻度表をメモリに保持し、文書内で単語が出現するたびに、この単語頻度表を更新する。これを擬似コードで示す:
wordcount(Document[] docs):
wordfrequency = {}
for each document d in docs:
for each word w in d:
wordfrequency[w] += 1
return wordfrequency
各スレッドに別々の文書を処理させ、スレッド間で単語頻度表を共有し、スレッドセーフな方法でこれを更新することで、マルチスレッドソリューションにすることができる。しかし、ある時点で、1台のマシンの能力を超えるデータセットに遭遇するだろう。その時点で、文書をマシンのクラスタに分割してスケールアウトしたくなるだろう。そして、クラスター上の各マシンは、ドキュメントコレクション全体の一部を処理する。プログラマはmap とreduce という2つのメソッドを実装する:
map(String docname, String content): for each word w in content: emitIntermediate(w, 1) reduce(String word, ...