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
muroon
April 19, 2021
Programming
400
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
go-athenaの大量データ取得を速くした方法
muroon
April 19, 2021
More Decks by muroon
See All by muroon
UZOUにおけるAerospike
muroon
0
300
GCにおけるパフォーマンス改善
muroon
0
910
Goの静的解析を使用してAPI Doc Linterをつくる
muroon
0
76
Cloude Spannerの主キーの設計
muroon
0
64
Other Decks in Programming
See All in Programming
「人を評価する AI」の設計と実装
ryoyanara
0
190
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
150
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
100
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
150
OpenSpecのproposalにbrainstormingを持たせてみた
tigertora7571
1
220
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
180
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.6k
the container ship “Apple Silicon”@WWDC26 Recap -Japan-\(region).swift
shingangan
0
120
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
550
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
0
130
AI Nativeにデータを扱うための組織・基盤のこれまでとこれから
kirimaru
0
110
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
430
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Become a Pro
speakerdeck
PRO
31
6.2k
Tell your own story through comics
letsgokoyo
1
1k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
790
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
590
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
450
Art, The Web, and Tiny UX
lynnandtonic
304
22k
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を検討しても らえないかを交渉中
ご清聴ありがとうございました