ビッグデータ処理の
プラットフォームとして注目されている
Apache Sparkのご紹介
玉川竜司
本日の内容
• 少しだけ自己紹介
• Hadoopとそのエコシステムの説明
• Sparkの概要説明
少しだけ自己紹介
• 大阪のソフトウェア開発企業
(Sky株式会社)勤務。
• コンピュータの技術書翻訳を
やってます。
• ビッグデータ、ソフトウェア開
発に関する本が中心。
既刊書の一部
今年の本
7月 8月 年内
「ビッグデータ」の定義
• 実は広く認められている定義はない
• マーケティング的には言ったもん勝ち的な・・・
• 純粋に量のこともあれば、レコード数のこともある
• 個人的には「数台のサーバーでは扱いきれない量のデータ」
という感覚を持っています
• 技術的には、運用上障害の発生の可能性が無視できなくな
ると、一気に難易度が上がる
Hadoopの登場
2000年頃の状況
• もくろみ:山盛りのデータを捨てずに活用したらいいことあるのでは?
• 状況:そうはいってもコストが合わない。

   コンピュータ単体の性能向上は行き詰まり気味。
• ブレークスルー : スケールアウト型の分散処理フレームワーク。
ブレークスルーになったのが

GoogleのGFS / MapReduce 
Hadoopが実現・解決したこと
多台数のPCによる分散処理のカジュアル化

「それまでに比べれば」はるかに低いコスト・労力で、


分散処理が利用可能に
Hadoop 0.x
• 分散ファイルシステム:HDFS
• 分散コンピューティングフレー
ムワーク:MapReduce
• 生MapReduceでプログラムを書
くのは非常に大変
HadoopRDB
OS
ファイルI/O
メモリバッファ
クエリ実行エンジン
SQL
ドライバ
OS
HDFS
MapReduce
注:この対比はちょっと無理矢理です
Hadoop 1.x
• HBase(NoSQLデータベース)、
Hive(SQLクエリエンジン)など
が登場し、エコシステムができは
じめる
HadoopRDB
OS
ファイルI/O
メモリバッファ
クエリ実行エンジン
SQL
ドライバ
OS
HDFS
Hive e.t.c.
HBase
MapReduce
ドライバ
HBase
• HDFS上で動作するNoSQLデータベースエ
ンジン
• 「生」のHadoop(HDFS)は徹底した
バッチ指向で、大量のデータをまとめて
書き、一気に読み込んで処理をすること
に対してチューニングされている。
• これに対し、HBaseはHDFSを基盤にしつ
つも、小さいデータのランダムな書き込
み・更新・読み取りに高い性能を発揮で
きる。スケーラビリティも極めて高い。
Hive
• HDFS+MapReduce上で動作するSQLクエリエ
ンジン
• MapReduceは処理のスケーラビリティや耐障
害性を担保するものの、「生」MapReduceは
プログラミングが大変
• おなじみのSQLを使って、HDFS上に保存され
ているデータに対してアクセスできるようになっ
た
• しかし意外と速くない(特に小さいクエリ)
ことが問題視されることに・・・
• Schema on Read関連はエコシステムの他の
ツールからも利用されます
Hadoop 2.x
• クラスタのリソースマネージャー
としてYARN(Yet Another
Resource Manager)が登場、
MapReduce以外の分散コンピュー
ティングフレームワークの誕生の
素地となる
• そして新たに登場したのがSpark
• 別のトレンドとして、インメモリ
系のSQLエンジンが増えてきた
OS
HDFS
Hive e.t.c.
HBaseMapReduce
YARN
Spark
(Spark Streaming, MLlib,
GraphX, Spark SQL)
注:この階層図は技術的に正確ではありません。

複雑すぎて正確に描くことはたぶん無理・・・
Impalaなど
(インメモ
リ系SQL)
「Hadoopって何?」という問いに対する答はどんどん難しく
なっていて、狭義ではHDFS+YARN+MapReduceあたりで
す。ただ、全部ひっくるめて「エコシステム」と表現するこ
とが多くなりました。
ここからSparkの話
Sparkとは
• 分散処理のコンピューティングフレームワーク
• あえて言うなら相当するのはMapReduceのところ
• 特徴となるのは高速性とプログラミングの容易さ
OS
HDFS
Hive e.t.c.
HBaseMapReduce
YARN
Impalaなど
(インメモ
リ系SQL)
Spark
(Spark Streaming, MLlib,
GraphX, Spark SQL)
Sparkとは
• エンジンそのものはScalaで書かれています。
• ScalaはJVM上で動作する関数型言語で、型推論や高度なデー
タ型をサポートしているおり、複雑なアルゴリズムを簡潔なコー
ドで表現できます。
• Spark上で動作するアプリケーションを書くための言語として
は、Scala、Java、Pythonが標準。ただし、Javaはコードが
冗長になりがちで、Pythonはいろいろと制約があります。
Sparkの狙い
• CPUの利用効率の向上
• Hadoop(HDFS+MapReduce)ではCPUを使い切れていなかった
• mapフェーズ、reduceフェーズごとのHDFSへのI/OとJVMの起動
が問題
• 抽象度の高いプログラミングモデルの提供による開発効率の向上
• インタラクティブな利用(Spark-shellやPySpark、SparkR、Spark-
SQLなど)からバッチ処理までサポートする
Sparkの高速性
map
JVM起動
読み書き
HDFS
reduce
JVM起動
読み書き
map
JVM起動
読み書き
reduce
JVM起動
読み書き
f1
(データを読んでRDDへ展開)
Executor(JVM)起動
HDFS
読み書き
f2
f3
f4(ストレージへの永続化)
f5(シャッフルを伴う処理)
読み書き
f6
f7
MapReduceの処理の流れ Sparkの処理の流れ
メモリ(RDD群)
読み書き
読み書き
読み書き
読み書き 読み書き
読み書き
読み書き
開発の容易性
public void map(….) … {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
output.collect(word, one);
}
}
public void reduce(…) … {
int sum = 0;
while (values.hasNext()) {
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
val textFile = spark.textFile("hdfs://...")
val counts = textFile.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://...")
Spark
MapReduce
シェルから

直接実行可能
Sparkの様々なモジュール
Spark SQL
(DataFrameAPI)
RDDをデータベースのテーブルのように扱うためのモジュー
ル。SQL(HiveQL)でRDDのデータにアクセスできる。1.4
からは、さらに汎用的なDataFrame APIが提供されている。
Spark Streaming
ストリーミングデータ処理を行うためのモジュール。センサ
ーデータなどの処理に。
MLlib
機械学習のライブラリ。特に並列処理が活用できるアルゴリ
ズムを中心に、活発に開発が続けられている。
GraphX グラフデータベースのモジュール。
Sparkの動作環境
• ローカルモード(単一のPCでも一応動作します。開発OK)
• Standaloneクラスタ(10台くらいまでならなんとか使えるかも。た
だし分散ストレージがないのはハンデ)
• 本命はYARN(Hadoop 2.x)上での運用
• Mesos(Apache Software Foundationのクラスタマネージャ)上で
も動作するものの、ケースとしては少なさそう
Sparkのインタラクティブな利用

(シェルとノートブック)
• Sparkのインタラクティブシェル
• spark-shell / spark-sql(Scala)
• PySpark(Python)
• SparkR(R)
• 「ノートブック」系のツールは要注目
• Jupyter(ipython notebook)
• Apache Zeppelin
http://ipython.org/notebook.html
Sparkの実行モデル
• ユーザーが起動するアプリケーションは’Driver’と呼ばれます
• Driverは、クラスタ内のExecutor群(実体はJVMのプロセス)を使って処理を進めます
• ユーザーのコードは、必要に応じてDriverからExecutorに配布され、分散実行されます
Slave
Executor
Storage
Master
Driver
Cluster Manager
Slave
Executor
Storage
Slave
Executor
Storage
Slave
Executor
Storage
SparkR
• Rの強み:豊富なライブラリ、既存のユーザー
• Hadoop/Sparkの強み:スケーラビリティ
• SparkR : RによるSparkシェル
• SparkのDataFrameをRから操作できる
• SparkのDataFrameをRのDataFrameと変換できる
SparkRの実行モデル
• DriverとしてRが動作する
• Rからは、SparkのDataFrameを扱える
• SparkのDataFrameとRのDataFrameを相互変換できる
Slave
Executor
Storage
Master
SparkR
Cluster Manager
Slave
Executor
Storage
Slave
Executor
Storage
Slave
Executor
Storage
RDD(Resilient Distributed Dataset)
• 論理的にはコレクション
• 物理的にはクラスタ内のノードに分散配置される
• RDDに対して「変換」をかけて、新たなRDDを生成する。その際に生
成されるのはRDD間の系統グラフであり、まだ演算処理は行われない
• RDDに対して「アクション」を行うと、系統グラフをさかのぼって計
算が実行される
# テキストを読んでRDDを生成
rmRDD = sc.textfile(‘readme.md’)
#フィルタをかけて次のRDDを生成
spRDD = rmRDD.filter(…)
#もう1つフィルタ。
sp10RDD = spRDD.filter(…)
#この時点ではまだテキストファイルも読まれていない
#行数のカウント。この時点ですべての処理が走る
count = sp10RDD.count()
元のファイル
rmRDD
spRDD
sp10RDD
RDD(Resilient Distributed Dataset)
• アクションを実行すると、各エクゼキュータ内で一気に系統グラフの計算が行われる。
• JVMの再起動は伴わず、ディスクへのアクセスも少ない。
• CPUのI/O待ちが少なく、使用効率が上がる
# テキストを読んでRDDを生成
rmRDD = sc.textfile(‘readme.md’)
#フィルタをかけて次のRDDを生成
spRDD = rmRDD.filter(…)
#もう1つフィルタ。
sp10RDD = spRDD.filter(…)
#この時点ではまだテキストファイルも読まれていない
#行数のカウント。この時点ですべての処理が走る
count = sp10RDD.count()
元のファイル
rmRDD
spRDD
sp10RDD
123
RDD(Resilient Distributed Dataset)
• 計算されたRDDの内容は、メモリもしくはディスクにキャッシュできる
• 初回のアクション実行時にキャッシュが行われ、それ以降のアクション実行時
には、キャッシュされたところまでしか系統グラフはさかのぼらない

rmRDD = sc.textfile(‘readme.md’)
spRDD = rmRDD.filter(…)
#キャッシュの指示。この時点ではまだキャッシュされない
spRDD.persist()
sp10RDD = spRDD.filter(…)
sp20RDD = spRDD.filter(…)
#行数のカウント。この時点でspRDDがキャッシュされる
count10 = sp10RDD.count()
#行数のカウント。spRDDの再計算は走らない
count20 = sp20RDD.count()
元のファイル
rmRDD
spRDD
sp10RDD
123
RDD(Resilient Distributed Dataset)
• 計算されたRDDの内容は、メモリもしくはディスクにキャッシュできる
• 初回のアクション実行時にキャッシュが行われ、それ以降のアクション実行時には、キャッシュされ
たところまでしか系統グラフはさかのぼらない
• 繰り返しの処理を伴うアルゴリズムを効率的に実行できるため、機械学習との相性がいい

rmRDD = sc.textfile(‘readme.md’)
spRDD = rmRDD.filter(…)
#キャッシュの指示。この時点ではまだキャッシュされない
spRDD.persist()
sp10RDD = spRDD.filter(…)
sp20RDD = spRDD.filter(…)
#行数のカウント。この時点でspRDDがキャッシュされる
count10 = sp10RDD.count()
#行数のカウント。spRDDの再計算は走らない
count20 = sp20RDD.count()
元のファイル
rmRDD
spRDD
sp10RDD
123
sp20RDD
456
試用と運用について
Hadoopエコシステムの利用
• 自前での運用と構築は大変です。
• 一番お勧めなのは、クラウドのHadoopのサービスを使うこと(AWSの
Elastic MapReduceとかAzureのHDInsight)。
• たいていの場合、「Hadoopの運用力」がビジネスの競争力の源泉ではない
はずなので、そこはプロバイダに任せるほうが合理的だと思います(よほ
どクリティカルな部分でHadoopを使うのでなければ)。
• データセンターで運用する場合、あるいはお試し的に手元でクラスタ組む
場合は、Clouderaのディストリビューション(http://www.cloudera.co.jp/
products-services/cdh/cdh.html)が第一候補になると思います。
Sparkの試用
• ローカルで動かしてみる、あ
るいは開発してみるだけなら
かなりお手軽です。
• ぜひトライしてみてください。
ご清聴ありがとうございました。

Apache Sparkの紹介