Upgrade to Pro — share decks privately, control downloads, hide ads and more …

リブセンスのデータ分析基盤を支えるRedshiftとAirflow

 リブセンスのデータ分析基盤を支えるRedshiftとAirflow

2018-04-06 BigData-JAWS勉強会 #12

E60aa4f80303f3f386898546ddb3686a?s=128

Livesense Inc.
PRO

April 10, 2018
Tweet

Transcript

  1. ςΫϊϩδΧϧϚʔέςΟϯά෦σʔλϓϥοτϑΥʔϜάϧʔϓ Copyright © LIVESENSE Inc. ٢෢ਖ਼࢙ Ϧϒηϯεͷσʔλ෼ੳج൫Λࢧ͑Δ 3FETIJGUͱ"JSGMPX #JH%BUB+"84ษڧձ

  2. w ೥ೖࣾ w σʔλ෼ੳج൫ʮ-JWFTFOTF"OBMZUJDTʯͷ ։ൃɺӡ༻Λ΍ͬͯ·͢ w झຯ+Ϧʔά؍ઓ w ޷͖ͳ"84αʔϏε3FETIJGU 4

    ٢෢ਖ਼࢙ !UBLF@N  גࣜձࣾϦϒηϯεςΫϊϩδΧϧϚʔέςΟϯά෦ σʔλϓϥοτϑΥʔϜάϧʔϓ ࣗݾ঺հ
  3. w "QBDIF"JSGMPXͱ͸ w Ϧϒηϯεͷ"JSGMPXγεςϜߏ੒ w ϦϒηϯεͰͷ"JSGMPX׆༻ࣄྫ "HFOEB

  4. Ϧϒηϯεͷσʔλ෼ੳج൫

  5. w σʔλऩू w ϩάσʔλ ΞΫηεϩάɺΠϕϯτϩάɺΠϯϓϨογϣϯϩά  w σʔλಉظ ࣄۀͷ8FCαʔϏε 

    w ֎෦σʔλ ޿ࠂɺ4&0  w σʔλ෼ੳɺ׆༻ w ΞυϗοΫ෼ੳ w ,1*νΣοΫ w μογϡϘʔυ w σʔλιʔε w Ϩίϝϯυ w ޿ࠂΞτϦϏϡʔγϣϯ෼ੳ Ϧϒηϯεͷσʔλ෼ੳج൫
  6. Ϧϒηϯεͷσʔλ෼ੳج൫ 3 F E T I J G U E

    D    Y M B S H F  º   ς ʔϒϧ ਺    Ϩί ʔ υ ਺    ԯ Ϩί ʔ υ ར ༻ ༰ ྔ  5 # ΞΫ ςΟ ϒϢʔ β    ໊ ΞυϗοΫɾΫΤϦ EBZ # *    δϣϒ ɾ Ϋ Τ Ϧ        E B Z Ϧ Ϧ ʔε     ೥   ݄
  7. Ϧϒηϯεͷσʔλ෼ੳج൫

  8. Ϧϒηϯεͷσʔλ෼ੳج൫ ࠓ೔͸͜ͷ࿩Λ͠·͢

  9. w ϫʔΫϑϩʔΛεέδϡʔϦϯάɺϞχλϦϯά͢ΔͨΊͷ πʔϧ w ݩʑ͸"JSCOC͕ࣾ։ൃ͠ɺࠓ͸"QBDIFιϑτ΢ΣΞࡒஂ ͷΠϯΩϡϕʔγϣϯϓϩάϥϜʹՃೖ w 1ZUIPOͰ࣮૷͞Ε͍ͯΔ "QBDIF"JSGMPXͱ͸

  10. w ݩʑɺόονॲཧΛ3VCZͷSBLFͰॻ͍͍ͯͨ ࠓ΋  w ౰࣌ͷεέδϡʔϧ؅ཧ͸DSPO w XIFOFWFSͱ͍͏HFNΛ࢖ͬͯɺλεΫεέδϡʔϧͷ όʔδϣϯ؅ཧ͸͍ͯͨ͠ w

    ͚ͲݟͮΒ͍ͷͰTQSFBETIFFUͰ࣮ߦ࣌ؒͷ؅ཧΛͯ͠ ͍ͨ w ͔͠͠ஈʑλεΫɺόονͷྔ͕૿͖͑ͯͯʜ w ґଘؔ܎΋ෳࡶʹͳ͖ͬͯͯʜ w ఘΊͯɺδϣϒϚωδϝϯτπʔϧͷಋೖΛܾΊͨ   "JSGMPXΛಋೖͨ͠ܦҢ
  11. w "JSGMPXಋೖ౰࣌ɺൺֱͨ͠΋ͷ w -VJHJ w %JHEBH w 3VOEFDL w ਖ਼௚ɺͲΕ΋Ұ௕Ұ୹ͰܾΊख͸ͳ͔ͬͨʜ

    w ໰୊͕͋ͬͨ࣌ʹҰ൪ʮӡ༻ͰΧόʔʯग़དྷͦ͏ͩͬͨͷ ͕"JSGMPXͩͬͨ ଞͷδϣϒϚωδϝϯτπʔϧͱͷൺֱ
  12. w δϣϒͷεέδϡʔϦϯά w DSPOܗࣜͰࢦఆՄೳ w λεΫͷґଘؔ܎ΛίʔυͰهड़ w 1ZUIPOͰ%"(΍λεΫΛهड़ w %"(༗ޮඇ८ճάϥϑɻ͜͜Ͱ͸λεΫؒͷ࣮ߦॱ

    ΍ґଘؔ܎Λࣔ͢άϥϑ w 8FC6*ʹΑΔλεΫ΍ϨϙʔτͷϏδϡΞϥΠζ "JSGMPXͰͰ͖Δ͜ͱ
  13. w 1ZUIPOͷίʔυͰهड़ w 0QFSBUPSͰλεΫΛͭͣͭهड़ w CBTIίϚϯυΛ࣮ߦ͢Δ#BTI0QFSBUPSͷྫ λεΫͷهड़ # DAG dag

    = DAG(‘test_dag’, start_date=datetime(2018, 4, 6) # bashίϚϯυλεΫͷྫ test_task = BashOperator( task_id='test_task', bash_command='ls -al’, dag=dag)
  14. w λεΫؒͷґଘؔ܎ΛϏοτγϑτԋࢉࢠΛ࢖ͬͯهड़ λεΫؒͷґଘؔ܎ # DAG dag = DAG(‘test_dag’, start_date=datetime(2018, 4,

    6) # bashίϚϯυλεΫͷྫ task_ls = BashOperator( task_id='task_ls', bash_command='ls -al', dag=dag) task_echo = BashOperator( task_id='task_echo', bash_command='echo "hoge"', dag=dag) task_date = BashOperator( task_id='task_date', bash_command='date "+%F %T"', dag=dag) # λεΫؒͷґଘؔ܎ΛϏοτԋࢉࢠͰهड़ task_ls >> task_echo task_ls >> task_date
  15. ͜Μͳ%"(΋ඳ͚·͢

  16. ࢖༻Ͱ͖Δ0QFSBUPS w #BTI0QFSBUPSͷଞʹɺ1ZUIPO0QFSBUPS  1PTUHSFT0QFSBUPS 44)0QFSBUPSͳͲɻଞʹ΋৭ʑ w "84ؔ࿈ͩͱ w 3FETIJGU5P45SBOTGFS

    w 4'JMF5SBOTGPSN0QFSBUPS w &$40QFSBUPS w &NS"EE4UFQT0QFSBUPS ͳͲͷΑ͏ͳ΋ͷ΋͋Δ
  17. "JSGMPX%"(Ұཡ w ొ࿥͞Ε͍ͯΔ%"(ͷϦετ w ࢦఆͷσΟϨΫτϦʹஔ͔Ε͍ͯΔ1ZUIPOͷιʔεϑΝΠ ϧ܈͔Βੜ੒

  18. %"(5SFF7JFX w %"(ͷλεΫ͝ͱͷεςʔλεҰཡ w ͲͷλεΫ͕ɺ͍ͭͲͷΑ͏ͳεςʔλε͔ͩͬͨҰ໨ྎવ

  19. %"(5BTL%VSBUJPO w %"(ͷλεΫ͝ͱͷ࣮ߦ࣌ؒͷਪҠάϥϑ

  20. %"((BOUU w ࣮ߦ͞Εͨ%"(ͷΨϯτνϟʔτ w 5BTL%VSBUJPOͱ͋ΘͤͯϘτϧωοΫ͕ࢹ֮Խ

  21. "JSGMPXͷαʔϏε

  22. "JSGMPXͷαʔϏε WebGUIͷॲཧ DAGͷεέδϡʔϧ΍DAG RunͳͲ ϝλσʔλ͕֨ೲ͞ΕͨDB (DAG Run: DAGΛΠϯελϯεԽͨ͠΋ͷ)

  23. "JSGMPXͷαʔϏε DAGΛ؂ࢹ͠ɺεέδϡʔϧʹ Ԡͯ͡DAG RunΛੜ੒ OperatorΛΩϡʔΠϯά

  24. "JSGMPXͷαʔϏε OperatorͷॲཧΛ࣮ߦ ΩϡʔΠϯά͞Εͨ OperatorΛऔಘ Celeryͷ݁Ռ֨ೲ

  25. &YFDVUPS w εέδϡʔϦϯάɺ΍λεΫͷ࣮ߦͷฒྻɺ෼ࢄॲཧΛͲͷ Α͏ͳ࢓૊ΈͰ࣮ߦ͢Δ͔Λܾఆ w 4FRVFOUJBM&YFDVUPS w -PDBM&YFDVUPS w $FMFSZ&YFDVUPS

    w %BTL&YFDVUPS w .FTPT&YFDVUPS w &YFDVUPSʹΑͬͯɺTDIFEVMFS΍XPSLFSͷڍಈ͕มΘΔ w 4FRVFOUJBM&YFDVUPSͷ৔߹ɺXPSLFS͕ෆཁʹͳΔ
  26. Ϧϒηϯεͷ"JSGMPXӡ༻ߏ੒

  27. Ϧϒηϯεͷ"JSGMPXӡ༻ߏ੒ Airflow Webserver Airflowϝλσʔλ؅ཧ AirflowϝοηʔδϒϩʔΧʔ (Celery)

  28. Ϧϒηϯεͷ"JSGMPXӡ༻ߏ੒ Ruby rakeλεΫ GlueͰS3ͷσʔλ Λparquetม׵ Redshift΁ͷΫΤϦ ࣮ߦ EMR/SparkͰσʔ λม׵ॲཧ

  29. w 3FETIJGUʹର͢ΔఆظతͳΫΤϦ࣮ߦ w αϚϦςʔϒϧͷੜ੒ͱ͔ɺ7"$66.ͷ࣮ߦ؅ཧͱ͔ w ϔϧενΣοΫܥΫΤϦͷ࣮ߦ w &.3ͷىಈτϦΨ w &.3࣮ߦલͷલॲཧɺޙॲཧΛهड़

    w લॲཧऴྃޙɺ&.3ىಈɺTUFQ௥Ճɺॲཧऴྃ଴ͪɺΫϥε λఀࢭɺޙॲཧͷྲྀΕΛ%"(Ͱهड़ w 3FETIJGUͷΫΤϦͰॻ͘͜ͱ͕ࠔ೉ͳෳࡶͳॲཧΛ&.3Ͱॲ ཧ w (MVFىಈτϦΨ w 3FETIJGU4QFDUSVN༻ʹ1BSRVFUม׵͢Δॲཧ w &.3ಉ༷ɺ(MVF࣮ߦલͷલॲཧɺޙॲཧΛهड़ ͲͷΑ͏ʹ"JSGMPXΛ׆༻͍ͯ͠Δ͔
  30. ґଘؔ܎ͷ͋Δσʔλੜ੒

  31. ґଘؔ܎ͷ͋Δσʔλੜ੒ base_table͔Β table1Λੜ੒

  32. ґଘؔ܎ͷ͋Δσʔλੜ੒ ੜ੒ͨ͠table1͔Β table2Λੜ੒

  33. ґଘؔ܎ͷ͋Δσʔλੜ੒ ੜ੒ͨ͠table2͔Β table3Λੜ੒

  34. *OUFSMFBWFETPSULFZ͕͋Δςʔϒϧੜ੒ͱ7"$66.

  35. *OUFSMFBWFETPSULFZ͕͋Δςʔϒϧੜ੒ͱ7"$66. table1͔Βtable2Λ ੜ੒

  36. *OUFSMFBWFETPSULFZ͕͋Δςʔϒϧੜ੒ͱ7"$66. table2ʹVACUUM REINDEXΛ ࣮ߦ͢ΔͨΊSQSʹenqueue

  37. *OUFSMFBWFETPSULFZ͕͋Δςʔϒϧੜ੒ͱ7"$66. ผDAGͰఆظతʹ SQSϙʔϦϯά

  38. *OUFSMFBWFETPSULFZ͕͋Δςʔϒϧੜ੒ͱ7"$66. SQSϝοηʔδऔಘͨ͠Βɺ table2ʹVACUUM REINDEX࣮ߦ

  39. &.3Ͱॲཧ͞ΕͨσʔλΛ3FETIJGU΁$01:

  40. &.3Ͱॲཧ͞ΕͨσʔλΛ3FETIJGU΁$01: EMRΫϥελΛੜ੒

  41. &.3Ͱॲཧ͞ΕͨσʔλΛ3FETIJGU΁$01: EMRʹεςοϓΛ௥Ճ͠ɺ S3ͷσʔλΛม׵ɺੜ੒ EMRͰੜ੒͞ΕͨσʔλΛ S3ʹ֨ೲ

  42. &.3Ͱॲཧ͞ΕͨσʔλΛ3FETIJGU΁$01: ੜ੒͞ΕͨS3ͷσʔλΛ RedshiftʹCOPY

  43. &.3Ͱॲཧ͞ΕͨσʔλΛ3FETIJGU΁$01: EMRΫϥελΛ࡟আ

  44. w λεΫͷεέδϡʔϧ΍ґଘؔ܎͕੔ཧͰ͖ͨ w (6*ͰҰ໨ྎવ w ίʔυϕʔεͰ%"(؅ཧ͕Ͱ͖ΔΑ͏ʹͳͬͨ w ࣮ߦ݁Ռɺ࣮ߦ࣌ؒ΋؅ཧͰ͖ΔΑ͏ʹͳͬͨ w ࣮ߦ݁Ռͷϩάͷ؅ཧָ͕ʹͳͬͨ

    w ࠓ·Ͱ͸όοναʔόʹೖͬͯɺ௚઀ϩάϑΝΠϧΛݟ Δ͔͠ͳ͔ͬͨ w (6*্Ͱ֬ೝͰ͖ɺো֐ͷݪҼͷௐࠪ΋ָʹͳͬͨ w 8PSLFS͕εέʔϧͰ͖ΔΑ͏ʹͳͬͨ w ͕ɺࠓͷͱ͜Ζؒʹ߹͍ͬͯΔͷͰɺ·ͩͯ͠ͳ͍ "JSGMPXΛಋೖͯ͠Α͔ͬͨ͜ͱ
  45. w ఀࢭޙͷ෮چ͕݁ߏ໘౗ w 3FETIJGUͷϊʔυ௥ՃͳͲɺҰ࣌తʹఀࢭ͢Δඞཁ͕͋Δͱ͖ w ෮چޙɺཷ·͍ͬͯͨεέδϡʔϧ͕·ͱΊ࣮ͯߦ͞ΕΔ໰୊ w ϔϧενΣοΫΫΤϦͳͲ୹͍पظͰ࣮ߦ͞ΕΔ%"(ͱ͔ w ҰؾʹΫΤϦΛ౤͛ͯ͘ΔͷͰ%P4ঢ়ଶʹ

    w όʔδϣϯͰ$BUDIVQΛແޮʹ͢Δઃఆ͕ग़དྷͨͷͰɺղফ w &YFDVUJPO%BUFͱ࣮ࡍͷ࣮ߦ͕࣌ؒͣΕͯΔ w &YFDVUJPO%BUF͕ͳͷʹɺ࣮ࡍʹ͸ ʹ࣮ߦ͞ΕͯͨΓ w ଟ෼λΠϜκʔϯॲཧʹ໰୊͕͋ΔΜ͡Όͳ͍͔ͱਪଌ "JSGMPXӡ༻Ͱۤ࿑ͨ͜͠ͱ
  46. w λεΫࣦഊޙͷ࠶࣮ߦ w %"(ͷ్தͰࣦഊͨ͠৔߹ɺ͋ͱͰࣦഊͨ͠ͱ͜Ζ͔Β࠶࣮ߦ ग़དྷΔ͕ɺࠓ͸खಈͰSBLFΛ௚઀࣮ߦ͍ͯ͠Δ w ࠶։ΦϖϨʔγϣϯΛ΋͏গָ͠ʹͰ͖ΔΑ͏ݟ௚͍ͨ͠ w λεΫ࣮૷ํ๏ w

    Ҏલͷӡ༻Ͱ࢖͍ͬͯͨ3VCZ3BLFλεΫΛͦͷ··࢖͍ͬͯ Δ͕1ZUIPOʹஔ͖׵͍͑ͯͬͨ΄͏͕͍͍͔Ͳ͏͔໎͍தʜ w "JSGMPX"1*ͷ0QFSBUPSΛ௚઀ୟ͚ΔϝϦοτ͸େ͖͍ w ͕ɺ%"(ͱϩδοΫ͸෼཭͍ͨ͠ w %PDLFSԽ w &$4΍&,4Ͱӡ༻Ͱ͖ΔΑ͏ʹ͍ͨ͠ʜ ࠓޙͷ՝୊
  47. w ϦϒηϯεςΫϊϩδΧϧϚʔέςΟϯά෦ͷ೔ʑͷ׆ಈͰ֫ಘ ͨ͠৘ใΛެ։͍ͯ͠·͢ w IUUQBOBMZUJDTMJWFTFOTFDPKQ w "JSGMPXʹ͍ͭͯ΋ઌ೔هࣄΛެ։͠·ͨ͠ͷͰɺซͤͯ͝ࢀর͘ ͍ͩ͞ w IUUQBOBMZUJDTMJWFTFOTFDPKQFOUSZ

    13-JWFTFOTF%BUB"OBMZUJDT#MPH
  48. ͋ͨΓ·͑Λɺൃ໌͠Α͏ɻ

  49. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ