詳解Apache Spark

技術評論社から近々刊行される「詳解Apache Spark」をご恵贈いただきました.ありがとうございます!

詳解 Apache Spark

詳解 Apache Spark

Amazonの発送は4月29日からのようですが,都内のジュンク堂紀伊國屋書泉ブックタワーなどの大型書店では既に先行販売されているようです.是非手に取ってみてください.

総評

本書は,大規模並列分散基盤のApache Sparkについて,豊富な実践例を交えながら基本的なコンセプトや使用方法が解説された書籍です.この分野の第一線で実際に業務で使用している方々が,わかりやすく執筆されています.Sparkを使う必要があったりどんなものか知ってみたいと思ったりしているエンジニアの方,普段PythonやRなどでデータ解析を行っていてSparkを使ったデータ処理,解析について知ってみたい,使ってみたいという方にオススメです.

個人的に特に良かったと感じたポイントは,

  • 具体例が多いのでデータ解析に使用するイメージがわくこと
  • 分析者にとってもとっつき易い内容になっていること(基本的なコンセプトや機能とその応用例のバランスが大変良い)
  • DataFrameに1章割いて実践例とともに説明されていること
  • Spark1.6で導入された機能についても多く紹介されていること

です.

また,複数人で執筆しているにもかかわらず読者に要求する技術レベルや文体などにも統一感があります.編集,構成という観点でもしっかりした書籍であるという印象を受けました.

どの章も素晴らしい内容で読み応えがありますが,私のように探索的なデータ解析を行っている場合,Sparkとは何かから始めて一通りデータ解析で使えるようになりたいならば,第1章 → 第2章 → 第3章 → 第5章 → 第7章 → 第8章の順で一通り読み進めていき,残りの章は必要に応じて目を通すのも一つの手かなと思いました(あくまで個人的な所感).

SparkはScalaJavaPython,RのAPIが提供されていますが,本書はScalaを扱っています.本書で基本的な考え方や使用方法をおさえれば,他言語のAPIはリファレンスを片手に難なく入れると思います.

=== 4/25 追記 ===
著者の一人の方からサンプルコードのアドレスを教えていただきました.ありがとうございます!本書を読むときの強力な伴侶になると思います.

https://github.com/yu-iskw/gihyo-spark-book-example


=== 4/25 追記 その2 ===
和書のSpark本は,本書の他にもオライリーから2冊(「初めてのSpark」,「Sparkによる実践データ解析」),翔泳社から1冊(「Apache Spark入門」)出ています.
翔泳社の書籍は未読なのでコメントできません.
オライリーの2冊はどちらも大変な良書ですが,

  • 「初めてのSpark」は機能解説が大変わかりやすく充実しており翻訳も丁寧で重宝しますが,データ分析者が最初に読むには若干敷居が高いと感じる
  • 「Sparkによる実践データ解析」は,MLlibを用いた事例が豊富で大変勉強になりますが,事例がSparkのどのような基本機能に支えられているかを理解しようとすると,初心者にとっては若干手薄になる

と感じていました(私のSpark力が低いためかもしれませんが・・・).
その点,本書は基本機能の解説が丁寧で,またそれと関連付けて事例も豊富でバランスが大変良いです.
特にデータ解析寄りの業務に従事している方は本書でバランス良く勉強してから,上記の2冊に進むこともできるのではないかと個人的には思っています.

第1章 Sparkの基礎

本章では,Sparkの基礎としてその概要(MapReduceとの違い,実行環境,歴史),テクノロジースタック,利用者とそのメリットについて端的に説明されています.

7ページという分量ですが,読者がSparkを勉強すること(本書を読むこと)の動機付けが随所になされています.単にSparkの機能や歴史,スタックを説明しているのではなく,「Sparkを勉強することで誰(職種)にとってどんなメリットがあるか」という視点が強く意識されて書かれています.

例えば,普段PythonやRでデータ解析を行っていて,最近Sparkをよく耳にするようになったデータ解析者は1.2節「Sparkのテクノロジースタック」、1.3節「Sparkの利用者とそのメリット」を読むと,自分がどんなメリットを得られるかがよくわかると思います.また,データエンジニア,アプリケーションエンジニアにとっても,自分の業務にどう活かせるかがわかることでしょう.

第2章 Sparkの導入

本章では,実行環境の構築方法に始まり,ローカル環境でのインタラクティブシェルの実行例,Spark実行の背後で行われる処理の概要,スタンドアローンアプリケーションの実行例が扱われています.

個人的に特に良かったのが,インタラクティブシェルの2つの実行例で,RDDAPIの詳細な解説に立ち入ることなく処理の流れが図解されていることです.Sparkのキモの一つであるRDDがどういうフローで生成され,変換されるかについて,シンプルな例でイメージをつかむことができます.これは,以降の章を読み進めるうえでも重要だと思います.

第3章 RDD

本章では,Sparkの分散コレクションであるRDDの構造,操作(作成,変換,アクション,シャッフル,ペアRDDに対する集約,結合,永続化),そしてパーティションについて説明されています.

ここでも図が効果的に行われていてわかりやすいです.

これを機に,Sparkの開発者たちによる以下の論文を近々読もうかなと思います。

Matei Zaharia, Mosharaf Chowdhury, Tathagata Das, Ankur Dave, Justin Ma,
Murphy McCauley, Michael J. Franklin, Scott Shenker, Ion Stoica
Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing
http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf

第4章 クラスタ構築と運用

本章では,Sparkクラスタの構築方法について説明されています.ローカルモード,Spark Standaloneクラスタマネージャ,Hadoop YARN,Apache MesosApache Ambari,Amazon EC2Amazon Elastic MapReduceと,非常に多くのクラスタ構築方法,アプリケーションのデプロイ,リソース管理の方法が説明されています.

図がわかりやすいので,環境構築になじみがなくても読みやすい内容となっていると思います.

第5章 DataFrameとSpark SQL

本章では,SparkのDataFrame APIやSpark SQLを利用して,表形式のデータの集計や加工などの処理を行う方法について説明されています.DataFrameについてここまで懇切丁寧に説明されているのも本書の見どころの一つと言えるのではないでしょうか.

シェアバイクBAY AREA BikeShareの公開データをサンプルデータとして使用し,データフレームの処理を実践的に学んでいくことができます.
IOについても,JSON,Parquetフォーマットだけでなくデータ解析でありがちなCSVファイルをケースクラスを利用して読み込む方法,Apache Hiveとの連携,JDBCによるRDBMSやThrift JDBC/ODBCサーバとの連携方法等についてもしっかりと説明されています.

DataFrameのパフォーマンスチューニングとして,キャッシュ,実行計画の確認,パーティション数の調整についても取り上げられています.このあたりは非常に勉強になりました.

また,Spark1.6で試験的に追加されたDataset APIについても取り上げられていることも魅力の一つに感じました.Spark1.5まではクラスタ上で分散したデータはRDD,DataFrameという抽象化によって行われてきました.本書でも説明されているように,

  • RDDJVMオブジェクトに対してラムダ関数として処理を表現できるが,Catalystによる処理の最適化が行えない
  • DataFrameは構造化データを簡単に操作できるハイレベルAPIを提供しCatalystによる処理の最適化が行えるが,RDDに比べてUDFが使いづらく型安全ではない

というトレードオフがありました.こうした背景のもと,Dataset APIRDDとDataFrameのいいとこ取りをするために提案されました.本書では,Datasetの生成,DataFrameやRDDのDatasetへの変換について説明しています.今後,Dataset APIには様々な機能が追加されていくと思われますが,本書でコンセプトや基本的な使い方を習得しておくと得るものが大きいと思います.

本章の最後には,分析の実践例としてBAY AREA BikeShareのデータセットをクレンジング,集計し,Google Map上に可視化しています.集計結果はParquetフォーマットで保存し,SparkRで起動してR言語のggmapパッケージを利用して,シェアバイクがよく使われる区間を地図上に可視化します.その過程でデータや集計処理が正しいことの確認も行っており,日常のデータ分析でもよく行う作業に言及されていることも実践的で非常に好感が持てました.

第6章 Spark Streaming

本章では,ストリームデータをSparkで処理するコンポーネントであるSpark Stremingについて説明されています.

Spark StreamingへのAdvancedSourcesの入力はApache Kafka,Apache Flume,Amazon KinesisTwitter,ZeroMQ,MQTTと多くをサポートしますが,本書ではKafkaとTwitterが重点的に説明されています.
使用例として,アクセスログの集計,Twitterのツイートからの抽出・集計が取り上げられており,実践的で参考になりました.

ストリームデータ処理は従事している分野柄,今後データ収集,解析が浸透するにつれて重要度が増してくるはずなので実践していきたいと思います.

第7章 MLlib

本章では,Sparkで機械学習を用いたデータ解析を行うためMLlibについて説明されています.

7.1節「機械学習の基礎知識」では,機械学習の基礎知識として機械学習の利用プロセス,教師あり学習/教師なし学習,予測モデルの評価方法と指標,過学習や汎化性能,正則化,線形分離可能性などの機械学習の基本的な知識が説明されています.端的にまとまっていてわかりやすいので,7.2節以降でMLlibの個々のAPIを学習する際も必要に応じて参照すると良いでしょう.

7.2節「MLlibでの機械学習」では,まずspark.mllibとspark.mlという2つのAPIセットの概要が説明されます.その後,spark.mlのPipelineが取り上げられます.機械学習アルゴリズムだけでなく,特徴抽出/変換/選択,交差検証(クロスバリデーション),評価指標,ハイパーパラメータの探索(グリッドサーチ)などについても取り上げられており実践的です.

PipelineやTransformerクラス,Estimatorクラスなどは,Python機械学習ライブラリscikit-learnを使用している方にはメソッド名なども含めてなじみ深い話だと思います.しかし,丁寧に説明してくれているので,そうでない方もスラスラと読み進めることができると思います.

学習済みのモデルの永続化については,Spark1.6.0からspark.mlに導入されたMLWritableトレイト,MLReadableトレイトについても説明があり,非常に勉強になりました.

7.3節「MLlibの利用例」では、スパムメッセージの検出,きのこの可食・有毒の識別,住宅価格の予測,映画のリコメンドの4例も取り上げられています.

第8章 GraphX

GraphXは,グラフ構造のデータの表現,並列処理を行うSparkのコンポーネントです.本章では,GraphXのデータ構造,グラフの操作,アルゴリズムとともに,独自のアルゴリズムを実装するPregel APIが説明されています.

また,利用例として,ECサイトにおけるユーザと商品の関係に基づいたレコメンデーションシステムが取り上げられています.ユーザと商品の関係をグラフで表現し,アソシエーションルールによる商品レコメンドを行っています.グラフのスケールフリー性を考慮したログデータの生成方法も実践的で,大変参考になりました.

Appendix YARN

この付録では,Sparkのクラスタマネージャの1つであるYARNの概要が説明されています.