SlideShare una empresa de Scribd logo
1 de 59
Descargar para leer sin conexión
バッチを Akka Stream で再実装したら100倍速くなった話
Copyright © 2016 TIS Inc. All rights reserved.
根来 和輝
TIS 株式会社 生産技術R&D室
‣
‣ 

‣ 

Copyright © 2016 TIS Inc. All rights reserved.
今日話すこと
Akka Streams を使ってバッチの処理速度を100倍にした事例
Copyright © 2016 TIS Inc. All rights reserved.
パフォーマンスに問題を抱えた本番運用されているバッチ処理
Copyright © 2016 TIS Inc. All rights reserved.
バッチ処理
毎日夜間に、その日の取引情報をCSVファイルに書き出す


Copyright © 2016 TIS Inc. All rights reserved.
アーキテクチャ
Active
Record
Copyright © 2016 TIS Inc. All rights reserved.
DBから一括で時刻順の取引情報を取得し、一行ずつ処理し、
一行ずつファイルへ書き出す


Copyright © 2016 TIS Inc. All rights reserved.
問題は何か
処理が終わるのが遅い。応急処置でなんとか凌いでいる。
Copyright © 2016 TIS Inc. All rights reserved.
遅い原因はなにか?
Copyright © 2016 TIS Inc. All rights reserved.
調査環境として仮想マシンを構築。
本番環境と同じリソースを割り当て。
‣
‣
‣
‣
Copyright © 2016 TIS Inc. All rights reserved.
調査のシナリオでは100万件のデータを用意
Copyright © 2016 TIS Inc. All rights reserved.
結果、処理速度は毎秒4件
Copyright © 2016 TIS Inc. All rights reserved.
100万件処理するのに3日
Copyright © 2016 TIS Inc. All rights reserved.
ボトルネックはどこか?
スワップ領域が大量に消費
0
1000
2000
3000
4000
5000
6000
0:00 0:20 0:40 1:00 1:20 1:40 2:00 2:20 2:40
- - Memory - - Swap
‣
Copyright © 2016 TIS Inc. All rights reserved.
処理のボトルネック


Copyright © 2016 TIS Inc. All rights reserved.
メモリを潤沢に用意すれば問題ないのか?
Copyright © 2016 TIS Inc. All rights reserved.
‣
‣
‣
‣
Copyright © 2016 TIS Inc. All rights reserved.
調査のシナリオでは100万件のデータを処理
Copyright © 2016 TIS Inc. All rights reserved.
結果、処理速度は毎秒100件
Copyright © 2016 TIS Inc. All rights reserved.
100万件処理するのに3時間
Copyright © 2016 TIS Inc. All rights reserved.
ボトルネックは解消されたのか?

メモリ不足は解消
0
1000
2000
3000
4000
5000
6000
7000
0:00 0:05 0:10 0:15 0:20 0:25
- - Memory - - Swap
‣
Copyright © 2016 TIS Inc. All rights reserved.
使われているCPUコアは1つのみ
‣
Copyright © 2016 TIS Inc. All rights reserved.
第2のボトルネック


Copyright © 2016 TIS Inc. All rights reserved.
少しずつデータを取得。処理を並列で行う。

ただし、取得したデータの並びは維持。
‣
Copyright © 2016 TIS Inc. All rights reserved.
DBから時刻順のデータを少しずつ取得。並列で処理。

取得した順序で書き出し。


Copyright © 2016 TIS Inc. All rights reserved.
ここに Akka Streams が使える


Copyright © 2016 TIS Inc. All rights reserved.
Akka Streams は Reactive Streams の Akka を使った実装
‣
‣ 

Copyright © 2016 TIS Inc. All rights reserved.
アーキテクチャ
Streams
Copyright © 2016 TIS Inc. All rights reserved.
Reactive Streams の Publisher を通じてデータを

ストリーミングするAPIを提供
Streams
Copyright © 2016 TIS Inc. All rights reserved.
同期的な入出力と並列処理
Streams


Copyright © 2016 TIS Inc. All rights reserved.
既存のバッチと同じ結果が得られるように実装。
キャッシュも既存のものと同様に実装。
Copyright © 2016 TIS Inc. All rights reserved.
実装の構成要素
‣ ‣
‣
Copyright © 2016 TIS Inc. All rights reserved.
実装

※ 説明用に簡略化したコード
Copyright © 2016 TIS Inc. All rights reserved.
入力、処理、出力、実行
Copyright © 2016 TIS Inc. All rights reserved.
Copyright © 2016 TIS Inc. All rights reserved.
Copyright © 2016 TIS Inc. All rights reserved.
この部分の処理は並列に実行される
Copyright © 2016 TIS Inc. All rights reserved.
Copyright © 2016 TIS Inc. All rights reserved.
Copyright © 2016 TIS Inc. All rights reserved.
調査環境として仮想マシンを構築。
本番環境と同じリソースを割り当て。
‣
‣
‣
‣
Copyright © 2016 TIS Inc. All rights reserved.
調査のシナリオでは100万件のデータを処理
Copyright © 2016 TIS Inc. All rights reserved.
結果、処理速度は毎秒1,180件
Copyright © 2016 TIS Inc. All rights reserved.
100万件処理するのに14分
Copyright © 2016 TIS Inc. All rights reserved.
ボトルネックは解消されたのか?

メモリ不足は発生していない
0
200
400
600
800
1000
1200
1400
1600
1800
2000
0:00 0:00 0:01 0:02 0:03 0:04 0:05 0:05 0:06 0:07 0:08 0:09
- - Memory - - Swap
‣
Copyright © 2016 TIS Inc. All rights reserved.
CPUの全コアが使われている
‣
Copyright © 2016 TIS Inc. All rights reserved.
メモリがボトルネックになっていた場合と比較








Copyright © 2016 TIS Inc. All rights reserved.
CPUがボトルネックになっていた場合と比較








Copyright © 2016 TIS Inc. All rights reserved.








バッチを Akka Streams で再実装したら295倍速くなった話
Copyright © 2016 TIS Inc. All rights reserved.
ハードウェアを変更せずに大幅な性能改善できた。
experimental なので本番環境への適用は注意。


Copyright © 2016 TIS Inc. All rights reserved.
Copyright © 2016 TIS Inc. All rights reserved.
ストリームなのにメモリ不足。Slick の streaming API を使っ
てデータを取得しているのに一括で取得されてしまう。



Copyright © 2016 TIS Inc. All rights reserved.
MySQL固有の問題

解決方法: enableStreamingResults() を設定


Copyright © 2016 TIS Inc. All rights reserved.
非同期キャッシュ - spray-caching

非同期ノンブロッキングでスレッドセーフなキャッシュ
Copyright © 2016 TIS Inc. All rights reserved.
Copyright © 2016 TIS Inc. All rights reserved.
Copyright © 2016 TIS Inc. All rights reserved.
2016年2月2日 7:00PM-10:30PM、場所は西新宿
Copyright © 2016 TIS Inc. All rights reserved.
2016年2月2日 7:00PM-10:30PM、場所は西新宿
THANK YOU

Más contenido relacionado

La actualidad más candente

グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発Takafumi ONAKA
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
アジャイル開発を支えるアーキテクチャ設計とは
アジャイル開発を支えるアーキテクチャ設計とはアジャイル開発を支えるアーキテクチャ設計とは
アジャイル開発を支えるアーキテクチャ設計とはYusuke Suzuki
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーToru Makabe
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでRyo Nakamaru
 
アーキテクチャの進化から学ぶ、プラットフォームエンジニアリングへのアプローチ
アーキテクチャの進化から学ぶ、プラットフォームエンジニアリングへのアプローチアーキテクチャの進化から学ぶ、プラットフォームエンジニアリングへのアプローチ
アーキテクチャの進化から学ぶ、プラットフォームエンジニアリングへのアプローチYusuke Suzuki
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」Masahito Zembutsu
 
Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集
Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集
Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集matsu_chara
 
ログの書き方がチームの生産性を爆上げする話
ログの書き方がチームの生産性を爆上げする話ログの書き方がチームの生産性を爆上げする話
ログの書き方がチームの生産性を爆上げする話Tsuyoshi Ushio
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いた実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いたAkihiro Kuwano
 
リクルートのWebサービスを支える「RAFTEL」
リクルートのWebサービスを支える「RAFTEL」リクルートのWebサービスを支える「RAFTEL」
リクルートのWebサービスを支える「RAFTEL」Recruit Technologies
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?Takahiro YAMADA
 
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web ServiceアプリケーションAngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーションssuser070fa9
 
Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)
Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)
Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)Keigo Suda
 
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話MicroAd, Inc.(Engineer)
 
マイクロサービスに至る歴史とこれから - XP祭り2021
マイクロサービスに至る歴史とこれから - XP祭り2021マイクロサービスに至る歴史とこれから - XP祭り2021
マイクロサービスに至る歴史とこれから - XP祭り2021Yusuke Suzuki
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いota42y
 

La actualidad más candente (20)

グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
アジャイル開発を支えるアーキテクチャ設計とは
アジャイル開発を支えるアーキテクチャ設計とはアジャイル開発を支えるアーキテクチャ設計とは
アジャイル開発を支えるアーキテクチャ設計とは
 
Akka actorを何故使うのか?
Akka actorを何故使うのか?Akka actorを何故使うのか?
Akka actorを何故使うのか?
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
 
アーキテクチャの進化から学ぶ、プラットフォームエンジニアリングへのアプローチ
アーキテクチャの進化から学ぶ、プラットフォームエンジニアリングへのアプローチアーキテクチャの進化から学ぶ、プラットフォームエンジニアリングへのアプローチ
アーキテクチャの進化から学ぶ、プラットフォームエンジニアリングへのアプローチ
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集
Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集
Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集
 
ログの書き方がチームの生産性を爆上げする話
ログの書き方がチームの生産性を爆上げする話ログの書き方がチームの生産性を爆上げする話
ログの書き方がチームの生産性を爆上げする話
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いた実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いた
 
リクルートのWebサービスを支える「RAFTEL」
リクルートのWebサービスを支える「RAFTEL」リクルートのWebサービスを支える「RAFTEL」
リクルートのWebサービスを支える「RAFTEL」
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?
 
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web ServiceアプリケーションAngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
 
Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)
Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)
Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)
 
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話
 
マイクロサービスに至る歴史とこれから - XP祭り2021
マイクロサービスに至る歴史とこれから - XP祭り2021マイクロサービスに至る歴史とこれから - XP祭り2021
マイクロサービスに至る歴史とこれから - XP祭り2021
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
 

Destacado

How Scala code is expressed in the JVM
How Scala code is expressed in the JVMHow Scala code is expressed in the JVM
How Scala code is expressed in the JVMKoichi Sakata
 
From Microliths To Microsystems
From Microliths To MicrosystemsFrom Microliths To Microsystems
From Microliths To MicrosystemsJonas Bonér
 
Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems
Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven SystemsGo Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems
Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven SystemsJonas Bonér
 
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Jonas Bonér
 
Reactive Microsystems: The Evolution of Microservices at Scale
Reactive Microsystems: The Evolution of Microservices at ScaleReactive Microsystems: The Evolution of Microservices at Scale
Reactive Microsystems: The Evolution of Microservices at ScaleJonas Bonér
 
How Events Are Reshaping Modern Systems
How Events Are Reshaping Modern SystemsHow Events Are Reshaping Modern Systems
How Events Are Reshaping Modern SystemsJonas Bonér
 
Scala Refactoring for Fun and Profit (Japanese subtitles)
Scala Refactoring for Fun and Profit (Japanese subtitles)Scala Refactoring for Fun and Profit (Japanese subtitles)
Scala Refactoring for Fun and Profit (Japanese subtitles)Tomer Gabel
 
Contributing to Scala OSS from East Asia #ScalaMatsuri
 Contributing to Scala OSS from East Asia #ScalaMatsuri Contributing to Scala OSS from East Asia #ScalaMatsuri
Contributing to Scala OSS from East Asia #ScalaMatsuriKazuhiro Sera
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriYuta Okamoto
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)x1 ichi
 
Building Reactive Systems with Akka (in Java 8 or Scala)
Building Reactive Systems with Akka (in Java 8 or Scala)Building Reactive Systems with Akka (in Java 8 or Scala)
Building Reactive Systems with Akka (in Java 8 or Scala)Jonas Bonér
 

Destacado (13)

How Scala code is expressed in the JVM
How Scala code is expressed in the JVMHow Scala code is expressed in the JVM
How Scala code is expressed in the JVM
 
From Microliths To Microsystems
From Microliths To MicrosystemsFrom Microliths To Microsystems
From Microliths To Microsystems
 
Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems
Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven SystemsGo Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems
Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems
 
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)
 
Reactive Microsystems: The Evolution of Microservices at Scale
Reactive Microsystems: The Evolution of Microservices at ScaleReactive Microsystems: The Evolution of Microservices at Scale
Reactive Microsystems: The Evolution of Microservices at Scale
 
How Events Are Reshaping Modern Systems
How Events Are Reshaping Modern SystemsHow Events Are Reshaping Modern Systems
How Events Are Reshaping Modern Systems
 
Scala Refactoring for Fun and Profit (Japanese subtitles)
Scala Refactoring for Fun and Profit (Japanese subtitles)Scala Refactoring for Fun and Profit (Japanese subtitles)
Scala Refactoring for Fun and Profit (Japanese subtitles)
 
Contributing to Scala OSS from East Asia #ScalaMatsuri
 Contributing to Scala OSS from East Asia #ScalaMatsuri Contributing to Scala OSS from East Asia #ScalaMatsuri
Contributing to Scala OSS from East Asia #ScalaMatsuri
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuri
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)
 
Zen of Akka
Zen of AkkaZen of Akka
Zen of Akka
 
Building Reactive Systems with Akka (in Java 8 or Scala)
Building Reactive Systems with Akka (in Java 8 or Scala)Building Reactive Systems with Akka (in Java 8 or Scala)
Building Reactive Systems with Akka (in Java 8 or Scala)
 

Similar a バッチを Akka Streams で再実装したら100倍速くなった話 #ScalaMatsuri

Mc web controllerご紹介資料2017.03.13
Mc web controllerご紹介資料2017.03.13Mc web controllerご紹介資料2017.03.13
Mc web controllerご紹介資料2017.03.13MPN Japan
 
AWSオンリーで実現するIoTクラウド基盤
AWSオンリーで実現するIoTクラウド基盤AWSオンリーで実現するIoTクラウド基盤
AWSオンリーで実現するIoTクラウド基盤Godai Nakamura
 
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれからYahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれからYahoo!デベロッパーネットワーク
 
[db tech showcase Tokyo 2017] C25: 世界最速のAnalytic DBがHadoopとタッグを組んだ! ~スケールアウト検...
[db tech showcase Tokyo 2017] C25: 世界最速のAnalytic DBがHadoopとタッグを組んだ! ~スケールアウト検...[db tech showcase Tokyo 2017] C25: 世界最速のAnalytic DBがHadoopとタッグを組んだ! ~スケールアウト検...
[db tech showcase Tokyo 2017] C25: 世界最速のAnalytic DBがHadoopとタッグを組んだ! ~スケールアウト検...Insight Technology, Inc.
 
Diskless Compute Nodeを使ったImmutable OpenStack
Diskless Compute Nodeを使ったImmutable OpenStackDiskless Compute Nodeを使ったImmutable OpenStack
Diskless Compute Nodeを使ったImmutable OpenStackYuki Yamashita
 
Akkaを使った スケーラブルなLINE BOT
Akkaを使ったスケーラブルなLINE BOT Akkaを使ったスケーラブルなLINE BOT
Akkaを使った スケーラブルなLINE BOT Takashi Sugimoto
 
Yahoo! JAPANが実践するOpenStackと大規模環境でのコンテナ利用 #devsumi
Yahoo! JAPANが実践するOpenStackと大規模環境でのコンテナ利用 #devsumiYahoo! JAPANが実践するOpenStackと大規模環境でのコンテナ利用 #devsumi
Yahoo! JAPANが実践するOpenStackと大規模環境でのコンテナ利用 #devsumiYahoo!デベロッパーネットワーク
 
JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介
JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介
JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介Daisuke Ikeda
 
20180220 AWS Black Belt Online Seminar - Amazon Container Services
20180220 AWS Black Belt Online Seminar - Amazon Container Services20180220 AWS Black Belt Online Seminar - Amazon Container Services
20180220 AWS Black Belt Online Seminar - Amazon Container ServicesAmazon Web Services Japan
 
バッチソリューションAzarea cluster 2016
バッチソリューションAzarea cluster 2016バッチソリューションAzarea cluster 2016
バッチソリューションAzarea cluster 2016AzareaCluster
 
HANAのハナシの基本のき
HANAのハナシの基本のきHANAのハナシの基本のき
HANAのハナシの基本のきKoji Shinkubo
 
[db analytics showcase Sapporo 2017] B27:世界最速のAnalytic DBはHadoopの夢を見るか by 株式会...
[db analytics showcase Sapporo 2017] B27:世界最速のAnalytic DBはHadoopの夢を見るか by 株式会...[db analytics showcase Sapporo 2017] B27:世界最速のAnalytic DBはHadoopの夢を見るか by 株式会...
[db analytics showcase Sapporo 2017] B27:世界最速のAnalytic DBはHadoopの夢を見るか by 株式会...Insight Technology, Inc.
 
Contrail deploy by Juju/MAAS
Contrail deploy by Juju/MAASContrail deploy by Juju/MAAS
Contrail deploy by Juju/MAASIkuo Kumagai
 
弊社IoT事例とAlexaSkil開発レシピ
弊社IoT事例とAlexaSkil開発レシピ弊社IoT事例とAlexaSkil開発レシピ
弊社IoT事例とAlexaSkil開発レシピTakashi Kozu
 
Docker国内外本番環境サービス事例のご紹介
Docker国内外本番環境サービス事例のご紹介Docker国内外本番環境サービス事例のご紹介
Docker国内外本番環境サービス事例のご紹介ThinkIT_impress
 
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザエクイニクス・ジャパン
 
クラウドファースト時代の最適なシステム配置について
クラウドファースト時代の最適なシステム配置についてクラウドファースト時代の最適なシステム配置について
クラウドファースト時代の最適なシステム配置についてエクイニクス・ジャパン
 

Similar a バッチを Akka Streams で再実装したら100倍速くなった話 #ScalaMatsuri (20)

Mc web controllerご紹介資料2017.03.13
Mc web controllerご紹介資料2017.03.13Mc web controllerご紹介資料2017.03.13
Mc web controllerご紹介資料2017.03.13
 
AWSオンリーで実現するIoTクラウド基盤
AWSオンリーで実現するIoTクラウド基盤AWSオンリーで実現するIoTクラウド基盤
AWSオンリーで実現するIoTクラウド基盤
 
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれからYahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
 
[db tech showcase Tokyo 2017] C25: 世界最速のAnalytic DBがHadoopとタッグを組んだ! ~スケールアウト検...
[db tech showcase Tokyo 2017] C25: 世界最速のAnalytic DBがHadoopとタッグを組んだ! ~スケールアウト検...[db tech showcase Tokyo 2017] C25: 世界最速のAnalytic DBがHadoopとタッグを組んだ! ~スケールアウト検...
[db tech showcase Tokyo 2017] C25: 世界最速のAnalytic DBがHadoopとタッグを組んだ! ~スケールアウト検...
 
Diskless Compute Nodeを使ったImmutable OpenStack
Diskless Compute Nodeを使ったImmutable OpenStackDiskless Compute Nodeを使ったImmutable OpenStack
Diskless Compute Nodeを使ったImmutable OpenStack
 
Akkaを使った スケーラブルなLINE BOT
Akkaを使ったスケーラブルなLINE BOT Akkaを使ったスケーラブルなLINE BOT
Akkaを使った スケーラブルなLINE BOT
 
Yahoo! JAPANが実践するOpenStackと大規模環境でのコンテナ利用 #devsumi
Yahoo! JAPANが実践するOpenStackと大規模環境でのコンテナ利用 #devsumiYahoo! JAPANが実践するOpenStackと大規模環境でのコンテナ利用 #devsumi
Yahoo! JAPANが実践するOpenStackと大規模環境でのコンテナ利用 #devsumi
 
JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介
JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介
JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介
 
20180220 AWS Black Belt Online Seminar - Amazon Container Services
20180220 AWS Black Belt Online Seminar - Amazon Container Services20180220 AWS Black Belt Online Seminar - Amazon Container Services
20180220 AWS Black Belt Online Seminar - Amazon Container Services
 
Python / R で使うSAS Viya
Python / R で使うSAS ViyaPython / R で使うSAS Viya
Python / R で使うSAS Viya
 
バッチソリューションAzarea cluster 2016
バッチソリューションAzarea cluster 2016バッチソリューションAzarea cluster 2016
バッチソリューションAzarea cluster 2016
 
HANAのハナシの基本のき
HANAのハナシの基本のきHANAのハナシの基本のき
HANAのハナシの基本のき
 
[db analytics showcase Sapporo 2017] B27:世界最速のAnalytic DBはHadoopの夢を見るか by 株式会...
[db analytics showcase Sapporo 2017] B27:世界最速のAnalytic DBはHadoopの夢を見るか by 株式会...[db analytics showcase Sapporo 2017] B27:世界最速のAnalytic DBはHadoopの夢を見るか by 株式会...
[db analytics showcase Sapporo 2017] B27:世界最速のAnalytic DBはHadoopの夢を見るか by 株式会...
 
Contrail deploy by Juju/MAAS
Contrail deploy by Juju/MAASContrail deploy by Juju/MAAS
Contrail deploy by Juju/MAAS
 
弊社IoT事例とAlexaSkil開発レシピ
弊社IoT事例とAlexaSkil開発レシピ弊社IoT事例とAlexaSkil開発レシピ
弊社IoT事例とAlexaSkil開発レシピ
 
Docker国内外本番環境サービス事例のご紹介
Docker国内外本番環境サービス事例のご紹介Docker国内外本番環境サービス事例のご紹介
Docker国内外本番環境サービス事例のご紹介
 
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
 
クラウドファースト時代の最適なシステム配置について
クラウドファースト時代の最適なシステム配置についてクラウドファースト時代の最適なシステム配置について
クラウドファースト時代の最適なシステム配置について
 
Enterpriseapi20160210
Enterpriseapi20160210Enterpriseapi20160210
Enterpriseapi20160210
 
OpenStack環境の継続的インテグレーション
OpenStack環境の継続的インテグレーションOpenStack環境の継続的インテグレーション
OpenStack環境の継続的インテグレーション
 

Último

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Último (7)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

バッチを Akka Streams で再実装したら100倍速くなった話 #ScalaMatsuri

  • 1. バッチを Akka Stream で再実装したら100倍速くなった話
  • 2. Copyright © 2016 TIS Inc. All rights reserved. 根来 和輝 TIS 株式会社 生産技術R&D室 ‣ ‣ 
 ‣ 

  • 3. Copyright © 2016 TIS Inc. All rights reserved. 今日話すこと Akka Streams を使ってバッチの処理速度を100倍にした事例
  • 4. Copyright © 2016 TIS Inc. All rights reserved. パフォーマンスに問題を抱えた本番運用されているバッチ処理
  • 5. Copyright © 2016 TIS Inc. All rights reserved. バッチ処理 毎日夜間に、その日の取引情報をCSVファイルに書き出す 

  • 6. Copyright © 2016 TIS Inc. All rights reserved. アーキテクチャ Active Record
  • 7. Copyright © 2016 TIS Inc. All rights reserved. DBから一括で時刻順の取引情報を取得し、一行ずつ処理し、 一行ずつファイルへ書き出す 

  • 8. Copyright © 2016 TIS Inc. All rights reserved. 問題は何か 処理が終わるのが遅い。応急処置でなんとか凌いでいる。
  • 9. Copyright © 2016 TIS Inc. All rights reserved. 遅い原因はなにか?
  • 10. Copyright © 2016 TIS Inc. All rights reserved. 調査環境として仮想マシンを構築。 本番環境と同じリソースを割り当て。 ‣ ‣ ‣ ‣
  • 11. Copyright © 2016 TIS Inc. All rights reserved. 調査のシナリオでは100万件のデータを用意
  • 12. Copyright © 2016 TIS Inc. All rights reserved. 結果、処理速度は毎秒4件
  • 13. Copyright © 2016 TIS Inc. All rights reserved. 100万件処理するのに3日
  • 14. Copyright © 2016 TIS Inc. All rights reserved. ボトルネックはどこか? スワップ領域が大量に消費 0 1000 2000 3000 4000 5000 6000 0:00 0:20 0:40 1:00 1:20 1:40 2:00 2:20 2:40 - - Memory - - Swap ‣
  • 15. Copyright © 2016 TIS Inc. All rights reserved. 処理のボトルネック 

  • 16. Copyright © 2016 TIS Inc. All rights reserved. メモリを潤沢に用意すれば問題ないのか?
  • 17. Copyright © 2016 TIS Inc. All rights reserved. ‣ ‣ ‣ ‣
  • 18. Copyright © 2016 TIS Inc. All rights reserved. 調査のシナリオでは100万件のデータを処理
  • 19. Copyright © 2016 TIS Inc. All rights reserved. 結果、処理速度は毎秒100件
  • 20. Copyright © 2016 TIS Inc. All rights reserved. 100万件処理するのに3時間
  • 21. Copyright © 2016 TIS Inc. All rights reserved. ボトルネックは解消されたのか?
 メモリ不足は解消 0 1000 2000 3000 4000 5000 6000 7000 0:00 0:05 0:10 0:15 0:20 0:25 - - Memory - - Swap ‣
  • 22. Copyright © 2016 TIS Inc. All rights reserved. 使われているCPUコアは1つのみ ‣
  • 23. Copyright © 2016 TIS Inc. All rights reserved. 第2のボトルネック 

  • 24. Copyright © 2016 TIS Inc. All rights reserved. 少しずつデータを取得。処理を並列で行う。
 ただし、取得したデータの並びは維持。 ‣
  • 25. Copyright © 2016 TIS Inc. All rights reserved. DBから時刻順のデータを少しずつ取得。並列で処理。
 取得した順序で書き出し。 

  • 26. Copyright © 2016 TIS Inc. All rights reserved. ここに Akka Streams が使える 

  • 27. Copyright © 2016 TIS Inc. All rights reserved. Akka Streams は Reactive Streams の Akka を使った実装 ‣ ‣ 

  • 28. Copyright © 2016 TIS Inc. All rights reserved. アーキテクチャ Streams
  • 29. Copyright © 2016 TIS Inc. All rights reserved. Reactive Streams の Publisher を通じてデータを
 ストリーミングするAPIを提供 Streams
  • 30. Copyright © 2016 TIS Inc. All rights reserved. 同期的な入出力と並列処理 Streams 

  • 31. Copyright © 2016 TIS Inc. All rights reserved. 既存のバッチと同じ結果が得られるように実装。 キャッシュも既存のものと同様に実装。
  • 32. Copyright © 2016 TIS Inc. All rights reserved. 実装の構成要素 ‣ ‣ ‣
  • 33. Copyright © 2016 TIS Inc. All rights reserved. 実装
 ※ 説明用に簡略化したコード
  • 34. Copyright © 2016 TIS Inc. All rights reserved. 入力、処理、出力、実行
  • 35. Copyright © 2016 TIS Inc. All rights reserved.
  • 36. Copyright © 2016 TIS Inc. All rights reserved.
  • 37. Copyright © 2016 TIS Inc. All rights reserved. この部分の処理は並列に実行される
  • 38. Copyright © 2016 TIS Inc. All rights reserved.
  • 39. Copyright © 2016 TIS Inc. All rights reserved.
  • 40. Copyright © 2016 TIS Inc. All rights reserved. 調査環境として仮想マシンを構築。 本番環境と同じリソースを割り当て。 ‣ ‣ ‣ ‣
  • 41. Copyright © 2016 TIS Inc. All rights reserved. 調査のシナリオでは100万件のデータを処理
  • 42. Copyright © 2016 TIS Inc. All rights reserved. 結果、処理速度は毎秒1,180件
  • 43. Copyright © 2016 TIS Inc. All rights reserved. 100万件処理するのに14分
  • 44. Copyright © 2016 TIS Inc. All rights reserved. ボトルネックは解消されたのか?
 メモリ不足は発生していない 0 200 400 600 800 1000 1200 1400 1600 1800 2000 0:00 0:00 0:01 0:02 0:03 0:04 0:05 0:05 0:06 0:07 0:08 0:09 - - Memory - - Swap ‣
  • 45. Copyright © 2016 TIS Inc. All rights reserved. CPUの全コアが使われている ‣
  • 46. Copyright © 2016 TIS Inc. All rights reserved. メモリがボトルネックになっていた場合と比較 
 
 
 

  • 47. Copyright © 2016 TIS Inc. All rights reserved. CPUがボトルネックになっていた場合と比較 
 
 
 

  • 48. Copyright © 2016 TIS Inc. All rights reserved. 
 
 
 

  • 49. バッチを Akka Streams で再実装したら295倍速くなった話
  • 50. Copyright © 2016 TIS Inc. All rights reserved. ハードウェアを変更せずに大幅な性能改善できた。 experimental なので本番環境への適用は注意。 

  • 51. Copyright © 2016 TIS Inc. All rights reserved.
  • 52. Copyright © 2016 TIS Inc. All rights reserved. ストリームなのにメモリ不足。Slick の streaming API を使っ てデータを取得しているのに一括で取得されてしまう。
 

  • 53. Copyright © 2016 TIS Inc. All rights reserved. MySQL固有の問題
 解決方法: enableStreamingResults() を設定 

  • 54. Copyright © 2016 TIS Inc. All rights reserved. 非同期キャッシュ - spray-caching
 非同期ノンブロッキングでスレッドセーフなキャッシュ
  • 55. Copyright © 2016 TIS Inc. All rights reserved.
  • 56. Copyright © 2016 TIS Inc. All rights reserved.
  • 57. Copyright © 2016 TIS Inc. All rights reserved. 2016年2月2日 7:00PM-10:30PM、場所は西新宿
  • 58. Copyright © 2016 TIS Inc. All rights reserved. 2016年2月2日 7:00PM-10:30PM、場所は西新宿