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
【GCC2026】鉄拳8でのVFX開発事例
bandainamcostudios
PRO
0
120
Kiro Crew入門 - 常駐エージェントの仕組みと使いどころ / Intro to Kiro Crew
k_adachi_01
1
650
形式手法特論:Hyperproperty とモデル検査 #kernelvm / Kernel VM Study Tokyo 19th
ytaka23
0
340
ガバメント AI 源内を地方自治体は活用できるのか可能性と課題、期待について
takeda_h
2
460
【GCC2026】大規模言語モデルを活用した内製検索サービスの社内展開や業務活用
bandainamcostudios
PRO
0
350
属人化を叩き割れ!「制作加速」と「安定化」の矛盾を打破する:8年目プロダクトが辿り着いた「ミスが起こり得ない」アセット制作フローの全貌
gree_tech
PRO
0
120
Eight Engineering Unit 紹介資料
sansan33
PRO
3
8.2k
国家プロジェクトを支える「さくらONE」 大規模LLM開発におけるGPU障害を乗り越えるクラスター運用戦略
gpuunite_official
0
170
強化学習「理論」入門
enakai00
3
3.6k
35分でわかるEffective Platform Engineering
nwiizo
5
550
Invisible to AI? Making TYPO3 Sites Quotable by AI Search Systems
wolfgangwagner
0
240
【書籍出版記念】 10周回って、エージェント開発は RAGがすべてだった。〜RAGの歴史と開発現場で見えた実践知〜
akiratameto
3
430
Featured
See All Featured
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
680
Statistics for Hackers
jakevdp
799
230k
My Coaching Mixtape
mlcsv
0
250
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
430
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
390
How GitHub (no longer) Works
holman
316
150k
Un-Boring Meetings
codingconduct
0
390
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
510
Large-scale JavaScript Application Architecture
addyosmani
515
110k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
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 ͨͷ͍͠Α