Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
go-athenaの大量データ取得を速くした方法
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
muroon
April 19, 2021
Programming
380
1
Share
go-athenaの大量データ取得を速くした方法
muroon
April 19, 2021
More Decks by muroon
See All by muroon
UZOUにおけるAerospike
muroon
0
290
GCにおけるパフォーマンス改善
muroon
0
890
Goの静的解析を使用してAPI Doc Linterをつくる
muroon
0
75
Cloude Spannerの主キーの設計
muroon
0
55
Other Decks in Programming
See All in Programming
リセットCSSを1行消したらアクセシビリティが向上した話
pvcresin
4
520
「なんか〇〇ライブラリで脆弱性あるみたいなんだけど。。。」から始める脆弱性対応 / First Steps in Vulnerability Response
mackey0225
2
130
AI時代だからこそ「Bloc」を採用する価値があるのかもしれない
takuroabe
0
190
書籍「ユーザーストーリーマッピング」が私のバイブル
asumikam
4
490
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
1
170
ローカルLLMでどこまでコードが書けるか / How much code can be written on a local LLM
kishida
2
370
Firefoxにコントリビューションして得られた学び
ken7253
2
160
GoogleCloudとterraform完全に理解した
terisuke
1
200
RailsTokyo 2026#4: AI様があれば、 Hotwireの弱点は消えるか?
naofumi
3
380
HTML-Aware ERB: The Path to Reactive Rendering @ RubyKaigi 2026, Hakodate, Japan
marcoroth
0
720
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
390
密結合なバックエンドから TypeScript のコードを生成する
kemuridama
0
200
Featured
See All Featured
Claude Code のすすめ
schroneko
67
220k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
370
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
1
54
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
560
Building the Perfect Custom Keyboard
takai
2
760
Building AI with AI
inesmontani
PRO
1
1k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
530
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
We Are The Robots
honzajavorek
0
230
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
440
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
Transcript
go-athenaの⼤量データ取得 を速くした⽅法
⾃⼰紹介 muroon https://twitter.com/muroon01 https://github.com/muroon Speeeという会社で広告配信システムを開発 Go歴は3年くらい
go-athenaとは database/sqlパッケージのAthenaのdriver import ( "database/sql" _ "github.com/speee/go-athena" ) func main()
{ db, _ := sql.Open("athena", "db=default&output_location=s3://results") rows, _ := db.Query("SELECT url, code from cloudfront") for rows.Next() { var url string var code int rows.Scan(&url, &code) } }
AWS Athenaとは AWS Athenaはサーバレスな分析サービスで、S3に保存・蓄積し たデータに対してSQLクエリにてデータ取得を⾏えるサービスで す。 • S3にデータを保存 • SQL検索
特徴 • APIを介してSQL実⾏ • SQLの結果をCSVダウンロードすることも可能 • CTASテーブルを使って圧縮形式でデータを取得する⽅法もあ る • GZIP • SNAPPY(Parquet)
go-athenaの⻑所 database/sqlパッケージを使⽤することにより、Goの開発者に とって開発しやすい データ取得がより簡単にできる • AWS Go SDK(https://docs.aws.amazon.com/sdk-for- go/api/service/athena/)を使⽤した場合 •
aws-sdk-goのAPI仕様を別途理解 • 接続確⽴、SQL実⾏、結果取得それぞれAPIアクセスが必要
go-athenaの問題点 APIアクセスしかできないこと • 取得件数が約1000件を超えるとrows.Next()の内部で複数ネッ トワークIOが⾛る rows, _ := db.Query("SELECT url,
code from cloudfront") for rows.Next() { var url string var code int rows.Scan(&url, &code) } ① ② ① ② 約1000件を超えると複数回取得する。O(n)
CSV, GZIP DLモードを作成 Resultモードというものを設けてCSVダウンロード、GZIPダウン ロードを可能にする • APIモード(default) • DLモード •
GZIPモード O(1)のネットワークアクセス ② ② 圧縮データダウンロード DLモード GZIPモード ①
各モードのパフォーマンス • 少量の件数ではDLモード、APIモードが有効 • ⼤量の件数ではGZIP DLモードが⾮常に有効
Resultモードの使⽤⽅法 Open時に設定 # API Mode db, err := sql.Open(“Athena”,”db=xxx&…”) #
DL Mode db, err := sql.Open(“Athena”,”db=xxx&…&result_mode=dl") # GZIP DL Mode db, err := sql.Open("athena","db=xxx&…&result_mode=gzip") SQL毎に設定 # API Mode ctx = SetAPIMode(ctx) # DL Mode ctx = SetDLMode(ctx) # GZIP DL Mode ctx = SetGzipDLMode(ctx)
URL https://github.com/speee/go-athena • fork元(segmentio/go-athena)のOrganizationは 2年近くメンテ ナンスされてないよう… • メンテする予定がないならリポジトリのTransferを検討しても らえないかを交渉中
ご清聴ありがとうございました