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
こんな感じでデータパイプライン作ってます 2019年春
Search
Yuku TAKAHASHI
April 16, 2019
Technology
4.5k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
こんな感じでデータパイプライン作ってます 2019年春
Yuku TAKAHASHI
April 16, 2019
More Decks by Yuku TAKAHASHI
See All by Yuku TAKAHASHI
入門書には載ってない Git & GitHub Tips
yuku
88
16k
Other Decks in Technology
See All in Technology
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
580
UIパーツの設計を「型」から読み解く 〜TSKaigiのセッションから得た学び〜
yud0uhu
0
100
水を運ぶ人としてのリーダーシップ
izumii19
4
1k
秘密度ラベル初心者が第1歩でつまづかないための「設計・運用」ポイント
seafay
PRO
1
500
2026-06-23 知らないままで大丈夫?開発品質・効率向上が期待できるIBM Bob便利機能6選
yutanonaka
0
130
自分が詳しくない領域でAIを使う #プロヒス2026
konifar
20
7.8k
スタートアップにAmazon EKSは早すぎる? マルチプロダクト戦略を加速する Platform Engineeringの実践 / Is Amazon EKS Too Soon for Startups? Practical Platform Engineering to Accelerate a Multi-Product Strategy
elmodev09
1
1.9k
4人目のSREはAgent
tanimuyk
0
250
螺旋型キャリアの生存戦略 / kinoko-conf2026
rakus_dev
1
1.2k
AIは、人間らしい仕事の夢を見るか?─ AI時代のtoB/toEプロダクトを再設計する
techtekt
PRO
0
160
そこにあるから地図ができる~位置を示す"モノ"を愉しむ~ - Interface 2026年6月号GPS特集オフ会 / interface_202606_GPS_offline
sakaik
1
100
AI時代のコスト管理を考えよう〜明日から使える実践AWSノウハウ~
yoshimi0227
0
930
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Facilitating Awesome Meetings
lara
57
7k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
610
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
210
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
210
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
240
Music & Morning Musume
bryan
47
7.2k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
310
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
470
Transcript
͜Μͳײ͡ͰσʔλύΠϓϥΠϯ࡞ͬͯ·͢ य़ !ZVLV@U %BUB1JQFMJOF$BTVBM5BML
∁ڮါٱ UXJUUFSDPNZVLV@U HJUIVCDPNZVLV RJJUBDPNZVLV@U 4PGUXBSF&OHJOFFS!'-:8)&&- '-:8)&&-ͰϨίϝϯυΤϯδϯͱ ͦͷͨΊͷύΠϓϥΠϯΛ։ൃ͍ͯ͠·͢ɻ ݄ΑΓݱ৬ɻ
ࠓͷ w σʔλύΠϓϥΠϯͬͯͦͦͳΜ͚ͩͬ w ϲ݄ؒύΠϓϥΠϯΛ࡞͖ͬͯͯͷॴײ w υΩϡϝϯτʹࡌͬͯͳ͍$MPVE$PNQPTFS5JQT
SOLUTION DATA DATA PIPELINE
w ༷ʑͳྺ࢙తܦҢͰग़དྷ্͕ͬͨ ෳࡶͰஅยԽͨ͠σʔλ w ϩά͕͋ΔΑ͏ͳͳ͍Α͏ͳ w ෆ҆ఆͳετϨʔδ DATA DATA PIPELINE
w ͍ͬ͢͝ਓೳ͕৭ʑͳΛ ͍͍ײ͡ʹղܾͯ͘͠ΕΔͭ SOLUTION DATA PIPELINE
$0--&$5 .07&4503& &91-03&53"/4'03. "((3&("5&-"#&- -&"3/015*.*;& "*%&&1-&"3/*/( IUUQTIBDLFSOPPODPNUIFBJIJFSBSDIZPGOFFETGGDD 5)&%"5"4$*&/$& )*&3"3$):0'/&&%4 ਏ͍
ָ͍͠
CLIENT SOLUTION w ϨίϝϯυγεςϜ w ྲྀ࠷దԽ w ݕࡧΤϯδϯ w ࠂ৴γεςϜ
w ͳͲ w ෦ʹΔେྔͷσʔλΛ׆༻ ͍ͨ͠ w ΞΠσΞΛ࣮ݱͰ͖Δਓࡐ͕͍ ͳ͍
'-:8)&&-㱠σʔλੳ4BB4 w σʔλΛूΊΔͱ͜Ζ͔ΒιϦϡʔγϣϯΛ࡞Δͱ͜Ζ·Ͱ w ΫϥΠΞϯτͷ"84ΞΧϯτ($1ϓϩδΣΫτʹιϑτΣΞΛల։͍ͯ͠ Δɻ w ٻΊΔػೳ͕ͦ͜ʹ͋Δͱ͔͍ͬͯͯɺ֎෦ʹσʔλΛग़͢͜ͱ͕Ͱ͖ͳ͍اۀ ۀछ͕ଘࡏ͢ΔɻʢओʹͰ͔͍ͬاۀʣ w
ϚϧνΫϥυڥԼͰ͍͔ʹιϑτΣΞࢿ࢈Λங͖ɺύΠϓϥΠϯͰܨ͍Ͱ͍͔͕͘ ࠓޙͷେ͖ͳٕज़తͳνϟϨϯδͷҰͭɻ
ϚϧνΫϥυύΠϓϥΠϯʂʂʂ
ϚϧνΫϥυύΠϓϥΠϯʂʂʂ γΣϧεΫϦϓτ͔Βͷ٫
γΣϧεΫϦϓτʹΑΔύΠϓϥΠϯ w ΈΜͳੲγΣϧεΫϦϓτͩͬͨ w DSPOͰఆظ࣮ߦ͞ΕΔγΣϧεΫϦϓτ͔Β࣮ߦ͞ΕΔ1ZUIPOεΫϦϓτ܈ w ਏ͞ w ෳࡶԽ͍ͯ͘͠ύΠϓϥΠϯʹରԠ͖͠Εͳ͍ w
͍ͭͲͷλεΫ͕ࣦഊͨ͠ͷ͔͔Βͳ͍ w ࣦഊͨ͠λεΫTTIͯ͠࠶࣮ߦ
CLIENT DATA ϨίϝϯυύΠϓϥΠϯWʢγΣϧεΫϦϓτʣ JOINED DATA RECOMMENDER SYSTEM
CLIENT DATA DATA LAKE DATA WAREHOUSE DATA MART DATA SCIENTISTS
ϨίϝϯυύΠϓϥΠϯWʢ$MPVE$PNQPTFSʣ RECOMMENDER SYSTEM
جຊํ w σʔλج൫ͷྨͱਐԽతσʔλϞσϦϯά w %"5"-",&ˠ%"5"8"3&)064&ˠ%"5"."35 w σʔλ#JH2VFSZʹੵ͠ɺۃྗ42-Λ͏ɻ42-Ͱ͍͠ͱ͜Ζ͚ͩ$MPVE %BUBQSPDʢ4QBSLʣΛ࣮ͬͯ͢Δɻ w ϫʔΫϑϩʔ$MPVE$PNQPTFSʢ"JSqPXʣͰཧ͢Δɻ
#JH2VFSZͷ̏֊ w %"5"-",& w ΫϥΠΞϯτ͔Βఏڙ͞ΕΔੜσʔλΛੵ͢Δ w %"5"8"3&)064& w அยԽͨ͠σʔλΛ෮ݩɾඇਖ਼نԽɺ໋໊نଇʹҰ؏ੑΛͨͤΔɺ/6--Λഉআͯ͠ར༻͠ ͘͢͢ΔɺͳͲ
w ΫϥΠΞϯτͷσʔλੳνʔϜʹఏڙ͢Δ͜ͱ w %"5"."35 w $MPVE%BUBMBCͳͲͷ#*πʔϧ͔Βࢀর͢Δ w ఏڙ͍ͯ͠ΔϨίϝϯυγεςϜͷޮՌଌఆͱ͔
γΣϧεΫϦϓτஔ͖͑ਐΊͯΈͯ w "JSqPX͕ͲΜͳʹਏͯ͘ੲΛࢥ͍ग़ͤؤுΕΔ w 8FC6*͕͍͖ͭͯͯخ͍͠ w ؆୯ʹ࠶࣮ߦͰ͖ΔΑ͏ʹͳͬͯλεΫͷႈੑΛҙࣝ͢ΔΑ͏ʹͳͬͨ w ʢσʔλΛอଘ͢Δͱ͜Ζ͔Βίϯαϧ͠ͳ͍ͱμϝͳͷͰʜʁʣ
υΩϡϝϯτʹࡌͬͯͳ͍ $MPVE$PNQPTFSͷݟ
͚ͬ͜͏(,<ྗΛٻΊΒΕΔ w $MPVE$PNQPTFS(,&ͷ্ʹσϓϩΠ͞ΕΔϑϧϚωʔδυ"JSqPXαʔϏεɻ ࠔͬͨ࣌ʹ(,&ܦ༝Ͱ"JSqPXʹଓͯ͠σόοάͨ͠Γ͢Δඞཁ͕͋ΔͷͰɺ (,&ͱLTʹ͍ͭͯͷجૅࣝ͘Β͍͍࣋ͬͯͳ͍ͱͭΒ͍ɻ w ͱΓ͋͑ͣLVCFDUMΛηοτΞοϓ͓ͯ͘͠ɻ GKE_CLUSTER="$(gcloud composer environments
describe $COMPOSER_NAME \ --format='get(config.gkeCluster)')" GKE_LOCATION="$(gcloud composer environments describe $COMPOSER_NAME \ --format='get(config.nodeConfig.location)')" gcloud container clusters get-credentials $GKE_CLUSTER \ --zone $GKE_LOCATION
ϝϞϦ͕Γͳ͍ͱͬͯࢮ͵ w ϩάΛు͔ͣʹλεΫ͕ࣦഊ͢Δͱ͖ɺϝϞϦෆͰBJSqPXXPSLFS͝ͱLTʹࡴ͞Ε ͍ͯΔՄೳੑ͕͋Δɻ w ,VCFSOFUFT&OHJOF8PSLMPBETBJSqPXXPSLFSͰ&WJDUFEͳ1PEΛબ͢Δ͜ͱͰ ࢮҼΛ֬ೝՄೳɻ w OTUBOEBSEͩͱ"1*Λݺͼग़͚ͩ͢ͷ1ZUIPO0QFSBUPSͰكʹࡴ͞ΕΔɻ w
&WJDUFEͳ1PEΛҰ͢ΔίϚϯυͰఆظతʹ($͢Δɻ kubectl get pods -l run=airflow-worker \ | grep Evicted \ | awk '{print $1}' \ | xargs kubectl delete pod
1ZUIPOύοέʔδ͕ඍົʹݹ͍ w $MPVE$PNQPTFSͷBJSqPXXPSLFSʹ͍͔ͭ͘ͷ1ZUIPOύοέʔδ͕Πϯετʔϧ͞ Ε͍ͯΔ͕ɺυΩϡϝϯτʹόʔδϣϯ͕ॻ͔Ε͍ͯͳ͍ɻ͔͠ඍົʹݹ͍ɻ w 1PEͷதͰ1ZUIPOΛىಈͯ͠ௐΔͷ͕खͬऔΓૣ͍ɻ
HTVUJMͰσϓϩΠͰ͖Δ w "JSqPXϩʔΧϧϑΝΠϧΛϙʔϦϯά͢Δ͜ͱͰ%"(ఆٛϑΝΠϧΛݕग़͢Δɻ $MPVE$PNQPTFSͰ($4όέοτΛ($4'64&ͰϚϯτ͢Δ͜ͱͰ࣮ݱ͍ͯ͠ Δɻ w ($4ʹϑΝΠϧΛஔ͖͑͢͞Ε͍͍ͷͰɺHDMPVE4%,ͷTUPSBHFEBHTJNQPSUίϚϯ υΘͳ͍͍ͯ͘ɻ w $JSDMF$*͔ΒHTVUJMSTZODͰ؆୯ࣗಈσϓϩΠɻ
"JSqPX8FCϖʔδͷඈͼํ w ϒοΫϚʔΫͰ͍͍͕$PNQPTFS&OWJSPONFOUΛ࡞Γ͢ͱ63*͕มΘͬͯ͠·͏ɻ ͔ͱ͍ͬͯ$MPVE$POTPMFʹΞΫηε͢Δͷ໘ɻ w HDMPVE4%,Ͱ63*ΛऔಘͰ͖ΔͷͰɺͦΕΛPQFOίϚϯυʹ͍͍ͤɻ gcloud composer environments describe
$COMPOSER_NAME \ --format='get(config.airflowUri)’
"JSqPXͷόʔδϣϯΞοϓ͕ਏ͍ w ʹϕʔλػೳͱͯ͠ఏڙ։࢝͞Ε͕ͨɺυΩϡϝϯτͷ௨Γಈ͔ͳ͍ɻ w ҎલHJUIVCDPN(PPHMF$MPVE1MBUGPSNQZUIPOEPDTTBNQMFTʹೖ͍ͬͯΔ DPQZ@FOWJSPONFOUQZͱ͍͏εΫϦϓτΛ͏Α͏ʹͳ͍ͬͯͨɻ w DPQZ@FOWJSPONFOUQZΛಡΊҰԠԿΛͲ͜ʹίϐʔ͢Ε͍͍ͷ͔͔Δ͕ɺ "JSqPX͚ͩͰͳ͘LTྗͳ͍ͱ͔ͳΓݫ͍͠ɻ
$MPVE.FNPSZTUPSFʹଓͰ͖ͳ͍ w (,&͔Β.FNPSZTUPSFʢ3FEJTʣʹଓ͢ΔʹΫϥελ࡞࣌ʹ*1ΤΠϦΞεΛ༗ޮ ʹ͠ͳ͚Ε͍͚ͳ͍͕ɺ$MPVE$PNQPTFSແޮʹͯ͠࡞ͬͯ͠·͏ɻ ແޮͷ߹ΫϥελʹJQUBCMFTͷϧʔϧΛՃ͢Δඞཁ͕͋Δɻ w $MPVE$PNQPTFS͕ཧ͍ͯ͠ΔLTΫϥελΛ͋·Γ৮Γͨ͘ͳ͔ͬͨͷͰɺ౿Έͱ ͳΔ($&ΠϯελϯεΛཱͯͯղܾͨ͠ɻ from redis
import StrictRedis from sshtunnel import SSHTunnelForwarder with SSHTunnelForwarder((bastion_host, bastion_port), ssh_username="airflow", remote_bind_address=(redis_host, redis_port), local_bind_address=("127.0.0.1", local_port), allow_agent=False): client = StrictRedis(host="127.0.0.1", port=local_port) client.ping()
UFNQMBUF@FYU w ࢦఆͨ͠ͰऴΘΔจࣈྻΛϑΝΠϧύεͱͯ͠ղऍ͠ɺ࣮ମΛࢦఆ͞ΕͨϑΝΠϧͷத Λ+JOKBͰϨϯμϦϯάͨ݁͠ՌͰஔ͖͑ΔͱΜͰͳ͍ศརͳػೳɻ w υΩϡϝϯτແ͍͕͠Εͬͱ#BTF0QFSBUPSʹ࣮͞Ε͍ͯΔɻ with open("foo/bar.sql") as f:
sql = f.read() PythonOperator( template_dict={"sql": sql} # ... ) class SQLTemplateOperator(PythonOperator): template_ext = (".sql",) SQLTemplateOperator( template_dict={"sql": "foo/bar.sql"}, # ... ) IUUQTTUBDLPWFSqPXDPNB
IUUQTXXXqZXIFFMKQDBSFFST We are hiring ͨͷ͍͠Α