apache sparkの紹介

34
ビッグデータ処理の プラットフォームとして注目されている Apache Spark のご紹介 玉川竜司

Upload: ryuji-tamagawa

Post on 15-Feb-2017

1.953 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Apache Sparkの紹介

ビッグデータ処理の プラットフォームとして注目されている

Apache Sparkのご紹介玉川竜司

Page 2: Apache Sparkの紹介

本日の内容

• 少しだけ自己紹介

• Hadoopとそのエコシステムの説明

• Sparkの概要説明

Page 3: Apache Sparkの紹介

少しだけ自己紹介

• 大阪のソフトウェア開発企業(Sky株式会社)勤務。

• コンピュータの技術書翻訳をやってます。

• ビッグデータ、ソフトウェア開発に関する本が中心。

Page 4: Apache Sparkの紹介

既刊書の一部

Page 5: Apache Sparkの紹介

今年の本

7月 8月 年内

Page 6: Apache Sparkの紹介

「ビッグデータ」の定義• 実は広く認められている定義はない

• マーケティング的には言ったもん勝ち的な・・・

• 純粋に量のこともあれば、レコード数のこともある

• 個人的には「数台のサーバーでは扱いきれない量のデータ」という感覚を持っています

• 技術的には、運用上障害の発生の可能性が無視できなくなると、一気に難易度が上がる

Page 7: Apache Sparkの紹介

Hadoopの登場

Page 8: Apache Sparkの紹介

2000年頃の状況

• もくろみ:山盛りのデータを捨てずに活用したらいいことあるのでは?

• 状況:そうはいってもコストが合わない。   コンピュータ単体の性能向上は行き詰まり気味。

• ブレークスルー : スケールアウト型の分散処理フレームワーク。

ブレークスルーになったのがGoogleのGFS / MapReduce 

Page 9: Apache Sparkの紹介

Hadoopが実現・解決したこと

多台数のPCによる分散処理のカジュアル化

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

分散処理が利用可能に

Page 10: Apache Sparkの紹介

Hadoop 0.x

• 分散ファイルシステム:HDFS

• 分散コンピューティングフレームワーク:MapReduce

• 生MapReduceでプログラムを書くのは非常に大変

HadoopRDB

OSファイルI/Oメモリバッファクエリ実行エンジン

SQLドライバ

OS

HDFS

MapReduce

注:この対比はちょっと無理矢理です

Page 11: Apache Sparkの紹介

Hadoop 1.x

• HBase(NoSQLデータベース)、Hive(SQLクエリエンジン)などが登場し、エコシステムができはじめる

HadoopRDB

OSファイルI/Oメモリバッファクエリ実行エンジン

SQLドライバ

OS

HDFS

Hive e.t.c.HBase

MapReduce

ドライバ

Page 12: Apache Sparkの紹介

HBase• HDFS上で動作するNoSQLデータベースエンジン

• 「生」のHadoop(HDFS)は徹底したバッチ指向で、大量のデータをまとめて書き、一気に読み込んで処理をすることに対してチューニングされている。

• これに対し、HBaseはHDFSを基盤にしつつも、小さいデータのランダムな書き込み・更新・読み取りに高い性能を発揮できる。スケーラビリティも極めて高い。

Page 13: Apache Sparkの紹介

Hive• HDFS+MapReduce上で動作するSQLクエリエンジン

• MapReduceは処理のスケーラビリティや耐障害性を担保するものの、「生」MapReduceはプログラミングが大変

• おなじみのSQLを使って、HDFS上に保存されているデータに対してアクセスできるようになった

• しかし意外と速くない(特に小さいクエリ)ことが問題視されることに・・・

• Schema on Read関連はエコシステムの他のツールからも利用されます

Page 14: Apache Sparkの紹介

Hadoop 2.x• クラスタのリソースマネージャーとしてYARN(Yet Another Resource Manager)が登場、MapReduce以外の分散コンピューティングフレームワークの誕生の素地となる

• そして新たに登場したのがSpark

• 別のトレンドとして、インメモリ系のSQLエンジンが増えてきた

OSHDFS

Hive e.t.c.

HBaseMapReduce

YARN

Spark (Spark Streaming, MLlib,

GraphX, Spark SQL)

注:この階層図は技術的に正確ではありません。複雑すぎて正確に描くことはたぶん無理・・・

Impalaなど(インメモリ系SQL)

「Hadoopって何?」という問いに対する答はどんどん難しくなっていて、狭義ではHDFS+YARN+MapReduceあたりです。ただ、全部ひっくるめて「エコシステム」と表現するこ

とが多くなりました。

Page 15: Apache Sparkの紹介

ここからSparkの話

Page 16: Apache Sparkの紹介

Sparkとは

• 分散処理のコンピューティングフレームワーク

• あえて言うなら相当するのはMapReduceのところ

• 特徴となるのは高速性とプログラミングの容易さ

OSHDFS

Hive e.t.c.

HBaseMapReduce

YARN

Impalaなど(インメモリ系SQL)

Spark (Spark Streaming, MLlib,

GraphX, Spark SQL)

Page 17: Apache Sparkの紹介

Sparkとは

• エンジンそのものはScalaで書かれています。

• ScalaはJVM上で動作する関数型言語で、型推論や高度なデータ型をサポートしているおり、複雑なアルゴリズムを簡潔なコードで表現できます。

• Spark上で動作するアプリケーションを書くための言語としては、Scala、Java、Pythonが標準。ただし、Javaはコードが冗長になりがちで、Pythonはいろいろと制約があります。

Page 18: Apache Sparkの紹介

Sparkの狙い

• CPUの利用効率の向上

• Hadoop(HDFS+MapReduce)ではCPUを使い切れていなかった

• mapフェーズ、reduceフェーズごとのHDFSへのI/OとJVMの起動が問題

• 抽象度の高いプログラミングモデルの提供による開発効率の向上

• インタラクティブな利用(Spark-shellやPySpark、SparkR、Spark-SQLなど)からバッチ処理までサポートする

Page 19: Apache Sparkの紹介

Sparkの高速性

mapJVM起動

読み書き

HD

FS

reduceJVM起動

読み書き

mapJVM起動

読み書き

reduceJVM起動

読み書き

f1 (データを読んでRDDへ展開)

Executor(JVM)起動

HD

FS

読み書き

f2f3

f4(ストレージへの永続化)f5(シャッフルを伴う処理) 読み書き

f6f7

MapReduceの処理の流れ Sparkの処理の流れ

メモリ(

RDD群)

読み書き

読み書き

読み書き

読み書き 読み書き

読み書き

読み書き

Page 20: Apache Sparkの紹介

開発の容易性

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

シェルから直接実行可能

Page 21: Apache Sparkの紹介

Sparkの様々なモジュール

Spark SQL (DataFrameAPI)

RDDをデータベースのテーブルのように扱うためのモジュール。SQL(HiveQL)でRDDのデータにアクセスできる。1.4からは、さらに汎用的なDataFrame APIが提供されている。

Spark Streaming ストリーミングデータ処理を行うためのモジュール。センサーデータなどの処理に。

MLlib 機械学習のライブラリ。特に並列処理が活用できるアルゴリズムを中心に、活発に開発が続けられている。

GraphX グラフデータベースのモジュール。

Page 22: Apache Sparkの紹介

Sparkの動作環境

• ローカルモード(単一のPCでも一応動作します。開発OK)

• Standaloneクラスタ(10台くらいまでならなんとか使えるかも。ただし分散ストレージがないのはハンデ)

• 本命はYARN(Hadoop 2.x)上での運用

• Mesos(Apache Software Foundationのクラスタマネージャ)上でも動作するものの、ケースとしては少なさそう

Page 23: Apache Sparkの紹介

Sparkのインタラクティブな利用 (シェルとノートブック)

• Sparkのインタラクティブシェル

• spark-shell / spark-sql(Scala)

• PySpark(Python)

• SparkR(R)

• 「ノートブック」系のツールは要注目

• Jupyter(ipython notebook)

• Apache Zeppelin http://ipython.org/notebook.html

Page 24: Apache Sparkの紹介

Sparkの実行モデル• ユーザーが起動するアプリケーションは’Driver’と呼ばれます

• Driverは、クラスタ内のExecutor群(実体はJVMのプロセス)を使って処理を進めます

• ユーザーのコードは、必要に応じてDriverからExecutorに配布され、分散実行されます

Slave

Executor

Storage

Master

Driver

Cluster Manager

Slave

Executor

Storage

Slave

Executor

Storage

Slave

Executor

Storage

Page 25: Apache Sparkの紹介

SparkR• Rの強み:豊富なライブラリ、既存のユーザー

• Hadoop/Sparkの強み:スケーラビリティ

• SparkR : RによるSparkシェル

• SparkのDataFrameをRから操作できる

• SparkのDataFrameをRのDataFrameと変換できる

Page 26: Apache Sparkの紹介

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

Page 27: Apache Sparkの紹介

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

Page 28: Apache Sparkの紹介

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

Page 29: Apache Sparkの紹介

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

Page 30: Apache Sparkの紹介

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

Page 31: Apache Sparkの紹介

試用と運用について

Page 32: Apache Sparkの紹介

Hadoopエコシステムの利用• 自前での運用と構築は大変です。

• 一番お勧めなのは、クラウドのHadoopのサービスを使うこと(AWSのElastic MapReduceとかAzureのHDInsight)。

• たいていの場合、「Hadoopの運用力」がビジネスの競争力の源泉ではないはずなので、そこはプロバイダに任せるほうが合理的だと思います(よほどクリティカルな部分でHadoopを使うのでなければ)。

• データセンターで運用する場合、あるいはお試し的に手元でクラスタ組む場合は、Clouderaのディストリビューション(http://www.cloudera.co.jp/products-services/cdh/cdh.html)が第一候補になると思います。

Page 33: Apache Sparkの紹介

Sparkの試用

• ローカルで動かしてみる、あるいは開発してみるだけならかなりお手軽です。

• ぜひトライしてみてください。

Page 34: Apache Sparkの紹介

ご清聴ありがとうございました。