Top Banner
データベース技術者の皆様に なるべくわかりやすく Apache Spark を説明してみます Sky株式会社 玉川竜司
30

20160127三木会 RDB経験者のためのspark

Jan 29, 2018

Download

Software

Ryuji Tamagawa
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 20160127三木会 RDB経験者のためのspark

データベース技術者の皆様に

なるべくわかりやすく

Apache Spark を説明してみます

Sky株式会社 玉川竜司

Page 2: 20160127三木会 RDB経験者のためのspark

自己紹介

Page 3: 20160127三木会 RDB経験者のためのspark

玉川竜司です• 本職はセキュリティソフトの開発

• 一番使っているのはSQL Server

• SQLiteも大好きです

• db tech showcaseではMongoDBの

人としてデビュー

• 今年はSparkの人で登壇?

• オライリージャパンで翻訳してます

• FB: Ryuji Tamagawa

• Twitter : tamagawa_ryuji

Page 4: 20160127三木会 RDB経験者のためのspark

過去の翻訳

Page 5: 20160127三木会 RDB経験者のためのspark

2015年の翻訳

Page 6: 20160127三木会 RDB経験者のためのspark

2016年の予定

Page 7: 20160127三木会 RDB経験者のためのspark

本日の内容• HadoopエコシステムとSpark

• MapReduceとSpark

• Sparkの動作

• Sparkの今後

Page 8: 20160127三木会 RDB経験者のためのspark

HadoopエコシステムとSpark

Page 9: 20160127三木会 RDB経験者のためのspark

Hadoop 0.xの時代

HadoopRDB

OS

ファイルI/O

メモリバッファ

クエリ実行エンジン

SQL

ドライバ

OS

HDFS

MapReduce

• 分散処理の基盤だけがある状態

• HDFS / MapReduceによる耐障害性と分散処理の性能の保証

• プログラミングはめっちゃ大変

Page 10: 20160127三木会 RDB経験者のためのspark

Hadoop 1.xの時代

HadoopRDB

OS

ファイルI/O

メモリバッファ

クエリ実行エンジン

SQL

ドライバ

OS

HDFS

Hive e.t.c.

HBaseMapReduce

ドライバ

• 「上物」の整備が進む

• Hiveの登場で、SQLでのアクセスが可能に

• ランダムアクセスで読み書き可能なデータベースエンジンであるHBaseが登場

• その他、エコシステムの整備が進む

Page 11: 20160127三木会 RDB経験者のためのspark

Hadoop 2.xとSparkの登場

OS

HDFS

Hive e.t.c.

HBaseMapReduce

YARN

Spark(Spark Streaming, MLlib,

GraphX, Spark SQL)

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

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

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

RDB

OS

ファイルI/O

メモリバッファ

クエリ実行エンジン

SQL

ドライバ

MapReduceによらない

クエリ実行エンジンが増えてきた

Page 12: 20160127三木会 RDB経験者のためのspark

ターゲットの違い基本的な指向 I/Oの特性 集中 / 分散

RDB小さいレコードを細かく読み・書き・更新

比較的小さな領域をランダムアクセス

集中

Hadoop エコシステム

1回書いて何度も読む

比較的大きな領域をシーケンシャルアクセス

分散

• RDBもHadoopエコシステムも、それぞれの領域をカバーするような取り組みが進んでいますが、基本的な性格を理解しておくことは重要だと思います。

Page 13: 20160127三木会 RDB経験者のためのspark

MapReduceとSpark

Page 14: 20160127三木会 RDB経験者のためのspark

Sparkが注目される2つの理由

処理が高速

プログラミングが容易

Page 15: 20160127三木会 RDB経験者のためのspark

その他の特徴• Scale-inが容易(小規模な方向へのスケーラビリティ)

• インタラクティブシェルによる探索的コンピューティング

• 豊富なライブラリ(MLlib、GraphX、SparkStreaming・・・)

• ファイルI/OはHadoopのライブラリを利用できる

• HDFSやS3をファイルシステムとしてそのまま活用できる

Page 16: 20160127三木会 RDB経験者のためのspark

フレームワークの違い基本的な処理の単位 処理の対象 JVM クラスタ管理

MapReduce Map / Reduce ファイル フェーズごとに起動・終了 YARN

SparkRDD / DataFrameに対する操作

(高レベルなAPI)RDD 起動しっぱなし YARN / Mesos / ス

タンドアローン

Page 17: 20160127三木会 RDB経験者のためのspark

Sparkが高速な理由

map

JVM Invocation

I/0

HD

FS

reduce

JVM Invocation

I/0

map

JVM Invocation

I/0

reduce

JVM Invocation

I/0

f1(read data to RDD)

Executor(JVM)Invocation

HD

FS

I/O

f2

f3

f4(persist to storage)

f5(does shuffle) I/O

f6

f7

Mem

ory (RDD

s)

access

access

access

access I/O

access

access

MapReduce Spark

Page 18: 20160127三木会 RDB経験者のためのspark

MapReduceとSparkの速度

Spark

MapReduce

データ量

処理時間

注:イメージです

Page 19: 20160127三木会 RDB経験者のためのspark

Sparkの動作

Page 20: 20160127三木会 RDB経験者のためのspark

RDD(耐障害性分散データセット)

• 論理的には、プログラミング言語でいうところのコレクション

• 実体としては、RDBでのビューにキャッシュの機能を追加したもの、という感じ

• 「パーティション」に分割され、クラスタを構成するノード群にまたがって配置される

ノード

RDD-A Partition #1

RDD-B Partition #1

ノード

Partition #2

Partition #2

ノード

Partition #3

Partition #3

ノード

Partition #4

Partition #4

Page 21: 20160127三木会 RDB経験者のためのspark

RDDの処理• 論理的にはコレクション。物理的にはクラスタ内のノードに分散配置される

• RDDに対して「変換」をかけて、新たなRDDを生成する。データベースで言えば、ビューの定義にビューの定義を重ねているような感じ。

• RDDに対して「アクション」を行うと、RDDをさかのぼって計算が実行される。

# テキストを読んでRDDを生成rmRDD = sc.textfile(‘readme.md’)

#フィルタをかけて次のRDDを生spRDD = rmRDD.filter(…)

#もう1つフィルタ。sp10RDD = spRDD.filter(…)#この時点ではまだテキストファイルも読まれていない

#行数のカウント。この時点ですべての処理が走るcount = sp10RDD.count()

元のファイル

rmRDD

spRDD

sp10RDD

123

table

create view…

create view…

create view…

select count…

Page 22: 20160127三木会 RDB経験者のためのspark

RDDの処理(論理構造)# テキストを読んでRDDを生成rmRDD = sc.textfile(‘readme.md’)

#フィルタをかけて次のRDDを生成RDD_1 = rmRDD.filter(…)

#もう1つフィルタ。RDD_2 = RDD_1.filter(…)

#この時点ではまだテキストファイルも読まれていない

#キャッシュを指示RDD_2.persist()

#1つめの分岐RDD_2_a = RDD_2.filter(…)

#行数のカウント。この時点ですべての処理が走るcount = RDD_2_a.count() #RDD_2はここでキャッシュ

#2つめの分岐RDD_2_b = RDD_2.filter(…)

#行数のカウント。この時点ですべての処理が走るcount = RDD_2_b.count() #演算はRDD_2以降のみ

ファイル

rmRDD

RDD_1

RDD_2

RDD_2_a RDD_2_a

123 456

Page 23: 20160127三木会 RDB経験者のためのspark

RDDの処理(実行)driver Executor1 Executor2

# テキストを読んでRDDを生成rmRDD = sc.textfile(‘readme.md’)

#フィルタをかけて次のRDDを生成RDD_1 = rmRDD.filter(…) #フィルタ1

#もう1つフィルタ。RDD_2 = RDD_1.filter(…) #フィルタ2

#この時点ではまだテキストファイルも読まれていない

#キャッシュを指示RDD_2.persist()

#1つめの分岐RDD_2_a = RDD_2.filter(…) #フィルタ2a

#行数のカウント。この時点ですべての処理が走るcount = RDD_2_a.count() #RDD_2はここでキャッシュ

#2つめの分岐RDD_2_b = RDD_2.filter(…) #フィルタ2b

#行数のカウント。この時点ですべての処理が走るcount = RDD_2_b.count() #演算はRDD_2以降のみ

rmRDD登録

フィルタ1登録

フィルタ2登録

RDD_2のキャッシュ準備

フィルタ2a登録

rmRDDの読み取り、フィルタ1,2,2aの実行、RDD_2のキャッシュ

フィルタ2b登録

フィルタ2b実行

Page 24: 20160127三木会 RDB経験者のためのspark

シャッフルについて• RDDの変換は2種類に分類できる。シャッフルを伴うものと伴わないもの

• シャッフルを伴わないもの:変換前のパーティションと変換後のパーティションが一対一対応するもの。例えば単純なフィルタリング。

• シャッフルを伴うもの。変換前後でパーティション構成が変化するもの。例えば集計や結合処理。

Executor1

Partition #1

Partition #1’

Partition #A

Executor2

Partition #2

Partition2’

Partition #B

Executor3

Partition #3

Partition3’

Partition #C

Page 25: 20160127三木会 RDB経験者のためのspark

シャッフルについて• 並列処理を行う際のコスト構造が

RDBとは大きく異なる

• Sparkにおいては、シャッフルの際にはストレージI/Oが生ずるため、非常にコストが大きい

• プロセスをまたがるデータの転送はネットワークを経由するという点でもコストが大きい

• 耐障害性の観点からも差異がある

Executor1

Partition #1

Partition #1’

Partition #A

Executor2

Partition #2

Partition2’

Partition #B

Executor3

Partition #3

Partition3’

Partition #C

Page 26: 20160127三木会 RDB経験者のためのspark

DataFrame / Dataset(SchemaRDD)

• RDDはスキーマレス

• スキーマを適用することで、効率化とSQLでの処理をできるようにしたのがSchamaRDD(1.3)

• SchemaRDDをさらに発展させたのがDataFrame

• SQLはHiveに準拠。Select系のSQLは普通に書けるレベル

デモします

Page 27: 20160127三木会 RDB経験者のためのspark

Sparkの今後

Page 28: 20160127三木会 RDB経験者のためのspark

Project Tangsten

• RDBでいうクエリオプティマイザの強化プロジェクト

• バージョン1.5で登場

• まだまだ進行中

Page 29: 20160127三木会 RDB経験者のためのspark

今後も発展していきそう• 「MapReduceは徐々にSparkに置き換えられていくだろう」

• 機械学習の分野がドライバになっている(MLlib)。イテレーティブな処理においては、MapReduceよりも圧倒的に高速

• Sparkをデータ処理の基盤としておくと何かとつぶしがきく感

• SQLもいけるし、手続き型の言語(Java, Scala, Python)もいける。Rもいける

Page 30: 20160127三木会 RDB経験者のためのspark

質問タイムです!