SlideShare une entreprise Scribd logo
1  sur  43
Télécharger pour lire hors ligne
Data processing @Spotify
using Scio
Julien Tournay | Scala Matsuri 2019 󾓥
about:jto
− 1,5 years Spotifier (🇸🇪 Stockholm )
− Data engineer at #flatmap (Data Infrastructure)
Spotify 勤務は 1.5年
about:spotify
− Audio streaming subscription service
− 100M+ Subscribers
− 217M+ Monthly Active Users
− 50M+ Songs
− 3B+ Playlists
− 79 Markets
https://newsroom.spotify.com/company-info/
Spotify は 1億人のユーザを持つオーディオ系ストリーミン
グサービス
Data-processing
‒ Discover Weekly
‒ Release Radar
‒ Daily Mixes
‒ Your 2018 Wrapped
‒ Fan insights
‒ ...
scio: use cases
scioのユースケース。パーソナライズされた、毎週更新の
プレイリスト、最新曲、おすすめ曲の紹介など。
− Volume of data
− Number of datasets
− Number of data-engineers / data-scientists
scalability
データ量、データセット数、データエンジニア人数など多次
元でのスケーラビリティ
‒ Scheduling
‒ Orchestration
‒ Processing
(Batch & streaming)
challenges
‒ Testing
‒ Storage
‒ 💰 (runtime & storage)
目下の課題はスケジューリング、テスト、ストレージ、予算
など
‒ Scheduling
‒ Orchestration
‒ Lineage
‒ Permissions
‒ Processing (Batch & streaming)
‒ Encryption (GDPR)
‒ Monitoring
‒ Data quality
challenges
‒ Testing
‒ Latency
‒ Incident handling
‒ Storage
‒ Discovery
‒ Lifecycle
‒ Atomicity
‒ 💰💰💰 (runtime, storage, incidents, lateness,
skewness, productivity, ...)
暗号化 (GDPR 対応)、モニタリングなど課題とともに膨らむ
経費
DATA PROCESSING
is
HARD &
EXPENSIVE
データプロセッシングは難しい。そして高い。
☑ It works
☑ It works reliably
☐ It works reliably and efficiently
☐ It works reliably, efficiently and easily
data-processing @spotify
今は「確実に動く」段階、目指すのは「効率」と「簡単」
Scio
− A Scala API for data processing
− Based on Apache Beam
− Unified batch and streaming
− Open source (Apache v2.0)
− Runs on Dataflow, Spark, Flink, ...
val sc = ScioContext()
sc.textFile(sourcePath)
.flatMap { _
.split("s+")
.filter(_.nonEmpty)
}
.countByValue
.saveAsTextFile(target)
sc.close()
about:scio
https://github.com/spotify/scio
Beam に基づいたデータプロセッシング Scala API。バッチ
処理とストリーム処理の統合。
Scio
− Good documentation
− Predictability
− Performant
− Productivity
− Type safety
ドキュメントが豊富。予測性、実行性能、生産性が高い。型
安全。
− Scala for Data engineering
− Scala Center advisory board member
− Open-source :)
https://github.com/spotify/
Scala @spotify
弊社で Scala の取り組み。データエンジニアリング、Scala
Center、OSS など。
Scio @Spotify
− 350+ users
(Data engineers, Data Scientists, Backend engineers)
− 1000s unique production jobs
− Batch and streaming
350人以上の社内 Scio ユーザ、プロダクション環境に何
千ものjobがある。バッチもストリーミングも。
Efficiency: serialization
効率性: シリアライズ編
Scio 0.7.0
− Released Jan, 18
− New static Coders
− Redesigned BQ client
− Refactored IO
− Better modularity
− bugfixes
− etc.
Scio 0.7.0では、静的なCoderが追加され、BigQueryのク
ライアントを再設計、そしてIOをリファクタリングした。
Coders in 0.7
− Kryo to Typesafe coders
− Predictability
− Testability
− Performance
− Granularity
− Automatic derivation at compile time
− Fallback to Kryo
型安全なコーダーへと移行することで予測性を高めた。コ
ンパイル時に自動導出。
0.6
def map[U: Coder]
(f: T => U): SCollection[U]
Safer, simpler, compile time black magic
0.6 vs 0.7
def map[U: ClassTag]
(f: T => U): SCollection[U]
Unsafe, Kryo based, runtime black magic
0.7
(mostly)
automated migration
using scalafix
0.6 は Kryo が実行時黒魔術。0.7 はより安全なコンパイル
時黒魔術。
Results
結果
Anonymisation job
‒ Encrypt all personal data
‒ Each user has unique keys
‒ Runs hourly
https://labs.spotify.com/2018/09/18/scalable-user-privacy/
匿名化のジョブ。個人情報を暗号化する。
Anonymisation optimisation
‒ Replace Kryo by custom coders for Avro’s GenericRecord
‒ Kryo was really inefficient
‒ Only possible in Scio > 0.7
‒ Scio now has a compile time warning for GenericRecord
匿名化の最適化。非効率的だったKryoを、カスタムコー
ダーへ置換した。コンパイル時の警告も出る。これらも0.7
の成果。
Anonymisation job cost (▼ 60% largest event)
匿名化のジョブのコスト
Anonymisation job runtime (in minutes - largest event)
匿名化のジョブの実行時間
(YMMV but)
DO
NOT
OVERLOOK
SERIALIZATION
シリアライズを見落とさないように
Efficiency: joins
効率性: join 編
joins
− Really common use case
− 😎 Large x Small
− 😅 Large x Medium
− 😱 Large x Large(-ish) → 💰💰💰💰💰💰 (Shuffle)
よくある話: 巨大なもの同士をjoinするとコストがかかる。
SMB join
− Sort Merge Bucket join
− Store data bucketed (sharding by key)
− Sort the content of each bucket by key
ソフトマージバケット join
Bucketing
29
id
B (number of buckets) = 3
8
7
6
0
3
1
7
2
6
1
4
3
3
4
5
id
0
3
3
3
6
6
id
1
1
4
4
7
7
id
2
5
8
Joining
0,6,6 3,6
4,7 1
2 2,5,8
id
L
6
4
0
2
7
6
L Merge join
R
id
8
3
1
6
2
5
R
SMB join
− Shuffle once, join everywhere → Amortized cost
− PR in Apache Beam (https://github.com/apache/beam/pull/8486)
Goal: handle gotchas automatically:
• Store and check bucketing metadata
• handle skewness
• support joining datasets with a different number of buckets
− Bonus: Storage is more efficient (better compression)
一度のシャッフルで何度も join できる。Beam に PR 中。
Ease of use: BeamSQL
簡易性: BeamSQL編
Scio 0.8
− SchemaCoder
(structure aware coders)
− BeamSQL
− Automatic type conversion
− Better coder support for java classes
− Simpler job completion API (remove futures / ExecutionContext)...
− Bugfixes
− etc.
Scio 0.8 では SchemaCoder、BeamSQL などを追加
BeamSQL
val coll: SCollection[User] = ???
val r: SCollection[(String, List[String])] =
sql"""
SELECT username, emails
FROM ${coll}
""".as[(String, List[String])]
‒ Is the query valid SQL ?
‒ Are `username` and `emails`
valid fields in `User` ?
‒ What’s the type of `username` ?
‒ What’s the type of `emails` ?
‒ Can the result be converted to the
expected type ?
クエリは妥当な SQL だろうか? String は何を指すのか?
BeamSQL
val r =
- sql"""
+ tsql"""
SELECT username, emails
FROM ${coll}
""".as[(String, List[String])]
BeamSQL
tsql"""
SELECT username, emails
FOM ${coll}
""".as[(String, List[String])]
BeamSQL
tsql"""
SELECT username, emails
FOM ${coll}
""".as[(String, List[String])]
ParseException:
Encountered "PCOLLECTION" at line 4, column 8.
Was expecting one of:
<EOF>
"ORDER" …
"OFFSET" …
"FETCH" …
"FROM" …
"," …
Query:
Select username, emails fom PCOLLECTION
タイポはコンパイル時に検知
BeamSQL
val coll: SCollection[User] = ???
tsql"""
SELECT name, emails
FROM ${coll}
""".as[(String, List[String])]
SqlValidatorException:
Column 'name' not found in any table
PCOLLECTION schema:
┌─────────────────────────────┬──────────┬──────────┐
│ NAME │ TYPE │ NULLABLE │
├─────────────────────────────┼──────────┼──────────┤
│ username │ STRING │ NO │
│ emails │ STRING[] │ NO │
└─────────────────────────────┴──────────┴──────────┘
Expected schema:
┌─────────────────────────────┬──────────┬──────────┐
│ NAME │ TYPE │ NULLABLE │
├─────────────────────────────┼──────────┼──────────┤
│ _1 │ STRING │ NO │
│ _2 │ STRING[] │ NO │
└─────────────────────────────┴──────────┴──────────┘
「name カラムはテーブルにありません」
BeamSQL
tsql"""
SELECT username, emails
FROM ${coll}
""".as[(Int, List[String])]
BeamSQL
tsql"""
SELECT username, emails
FROM ${coll}
""".as[(Int, List[String])]
Inferred schema for query is not compatible
with the expected schema.
Query result schema (inferred):
┌─────────────────────────────┬──────────┬──────────┐
│ NAME │ TYPE │ NULLABLE │
├─────────────────────────────┼──────────┼──────────┤
│ username │ STRING │ NO │
│ emails │ STRING[] │ NO │
└─────────────────────────────┴──────────┴──────────┘
Expected schema:
┌─────────────────────────────┬──────────┬──────────┐
│ NAME │ TYPE │ NULLABLE │
├─────────────────────────────┼──────────┼──────────┤
│ _1 │ INT32 │ NO │
│ _2 │ STRING[] │ NO │
└─────────────────────────────┴──────────┴──────────┘
「推論されたスキーマは期待されるスキーマとの互換性が
ありません」
Automatic type conversion
val in: SCollection[A] = ???
val r: SCollection[B] =
in.to[B](To.safe)
− Convert between classes
without boilerplate
− Support Java beans
− Support Scala case classes
− Support Avro SpecificRecord
自動の型変換。ボイラープレートなしで、Java beansや、
Scalaのcase class、AvroのSpecificRecordについて対
応。
Type conversion
val in: SCollection[A] = ???
val r: SCollection[B] =
in.to[B](To.safe)
Schemas are not compatible:
A schema:
┌─────────────────────────────┬──────────┬──────────┐
│ NAME │ TYPE │ NULLABLE │
├─────────────────────────────┼──────────┼──────────┤
│ i │ INT32 │ NO │
│ s │ STRING │ NO │
│ e │ ROW │ NO │
│ e.xs │ INT64[] │ NO │
│ e.q │ STRING │ NO │
└─────────────────────────────┴──────────┴──────────┘
B schema:
┌─────────────────────────────┬──────────┬──────────┐
│ NAME │ TYPE │ NULLABLE │
├─────────────────────────────┼──────────┼──────────┤
│ q │ STRING │ NO │
│ xs │ INT64[] │ NO │
└─────────────────────────────┴──────────┴──────────┘
型変換
github.com/spotify/scio
spotify.github.io/scio
@skaalf
gitter.im/spotify/scio
spotifyjobs.com

Contenu connexe

Tendances

入門機械学習1,2章
入門機械学習1,2章入門機械学習1,2章
入門機械学習1,2章Kazufumi Ohkawa
 
Cython ことはじめ
Cython ことはじめCython ことはじめ
Cython ことはじめgion_XY
 
自然言語処理10本ノックで比較する java と kotlin
自然言語処理10本ノックで比較する java と kotlin自然言語処理10本ノックで比較する java と kotlin
自然言語処理10本ノックで比較する java と kotlinTakumi Kadowaki
 
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」de:code 2017
 
brainfuckを吐く自作言語bf-reusable
brainfuckを吐く自作言語bf-reusablebrainfuckを吐く自作言語bf-reusable
brainfuckを吐く自作言語bf-reusableroodni
 
2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群
2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群
2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群Yu Ishikawa
 
データサイエンティスト必見!M-1グランプリ
データサイエンティスト必見!M-1グランプリデータサイエンティスト必見!M-1グランプリ
データサイエンティスト必見!M-1グランプリSatoshi Kitajima
 
R6 classes
R6 classesR6 classes
R6 classeshiroki84
 
20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_TokyoKohei KaiGai
 
LastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめようLastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめようShinsuke Sugaya
 
【20190319 KotlinLT】Kotlinで雑に作るLispインタープリタ
【20190319 KotlinLT】Kotlinで雑に作るLispインタープリタ【20190319 KotlinLT】Kotlinで雑に作るLispインタープリタ
【20190319 KotlinLT】Kotlinで雑に作るLispインタープリタ虎の穴 開発室
 
R入門(dplyrでデータ加工)-TokyoR42
R入門(dplyrでデータ加工)-TokyoR42R入門(dplyrでデータ加工)-TokyoR42
R入門(dplyrでデータ加工)-TokyoR42Atsushi Hayakawa
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cythonfuzzysphere
 
実動するIot&hadoopから学ぶ会_資料
実動するIot&hadoopから学ぶ会_資料実動するIot&hadoopから学ぶ会_資料
実動するIot&hadoopから学ぶ会_資料FwardNetwork
 
200319 eash python_shareslide_functions
200319 eash python_shareslide_functions200319 eash python_shareslide_functions
200319 eash python_shareslide_functionsHiroki Katayama
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるShintaro Fukushima
 
Common LispでGPGPU
Common LispでGPGPUCommon LispでGPGPU
Common LispでGPGPUgos-k
 
TensorFlow White Paperを読む
TensorFlow White Paperを読むTensorFlow White Paperを読む
TensorFlow White Paperを読むYuta Kashino
 

Tendances (20)

入門機械学習1,2章
入門機械学習1,2章入門機械学習1,2章
入門機械学習1,2章
 
入門機械学習6章
入門機械学習6章入門機械学習6章
入門機械学習6章
 
Cython ことはじめ
Cython ことはじめCython ことはじめ
Cython ことはじめ
 
自然言語処理10本ノックで比較する java と kotlin
自然言語処理10本ノックで比較する java と kotlin自然言語処理10本ノックで比較する java と kotlin
自然言語処理10本ノックで比較する java と kotlin
 
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
 
brainfuckを吐く自作言語bf-reusable
brainfuckを吐く自作言語bf-reusablebrainfuckを吐く自作言語bf-reusable
brainfuckを吐く自作言語bf-reusable
 
2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群
2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群
2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群
 
データサイエンティスト必見!M-1グランプリ
データサイエンティスト必見!M-1グランプリデータサイエンティスト必見!M-1グランプリ
データサイエンティスト必見!M-1グランプリ
 
R6 classes
R6 classesR6 classes
R6 classes
 
2012 ce116 crowbar_snct_shirai
2012 ce116 crowbar_snct_shirai2012 ce116 crowbar_snct_shirai
2012 ce116 crowbar_snct_shirai
 
20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo
 
LastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめようLastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめよう
 
【20190319 KotlinLT】Kotlinで雑に作るLispインタープリタ
【20190319 KotlinLT】Kotlinで雑に作るLispインタープリタ【20190319 KotlinLT】Kotlinで雑に作るLispインタープリタ
【20190319 KotlinLT】Kotlinで雑に作るLispインタープリタ
 
R入門(dplyrでデータ加工)-TokyoR42
R入門(dplyrでデータ加工)-TokyoR42R入門(dplyrでデータ加工)-TokyoR42
R入門(dplyrでデータ加工)-TokyoR42
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
 
実動するIot&hadoopから学ぶ会_資料
実動するIot&hadoopから学ぶ会_資料実動するIot&hadoopから学ぶ会_資料
実動するIot&hadoopから学ぶ会_資料
 
200319 eash python_shareslide_functions
200319 eash python_shareslide_functions200319 eash python_shareslide_functions
200319 eash python_shareslide_functions
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
 
Common LispでGPGPU
Common LispでGPGPUCommon LispでGPGPU
Common LispでGPGPU
 
TensorFlow White Paperを読む
TensorFlow White Paperを読むTensorFlow White Paperを読む
TensorFlow White Paperを読む
 

Similaire à Data processing at spotify using scio

AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?Masamitsu Maehara
 
debugging server with strace
debugging server with stracedebugging server with strace
debugging server with straceYoshinari Takaoka
 
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化gree_tech
 
Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringMakoto Ohnami
 
Couchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 OmoidenoteCouchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 Omoidenotekitsugi
 
Spring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractSpring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractTakeshi Ogawa
 
SORACOM Technology Camp 2018 アドバンストラック4 | スモールスタートの次の一手は?成長できるIoTシステムの実例と回避した...
SORACOM Technology Camp 2018 アドバンストラック4 | スモールスタートの次の一手は?成長できるIoTシステムの実例と回避した...SORACOM Technology Camp 2018 アドバンストラック4 | スモールスタートの次の一手は?成長できるIoTシステムの実例と回避した...
SORACOM Technology Camp 2018 アドバンストラック4 | スモールスタートの次の一手は?成長できるIoTシステムの実例と回避した...SORACOM,INC
 
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要 第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要 Daiyu Hatakeyama
 
AWS Black Belt Techシリーズ AWS CloudTrail & CloudWatch Logs
AWS Black Belt Techシリーズ AWS CloudTrail & CloudWatch LogsAWS Black Belt Techシリーズ AWS CloudTrail & CloudWatch Logs
AWS Black Belt Techシリーズ AWS CloudTrail & CloudWatch LogsAmazon Web Services Japan
 
Telemetryについて
TelemetryについてTelemetryについて
Telemetryについてtetsusat
 
The overview of Server-ide Bulk Loader
 The overview of Server-ide Bulk Loader The overview of Server-ide Bulk Loader
The overview of Server-ide Bulk LoaderTreasure Data, Inc.
 
Introduction new features in Spark 3.0
Introduction new features in Spark 3.0Introduction new features in Spark 3.0
Introduction new features in Spark 3.0Kazuaki Ishizaki
 
JAWS DAYS 2018 | IoT時代におけるデバイスのファームウェアとクラウドのいい関係
JAWS DAYS 2018 | IoT時代におけるデバイスのファームウェアとクラウドのいい関係JAWS DAYS 2018 | IoT時代におけるデバイスのファームウェアとクラウドのいい関係
JAWS DAYS 2018 | IoT時代におけるデバイスのファームウェアとクラウドのいい関係SORACOM,INC
 
ネットワーク自動化の課題 - グラフデータベースによる解決
ネットワーク自動化の課題 - グラフデータベースによる解決ネットワーク自動化の課題 - グラフデータベースによる解決
ネットワーク自動化の課題 - グラフデータベースによる解決ApstraJapan
 
Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Hiroshi Ito
 
インメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギインメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギMasaki Yamakawa
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成弘毅 露崎
 
SparkやBigQueryなどを用いた モバイルゲーム分析環境
SparkやBigQueryなどを用いたモバイルゲーム分析環境SparkやBigQueryなどを用いたモバイルゲーム分析環境
SparkやBigQueryなどを用いた モバイルゲーム分析環境yuichi_komatsu
 

Similaire à Data processing at spotify using scio (20)

AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
 
debugging server with strace
debugging server with stracedebugging server with strace
debugging server with strace
 
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
 
Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo Spring
 
Couchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 OmoidenoteCouchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 Omoidenote
 
Spring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractSpring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contract
 
SORACOM Technology Camp 2018 アドバンストラック4 | スモールスタートの次の一手は?成長できるIoTシステムの実例と回避した...
SORACOM Technology Camp 2018 アドバンストラック4 | スモールスタートの次の一手は?成長できるIoTシステムの実例と回避した...SORACOM Technology Camp 2018 アドバンストラック4 | スモールスタートの次の一手は?成長できるIoTシステムの実例と回避した...
SORACOM Technology Camp 2018 アドバンストラック4 | スモールスタートの次の一手は?成長できるIoTシステムの実例と回避した...
 
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要 第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
 
AWS Black Belt Techシリーズ AWS CloudTrail & CloudWatch Logs
AWS Black Belt Techシリーズ AWS CloudTrail & CloudWatch LogsAWS Black Belt Techシリーズ AWS CloudTrail & CloudWatch Logs
AWS Black Belt Techシリーズ AWS CloudTrail & CloudWatch Logs
 
Telemetryについて
TelemetryについてTelemetryについて
Telemetryについて
 
The overview of Server-ide Bulk Loader
 The overview of Server-ide Bulk Loader The overview of Server-ide Bulk Loader
The overview of Server-ide Bulk Loader
 
Introduction new features in Spark 3.0
Introduction new features in Spark 3.0Introduction new features in Spark 3.0
Introduction new features in Spark 3.0
 
JAWS DAYS 2018 | IoT時代におけるデバイスのファームウェアとクラウドのいい関係
JAWS DAYS 2018 | IoT時代におけるデバイスのファームウェアとクラウドのいい関係JAWS DAYS 2018 | IoT時代におけるデバイスのファームウェアとクラウドのいい関係
JAWS DAYS 2018 | IoT時代におけるデバイスのファームウェアとクラウドのいい関係
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
ネットワーク自動化の課題 - グラフデータベースによる解決
ネットワーク自動化の課題 - グラフデータベースによる解決ネットワーク自動化の課題 - グラフデータベースによる解決
ネットワーク自動化の課題 - グラフデータベースによる解決
 
Aerospike deep dive LDTs
Aerospike deep dive LDTsAerospike deep dive LDTs
Aerospike deep dive LDTs
 
Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks
 
インメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギインメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギ
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
 
SparkやBigQueryなどを用いた モバイルゲーム分析環境
SparkやBigQueryなどを用いたモバイルゲーム分析環境SparkやBigQueryなどを用いたモバイルゲーム分析環境
SparkやBigQueryなどを用いた モバイルゲーム分析環境
 

Data processing at spotify using scio

  • 1. Data processing @Spotify using Scio Julien Tournay | Scala Matsuri 2019 󾓥
  • 2. about:jto − 1,5 years Spotifier (🇸🇪 Stockholm ) − Data engineer at #flatmap (Data Infrastructure) Spotify 勤務は 1.5年
  • 3. about:spotify − Audio streaming subscription service − 100M+ Subscribers − 217M+ Monthly Active Users − 50M+ Songs − 3B+ Playlists − 79 Markets https://newsroom.spotify.com/company-info/ Spotify は 1億人のユーザを持つオーディオ系ストリーミン グサービス
  • 5. ‒ Discover Weekly ‒ Release Radar ‒ Daily Mixes ‒ Your 2018 Wrapped ‒ Fan insights ‒ ... scio: use cases scioのユースケース。パーソナライズされた、毎週更新の プレイリスト、最新曲、おすすめ曲の紹介など。
  • 6. − Volume of data − Number of datasets − Number of data-engineers / data-scientists scalability データ量、データセット数、データエンジニア人数など多次 元でのスケーラビリティ
  • 7. ‒ Scheduling ‒ Orchestration ‒ Processing (Batch & streaming) challenges ‒ Testing ‒ Storage ‒ 💰 (runtime & storage) 目下の課題はスケジューリング、テスト、ストレージ、予算 など
  • 8. ‒ Scheduling ‒ Orchestration ‒ Lineage ‒ Permissions ‒ Processing (Batch & streaming) ‒ Encryption (GDPR) ‒ Monitoring ‒ Data quality challenges ‒ Testing ‒ Latency ‒ Incident handling ‒ Storage ‒ Discovery ‒ Lifecycle ‒ Atomicity ‒ 💰💰💰 (runtime, storage, incidents, lateness, skewness, productivity, ...) 暗号化 (GDPR 対応)、モニタリングなど課題とともに膨らむ 経費
  • 10. ☑ It works ☑ It works reliably ☐ It works reliably and efficiently ☐ It works reliably, efficiently and easily data-processing @spotify 今は「確実に動く」段階、目指すのは「効率」と「簡単」
  • 11. Scio
  • 12. − A Scala API for data processing − Based on Apache Beam − Unified batch and streaming − Open source (Apache v2.0) − Runs on Dataflow, Spark, Flink, ... val sc = ScioContext() sc.textFile(sourcePath) .flatMap { _ .split("s+") .filter(_.nonEmpty) } .countByValue .saveAsTextFile(target) sc.close() about:scio https://github.com/spotify/scio Beam に基づいたデータプロセッシング Scala API。バッチ 処理とストリーム処理の統合。
  • 13. Scio − Good documentation − Predictability − Performant − Productivity − Type safety ドキュメントが豊富。予測性、実行性能、生産性が高い。型 安全。
  • 14. − Scala for Data engineering − Scala Center advisory board member − Open-source :) https://github.com/spotify/ Scala @spotify 弊社で Scala の取り組み。データエンジニアリング、Scala Center、OSS など。
  • 15. Scio @Spotify − 350+ users (Data engineers, Data Scientists, Backend engineers) − 1000s unique production jobs − Batch and streaming 350人以上の社内 Scio ユーザ、プロダクション環境に何 千ものjobがある。バッチもストリーミングも。
  • 17. Scio 0.7.0 − Released Jan, 18 − New static Coders − Redesigned BQ client − Refactored IO − Better modularity − bugfixes − etc. Scio 0.7.0では、静的なCoderが追加され、BigQueryのク ライアントを再設計、そしてIOをリファクタリングした。
  • 18. Coders in 0.7 − Kryo to Typesafe coders − Predictability − Testability − Performance − Granularity − Automatic derivation at compile time − Fallback to Kryo 型安全なコーダーへと移行することで予測性を高めた。コ ンパイル時に自動導出。
  • 19. 0.6 def map[U: Coder] (f: T => U): SCollection[U] Safer, simpler, compile time black magic 0.6 vs 0.7 def map[U: ClassTag] (f: T => U): SCollection[U] Unsafe, Kryo based, runtime black magic 0.7 (mostly) automated migration using scalafix 0.6 は Kryo が実行時黒魔術。0.7 はより安全なコンパイル 時黒魔術。
  • 21. Anonymisation job ‒ Encrypt all personal data ‒ Each user has unique keys ‒ Runs hourly https://labs.spotify.com/2018/09/18/scalable-user-privacy/ 匿名化のジョブ。個人情報を暗号化する。
  • 22. Anonymisation optimisation ‒ Replace Kryo by custom coders for Avro’s GenericRecord ‒ Kryo was really inefficient ‒ Only possible in Scio > 0.7 ‒ Scio now has a compile time warning for GenericRecord 匿名化の最適化。非効率的だったKryoを、カスタムコー ダーへ置換した。コンパイル時の警告も出る。これらも0.7 の成果。
  • 23. Anonymisation job cost (▼ 60% largest event) 匿名化のジョブのコスト
  • 24. Anonymisation job runtime (in minutes - largest event) 匿名化のジョブの実行時間
  • 27. joins − Really common use case − 😎 Large x Small − 😅 Large x Medium − 😱 Large x Large(-ish) → 💰💰💰💰💰💰 (Shuffle) よくある話: 巨大なもの同士をjoinするとコストがかかる。
  • 28. SMB join − Sort Merge Bucket join − Store data bucketed (sharding by key) − Sort the content of each bucket by key ソフトマージバケット join
  • 29. Bucketing 29 id B (number of buckets) = 3 8 7 6 0 3 1 7 2 6 1 4 3 3 4 5 id 0 3 3 3 6 6 id 1 1 4 4 7 7 id 2 5 8
  • 30. Joining 0,6,6 3,6 4,7 1 2 2,5,8 id L 6 4 0 2 7 6 L Merge join R id 8 3 1 6 2 5 R
  • 31. SMB join − Shuffle once, join everywhere → Amortized cost − PR in Apache Beam (https://github.com/apache/beam/pull/8486) Goal: handle gotchas automatically: • Store and check bucketing metadata • handle skewness • support joining datasets with a different number of buckets − Bonus: Storage is more efficient (better compression) 一度のシャッフルで何度も join できる。Beam に PR 中。
  • 32. Ease of use: BeamSQL 簡易性: BeamSQL編
  • 33. Scio 0.8 − SchemaCoder (structure aware coders) − BeamSQL − Automatic type conversion − Better coder support for java classes − Simpler job completion API (remove futures / ExecutionContext)... − Bugfixes − etc. Scio 0.8 では SchemaCoder、BeamSQL などを追加
  • 34. BeamSQL val coll: SCollection[User] = ??? val r: SCollection[(String, List[String])] = sql""" SELECT username, emails FROM ${coll} """.as[(String, List[String])] ‒ Is the query valid SQL ? ‒ Are `username` and `emails` valid fields in `User` ? ‒ What’s the type of `username` ? ‒ What’s the type of `emails` ? ‒ Can the result be converted to the expected type ? クエリは妥当な SQL だろうか? String は何を指すのか?
  • 35. BeamSQL val r = - sql""" + tsql""" SELECT username, emails FROM ${coll} """.as[(String, List[String])]
  • 36. BeamSQL tsql""" SELECT username, emails FOM ${coll} """.as[(String, List[String])]
  • 37. BeamSQL tsql""" SELECT username, emails FOM ${coll} """.as[(String, List[String])] ParseException: Encountered "PCOLLECTION" at line 4, column 8. Was expecting one of: <EOF> "ORDER" … "OFFSET" … "FETCH" … "FROM" … "," … Query: Select username, emails fom PCOLLECTION タイポはコンパイル時に検知
  • 38. BeamSQL val coll: SCollection[User] = ??? tsql""" SELECT name, emails FROM ${coll} """.as[(String, List[String])] SqlValidatorException: Column 'name' not found in any table PCOLLECTION schema: ┌─────────────────────────────┬──────────┬──────────┐ │ NAME │ TYPE │ NULLABLE │ ├─────────────────────────────┼──────────┼──────────┤ │ username │ STRING │ NO │ │ emails │ STRING[] │ NO │ └─────────────────────────────┴──────────┴──────────┘ Expected schema: ┌─────────────────────────────┬──────────┬──────────┐ │ NAME │ TYPE │ NULLABLE │ ├─────────────────────────────┼──────────┼──────────┤ │ _1 │ STRING │ NO │ │ _2 │ STRING[] │ NO │ └─────────────────────────────┴──────────┴──────────┘ 「name カラムはテーブルにありません」
  • 39. BeamSQL tsql""" SELECT username, emails FROM ${coll} """.as[(Int, List[String])]
  • 40. BeamSQL tsql""" SELECT username, emails FROM ${coll} """.as[(Int, List[String])] Inferred schema for query is not compatible with the expected schema. Query result schema (inferred): ┌─────────────────────────────┬──────────┬──────────┐ │ NAME │ TYPE │ NULLABLE │ ├─────────────────────────────┼──────────┼──────────┤ │ username │ STRING │ NO │ │ emails │ STRING[] │ NO │ └─────────────────────────────┴──────────┴──────────┘ Expected schema: ┌─────────────────────────────┬──────────┬──────────┐ │ NAME │ TYPE │ NULLABLE │ ├─────────────────────────────┼──────────┼──────────┤ │ _1 │ INT32 │ NO │ │ _2 │ STRING[] │ NO │ └─────────────────────────────┴──────────┴──────────┘ 「推論されたスキーマは期待されるスキーマとの互換性が ありません」
  • 41. Automatic type conversion val in: SCollection[A] = ??? val r: SCollection[B] = in.to[B](To.safe) − Convert between classes without boilerplate − Support Java beans − Support Scala case classes − Support Avro SpecificRecord 自動の型変換。ボイラープレートなしで、Java beansや、 Scalaのcase class、AvroのSpecificRecordについて対 応。
  • 42. Type conversion val in: SCollection[A] = ??? val r: SCollection[B] = in.to[B](To.safe) Schemas are not compatible: A schema: ┌─────────────────────────────┬──────────┬──────────┐ │ NAME │ TYPE │ NULLABLE │ ├─────────────────────────────┼──────────┼──────────┤ │ i │ INT32 │ NO │ │ s │ STRING │ NO │ │ e │ ROW │ NO │ │ e.xs │ INT64[] │ NO │ │ e.q │ STRING │ NO │ └─────────────────────────────┴──────────┴──────────┘ B schema: ┌─────────────────────────────┬──────────┬──────────┐ │ NAME │ TYPE │ NULLABLE │ ├─────────────────────────────┼──────────┼──────────┤ │ q │ STRING │ NO │ │ xs │ INT64[] │ NO │ └─────────────────────────────┴──────────┴──────────┘ 型変換