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

Pythonで大量データ処理! PySparkを用いたデータ処理と分析のきほん

chie8842
September 07, 2017

Pythonで大量データ処理! PySparkを用いたデータ処理と分析のきほん

PyConJP2017の資料 Python Spark PySpark PyConJP 2017 Apache Spark

chie8842

September 07, 2017
Tweet

More Decks by chie8842

Other Decks in Technology

Transcript

  1. ࣗݾ঺հ $IJF)BZBTIJEB  5XJUUFS!DIJF  3FUUZ*OD 4PGUXBSF&OHJOFFS   

    1ZUIPOػցֶश)BEPPQ4QBSL4DBMB%#ج൫WJN ম೑ϐΞϊςχεεϊϘ 
  2. •  044ͷฒྻ෼ࢄॲཧϑϨʔϜϫʔΫ –  ॲཧதͷো֐࣌ͷϦΧόϦ΍ɺλεΫ෼ׂɾεέδϡʔϦϯάΛ 4QBSL͕͏·͘΍ͬͯ͘ΕΔ –  αʔόͷεέʔϧΞ΢τʹΑͬͯεϧʔϓοτ͕ઢܗʹ͍͔ۙͨͪͰ޲্͢Δ •  Ϧιʔεར༻࠷దԽͷ޻෉͕͞Ε͓ͯΓɺॲཧ͕ߴ଎ – 

    ΦϯϝϞϦϕʔεͷॲཧ –  +7.ͷΦʔόϔουΛվળ͢Δ1SPKFDU5VOHTUFO –  Ωϟογϡ –  ஗ԆධՁ  •  1ZUIPOΛؚΉෳ਺ͷݴޠ͔Β࢖͑Δ –  ࠷৽ͷ4QBSLͩͱɺରԠόʔδϣϯ͸1ZUIPO  ʹରԠ •  ػցֶश΍ετϦʔϜॲཧɺॲཧͷྲྀΕ͕ݟ͑Δ6*ͳͲɺ ๛෋ͳػೳ͕͋Δ •  ίϛϡχςΟͷ׆ಈ͕׆ൃ "QBDIF4QBSLͱ͸ʂ
  3. 4QBSLͷ๛෋ͳػೳ 4QBSL$PSF 4QBSL42- 4QBSL4USFBNJOH ʢετϦʔϜॲཧʣ .MMJC ػցֶश  (SBQI9 άϥϑॲཧ

     SQL CSV {json} S3 BigQuery parquet Data Sources ༷ʑͳσʔλ ιʔεʹରԠ ෳ਺ݴޠΛαϙʔτ "1*͕ॆ࣮
  4. Ϧονͳ6* DAG Visualiza?on: 処理の流れが見える Event Timeline: 各タスクの所要時間が見える Summary Metrics: 処理時間やデータ量などの

    メトリクス情報が見える •  λεΫͷਐߦঢ়گ΍ϝτϦΫε͕ݟ͑Δ6*͕͋Γɺσόοά͕΍Γ΍͍͢
  5. ࣮ࡍʹ΍ͬͯΈΑ͏ʂ $ wget hIps://d3kbcqa49mib13.cloudfront.net/spark-2.2.0-bin-hadoop2.7.tgz $ tar xzvf spark-2.2.0-bin-hadoop2.7.tgz $ cd

    spark-2.2.0-bin-hadoop2.7 $ bin/pyspark 4QBSL͔ΒɺQJQͰ΋ΠϯετʔϧͰ͖ΔΑ͏ʹͳΓ·ͨ͠ʂ ·ͨɺ%PDLFSΛ࢖͏ͷ΋ศརͰ͢ʂ μ΢ϯϩʔυɾΠϯετʔϧͯ͠ ΠϯλϥΫςΟϒγΣϧΛ্ཱͪ͛Δ·Ͱ ͨͬͨίϚϯυʂ
  6. •  )BEPPQΫϥελ্Ͱಈ࡞͢Δ •  "NB[PO&.3΍(PPHMF%BUB1SPDͳͲͷ ϚωʔδυαʔϏεΛ࢖͏ͱָ ຊ֨తʹ෼ࢄॲཧΛߦ͏ͱ͖ͷಈ࡞؀ڥ HDFS YARN MapReduce MesosやSpark

    Standaloneもある S3など他に様々な データソースにも対応する 並列分散処理 フレームワーク リソース管理、 ジョブスケジュール 分散ファイル システム Basic Stack SparkはMapReduceの 後継と言われる
  7. 4QBSLͷͭͷϓϩάϥϛϯάϞσϧ 3%% •  ίϨΫγϣϯૢ࡞ͷΑ͏ʹॲཧΛ هड़͢Δ •  ඇߏ଄Խσʔλʹର͢Δॊೈͳ ॲཧ͕ߦ͑Δ •  ߦࢦ޲ͷॲཧ

     %BUBGSBNF •  42-ϥΠΫʹॲཧΛهड़͢Δ •  εΩʔϚΛར༻ͨ͠ߏ଄Խσʔλॲ ཧ •  ྻࢦ޲ͷॲཧ   %BUBGSBNF͸ɺ4QBSL͔Βొ৔ͨ͠ϋΠϨϕϧ"1*Ͱɺ ɾΦϓςΟϚΠβʹΑΔ࠷దԽͷԸܙΛड͚Δ ɾίʔυͷՄಡੑ্͕͕Δ ͱ͍ͬͨಛ௃͕͋Δ
  8. 3%%ͱ%BUB'SBNF Spark Core Spark SQL Spark Streaming (ストリーム処理) Mllib (機械学習)

    GraphX (グラフ処理) SQL CSV {json} S3 BigQuery parquet Data Sources •  3%%͸4QBSL$PSFɺ%BUB'SBNF͸4QBSL42-ʹؚ·ΕΔػೳ •  4QBSLͷػೳ͸ঃʑʹ%BUB'SBNFϕʔεʹஔ͖׵Θ͍ͬͯΔ   4USVDUVSFE4USFBNJOH4QBSL.-(SBQI'SBNFT RDD DataFrame
  9. 1Z4QBSLͷΞʔΩςΫνϟ •  3%% ϫʔΧʔϊʔυͰͷॲཧ͸1ZUIPOϓϩηεͰߦΘΕΔ •  %BUB'SBNF ϫʔΧʔϊʔυͰͷॲཧ͸+7.্ͰߦΘΕΔ ͨͩ͠6%'͸1ZUIPOϓϩηεͰ࣮ߦ͞ΕΔ Master Worker

    Spark Context Java SparkContext Executor Task Task Python Python socket Py4J pipe Master Worker Spark Context Java SparkContext Executor Task Task socket Py4J
  10. 1Z4QBSLͷΞʔΩςΫνϟ •  3%% ϫʔΧʔϊʔυͰͷॲཧ͸1ZUIPOϓϩηεͰߦΘΕΔ •  %BUB'SBNF ϫʔΧʔϊʔυͰͷॲཧ͸+7.্ͰߦΘΕΔ ͨͩ͠6%'͸1ZUIPOϓϩηεͰ࣮ߦ͞ΕΔ Master Worker

    Spark Context Java SparkContext Executor Task Task Python Python socket Py4J pipe Master Worker Spark Context Java SparkContext Executor Task Task socket Py4J ύϑΥʔϚϯε্ͷ໰୊఺ •  *UFSBUPS୯ҐͰͷTFSJBMJ[BUJPOͱQZUIPOϓϩηε΁ͷύΠϓ ͕ൃੜ •  QJDLMJOHͱ+7.ͷೋॏͷTFSJBMJ[BUJPOʹΑΔίετ૿ •  1ZUIPO8PSLFSͷىಈ •  1ZUIPO8PSLFSͷϝϞϦ͸+7.ͷ੍ޚର৅֎
  11. 1Z4QBSLΤίγεςϜͷਐԽ •  1Z4QBSLͰ͸ɺQBOEBT%BUB'SBNFͱ4QBSL%BUB'SBNFͷ ૬ޓม׵͕Ͱ͖Δɻ –  QBOEBTͷEG͔ΒTQBSLͷEG •  TQBSLDSFBUF%BUB'SBNF QE@EG 

    –  TQBSLͷEG͔ΒQBOEBTͷEG •  TQBSL@EGUP1BOEBT   ͕ʂʂ্هͷม׵͸ڪΖ͘͠஗͍ɻɻɻ ʢಛʹલऀʣ  •  ͜ΕΛղফ͢΂͘"QBDIF"SSPXͷ։ൃ͕ਐΜͰ͍Δ
  12. "QBDIF"SSPX •  σʔλϑΥʔϚοτͷ࢓༷ͱͦΕΛར༻͢ΔͨΊͷϥΠϒϥϦ •  ҟͳΔݴޠɾϓϩμΫτؒͰͷσʔλ࿈ܞίετΛԼ͛Δ •  ։ൃதͷ4QBSLͰ TQBSLDPOGTFU lTQBSLTRMFYFDVUJPOBSSPXFOBCMFz lUSVFz

    ͱ͢Δ͜ͱͰɺ 4QBSL%BUB'SBNFΛUP1BOEBT ͢Δࡍʹɺ"SSPXͷϑΥʔϚοτ͕ ࢖͑ΔΑ͏ʹͳΔ༧ఆ •  ଞʹ΋6%'ͷ7FDUPSJ[BUJPOͳͲ΋ܭը͞Ε͍ͯΔ 出典:hIps://arrow.apache.org/
  13. 1Z4QBSLͰ࢖͑Δ୅දతͳػցֶशख๏Ұཡ •  $MBTTJpDBUJPO 3FHSFTTJPO –  47.TɺϩδεςΟοΫճؼɺܾఆ໦ɺφΠʔϒϕΠζɺϥϯμϜϑΥϨε τɺઢܗճؼɺ(#5ɺϚϧνύʔηϓτϩϯɺJTPUPOJDճؼɺ"'5ੜଘճؼ •  $MVTUFSJOH – 

    ,NFBOTɺ-%"ɺ(.. •  ڠௐϑΟϧλϦϯάɺύλʔϯϚΠχϯά –  "-4ɺ/.'ɺ'1(SPXUI •  ࣍ݩ࡟ݮ –  47%ɺ1$" •  'FBUVSF&YUSBDUBOE5SBOTGPSN –  5'*%'ɺ8PSE7FDɺ4UBOEBSE4DBMFSɺ/PSNBMJ[FSɺ/HSBNɺ 0OF)PU&ODPEFSɺ4USJOH*OEFYFSɺ-BCFMFE1PJOUɺ%$5 •  #BTJDTUBUJTUJDT –  Χʔωϧີ౓ਪఆɺΧΠೋ৐ݕఆɺίϧϞΰϩϑεϛϊϑݕఆ •  &WBMVBUPS 5VOJOH (FOFSBUPS –  "6$ɺ$SPTT7BMJEBUPSɺ1BSBN(SJE#VJMEFSɺ֤छσʔλ(FOFSBUPS FUDʜ
  14. 1Z4QBSLΛ࠾༻ͨ͠ཧ༝ •  ϚωʔδυɾαʔϏεʢ&.3ʣΛར༻Ͱ͖ΔͨΊɺ ؀ڥߏங͕ෆཁ –  EBTL΍$FMFSZ΋ީิͱͯ͠͸͋Δ͕ɺ؀ڥߏங͕ඞཁͱͳΔɻ ·ͨ͜ΕΒ͸σʔλྔͷεέʔϧʹ଱͑ΒΕͳ͍Մೳੑ͕͋Δ •  ࣾ಺ʹ1ZUIPO࢖͍͕ଟ͍ͨΊɺϝϯςφϯεΛߟྀͯ͠ 4DBMBͰͳ͘1ZUIPOΛ࠾༻ͨ͠

    •  )JWF΍1SFTUPʢ)BEPPQΤίγεςϜʣͱൺ΂ɺඇߏ଄ σʔλʹର͢Δॊೈͳදݱ͕΍Γ΍͍͢ –  ෼ੳཁ݅ͷͨΊɺΞϓϦέʔγϣϯଆͰৼΒΕΔTFTTJPO*%ͱ͸ ผͰTFTTJPO*%૬౰ͷ΋ͷΛ෇༩ͯ͠΄͍͠ͱͷཁ๬͕͋Γɺ ͜ΕΛຬͨͨ͢ΊʹɺෳࡶͳίϨΫγϣϯॲཧΛߦ͏ඞཁ͕ ͋ͬͨ ちなみに、想定通り、ここの処理だけRDDなので遅い。 が、許容できる範囲だった。
  15. 1Z4QBSL ʴ&.3 ͷύϑΥʔϚϯε্ͷ5JQTΛ͍͔ͭ͘   •  ͳΔ΂͘%BUB'SBNFΛ࢖͏ •  ͳΔ΂͘ॲཧ͢ΔσʔλྔΛݮΒ͢ – 

    KPJO͸খ͍͞σʔλಉ࢜Λઌʹ •  ετϨʔδͷར༻ –  ӬଓԽϑΝΠϧ͸4 –  தؒϑΝΠϧ͸)%'4 •  σʔλϑΥʔϚοτ͸1BSRVFUΛར༻͢Δͱߴ଎ •  σʔλͷ4LFXʹ஫ҙ –  ҰͭͷύʔςΟγϣϯ͚ͩॲཧ͢Δσʔλྔ͕ଟ͘ͳͬͯɺͦ ͜ͷॲཧ଴ͪʹͳΔ
  16. 1Z4QBSL ʴ&.3 ͷύϑΥʔϚϯε্ͷ5JQTΛ͍͔ͭ͘   •  ϝϞϦνϡʔχϯάͷίπ –  1ZUIPOͰ4QBSLΛ࢖͏৔߹ɺ4DBMBͱൺ΂ͯΦϑώʔϓʢ+7.֎ ͷϝϞϦʣΛར༻͢ΔɻͦͷͨΊɺZBSOʹΑͬͯίϯςφ͕LJMM

    ͞ΕΔΤϥʔ͕ى͖΍͍͢ɻTQBSLQZUIPOXPSLFSNFNPSZ΍ TQBSLZBSOFYFDVUPSNFNPSZ0WFSIFBEύϥϝʔλͰνϡʔχϯ άΛߦ͏ •  "QBDIF;FQQFMJO –  &.3Ͱ͸ɺ+VQZUFS/PUFCPPLΛΠϯετʔϧ͠ͳͯ͘΋ɺ "QBDIF;FQQFMJOͱ͍͏/PUFCPPL͕࢖͑Δɻ
  17. ·ͱΊ •  4QBSL͸ɺେྔσʔλΛߴεϧʔϓοτͰॲཧ͢Δ͜ͱ ͷͰ͖ΔศརͳϓϩμΫτ •  ػցֶश΍ετϦʔϜͳͲ๛෋ͳػೳ͕͋Δ •  &.3΍%BUB1SPDͳͲͷϚωʔδυαʔϏε͕ศར •  1Z4QBSLΛར༻͢Δ৔߹͸Φʔόϔου͕͋Δ

    •  ࢖͍Ͳ͜ΖΛ͖ͪΜͱཧղ͢Δ͜ͱ͕͍ͩ͡ •  3FUUZͰ͸σʔλΤϯδχΞϦϯάʹ1Z4QBSLΛ࠾༻ͯ͠ ͍Δ みなさんも、PySparkで大量データ処理やってみよう!
  18. ิ଍ ηΧϯμϦιʔτͱNBQQBSUJUJPOͷઆ໌ [(0,4), (2,4), (3,1), (2,2), (0,1), (1,1),(1,8), (3,6)] [(0,1),

    (0,4), (2,2), (2,4)] [(0,1), (1,1), (1,8), (3,1), (3,6)] もとの配列 パーティションキー とそれ以外の値で ソートする [(0,1), (0,5), (2,2), (2,5)] [(0,1), (1,1), (1,9), (3,1), (3,7)] secondary sort mappar??on par??onごとに一度 処理を実行する