40億レコード以上のSPEEDA大規模データを超高速に表示するElasticsearch活用法

 40億レコード以上のSPEEDA大規模データを超高速に表示するElasticsearch活用法

8a43d544df4886ea5ef714e78f3420a7?s=128

Hideyuki Takeuchi

March 25, 2016
Tweet

Transcript

  1. 40ԯϨίʔυҎ্ͷ SPEEDAେن໛σʔλΛ ௒ߴ଎ʹදࣔ͢Δ Elasticsearch׆༻๏ גࣜձࣾϢʔβϕʔε ͚ͨ͏ͪɹͻͰΏ͖

  2. None
  3. ࣗݾ঺հ ͚ͨ͏ͪͻͰΏ͖ @chimerast גࣜձࣾϢʔβϕʔε
 νʔϑςΫϊϩδετ
 / Πϊϕʔγϣϯ୲౰ࣥߦ໾һ

  4. ձࣾ঺հ

  5. ܦࡁ৘ใͰɺੈքதͷҙࢥܾఆΛࢧ͑Δ

  6. ࣄۀྖҬ:
 ϏδωεͷҙࢥܾఆΛࢧ͑Δ৘ใΠϯϑϥͷఏڙ ઃཱ೥݄೔: 2008೥4݄1೔ ౦ژɺγϯΨϙʔϧɺ߳ߓɺ্ւɺεϦϥϯΧ ैۀһ਺: ໿200໊(ΞϧόΠτɺΠϯλʔϯؚΉ)

  7. B2BαʔϏε SPEEDA͸اۀɾۀքͷϑΝϯμϝϯλϧ ෼ੳʹඞཁͱͳΔ͋ΒΏΔ৘ใ͕໢ཏతɾ ମܥతʹ੔ཧ͞ΕͨΦϯϥΠϯ৘ใαʔϏ εʢSaaSܕσʔλϕʔεʣͰ͢ɻ B2CαʔϏε NewsPicks͸ܦࡁ৘ใʹಛԽͨ͠χϡʔε ڞ༗αʔϏεͰ͢ɻ༑ਓ΍ؾʹͳΔۀքͷ ઐ໳ՈΛϑΥϩʔͯ͠ɺ͋ͳ͚ͨͩͷܦࡁ ࢽΛ࡞Δࣄ͕Ͱ͖·͢ɻ·ͨɺࣗ෼ͷҙݟ

    Λڞ༗͢Δݴ࿦ϓϥοτϑΥʔϜͰ΋͋Γ ·͢ɻ ఏڙ͢Δ̎ͭͷαʔϏε
  8. ΑΓ޿͍ൣғͷ Ϗδωεύʔιϯ ۚ༥ɾܦࡁͷ εϖγϟϦετ

  9. None
  10. اۀɾۀք෼ੳͷ৘ใϓϥοτϑΥʔϜ શੈք330ສࣾ௒ / 550ۀքͷσʔλ ੈք࠷େڃͷM&Aσʔλ 2009೥6݄ϩʔϯν 600ࣾ௒ʹಋೖࡁΈ(ࠃ֎ؚΉ)

  11. DEMO

  12. None
  13. ΤϯδχΞ ΞφϦετ ίϯαϧ αϙʔτ

  14. ຊ୊

  15. SPEEDAͰͷElasticsearch׆༻ࣄྫ

  16. SPEEDA͕อ༗͢Δσʔλ (ൈਮ) • اۀσʔλ • جຊ৘ใ • ۀքॴଐ৘ใ • ࡒ຿σʔλ

    • גՁσʔλ • ηάϝϯτ৘ใ • גओ৘ใ • ؔ܎ձࣾ৘ใ • ༗Ձূ݊ใࠂॻ • IRσʔλ • ۀքσʔλ • ۀքϨϙʔτ • ڝ߹ϓϨΠϠʔ৘ใ • ౷ܭɾIRσʔλ • χϡʔε • M&Aσʔλ • ࡒ຿σʔλ • σΟʔϧσʔλ
  17. SPEEDAͷ೰·͍͠ͱ͜Ζ • ୭͕͍ͭͲͷσʔλʹΞΫηε͢Δ͔෼͔Βͳ͍ • ڊେͳσʔλϕʔεʹ΋͔͔ΘΒͣ
 Ωϟογϡ͕Ͱ͖ͳ͍ • ͨͩ͠Ϣʔβ਺͸গͳ͍ • ͍͔ʹσʔλͷ۱ʑ·Ͱߴ଎ʹ


    ΞΫηεग़དྷΔΑ͏ʹ͢Δ͔͕՝୊
  18. اۀΛ୳͢

  19. ࠓճͷ͓࿩͠Ͱѻ͏σʔλͷൣғ • اۀσʔλ • جຊ৘ใ • ۀքॴଐ৘ใ • ࡒ຿σʔλ •

    גՁσʔλ • ηάϝϯτ৘ใ • גओ৘ใ • ؔ܎ձࣾ৘ใ • ༗Ձূ݊ใࠂॻ • IRσʔλ • ۀքσʔλ • ۀքϨϙʔτ • ڝ߹ϓϨΠϠʔ৘ใ • ౷ܭɾIRσʔλ • χϡʔε • M&Aσʔλ • ࡒ຿σʔλ • σΟʔϧσʔλ
  20. ࣮ݱ͠ͳ͚Ε͹ͳΒͳ͔ͬͨੈք • اۀΛ༷ʑͳ৚݅ͰߜΓࠐΜͰ୳͍ͨ͠ • ྫ͑͹ΞδΞͷاۀͷத͔Β
 ೔ຊϕʔεͰ
 1000ԯԁҎ্ͷ࣌Ձ૯ֹ͔ͭ
 1000ԯԁҎ্ͷച্ߴͰ
 اۀಛ৭ʹmotorͱ͍͏จࣈྻ͕ೖ͍ͬͯΔاۀΛ
 ୳͍ͨ͠

  21. ௒ڊେͳࡒ຿σʔλ in MySQL • اۀID × צఆՊ໨ID × ظؒID →

    ࡒ຿਺஋σʔλ • 330ສاۀ × 2ສՊ໨ × 60೥෼ (௨ظɺ൒ظɺ࢛൒ظ) • ໿6ԯϨίʔυ • ݱ஍௨՟ϕʔεͰ • ओཁ6௨՟ʹม׵ͯ࣋͠ͱ͏ͱ͢Δͱ໿40ԯϨίʔυ
  22. ੈքͷࠔ೉͞ in MySQL • ΠϯσοΫεʁҰମ͍ͭ͘Ͳ͏షΕ͹͍͍ͷʁ • LIKEݕࡧʁ௒஗͍ʂ • ௨՟ม׵ʁͳʹͦΕʁݩσʔλ͸ݱ஍௨՟

  23. ੈքͷ่յ • ͦΕͰ΋10ສࣾ × 100Պ໨͙Β͍·Ͱ͸஗͍ͳ͕Β΋
 MySQL+ΞϓϦଆͷॲཧͰؤு͍ͬͯͨ • ऩ࿥اۀ͕10ສࣾΛ௒͑ͨลΓ͔Β
 ݕࡧ&μ΢ϯϩʔυ͕5෼Λ௒͑ͯ
 Ͳ͏͠Α͏΋ͳ͍ײ͡ʹ

  24. ੈքΛ࣮ݱ͢Δࢼߦࡨޡͷதͷޫ໌ • σʔλ΢ΣΞϋ΢εɺKVSΫϥελͳͲ৭ʑࢼ͍ͯͨ͠

  25. ੈքΛ࣮ݱ͢Δࢼߦࡨޡͷதͷޫ໌ • σʔλ΢ΣΞϋ΢εɺKVSΫϥελͳͲ৭ʑࢼ͍ͯͨ͠ • ͦΜͳதɺؾ·͙ΕʹElasticsearchษڧձʹग़ͯΈͨ

  26. ੈքΛ࣮ݱ͢Δࢼߦࡨޡͷதͷޫ໌ • σʔλ΢ΣΞϋ΢εɺKVSΫϥελͳͲ৭ʑࢼ͍ͯͨ͠ • ͦΜͳதɺؾ·͙ΕʹElasticsearchษڧձʹग़ͯΈͨ • ෆಈ࢈ݕࡧαΠτ͕Elasticsearch࢖ͬͯΔΑʂ

  27. ੈքΛ࣮ݱ͢Δࢼߦࡨޡͷதͷޫ໌ • σʔλ΢ΣΞϋ΢εɺKVSΫϥελͳͲ৭ʑࢼ͍ͯͨ͠ • ͦΜͳதɺؾ·͙ΕʹElasticsearchษڧձʹग़ͯΈͨ • ෆಈ࢈ݕࡧαΠτ͕Elasticsearch࢖ͬͯΔΑʂ • اۀΛ୳͢ػೳͬͯෆಈ࢈Λ୳͢ͷͱಉ͡ͳͷͰ͸ʂʁ •

    ͩ͜ΘΓ৚݅ࢦఆͱ͔ฏถ਺ࢦఆͱ͔
  28. Elasticsearch

  29. ElasticsearchͬͯԿʁ • શจݕࡧΤϯδϯ • ͱ͍͍ͭͭूܭ΋ಘҙͰϩάղੳͰ΋Α͘࢖ΘΕΔ • ϕʔεʹLuceneΛ࢖༻ • Ϋϥελߏ੒Λͱͯ΋؆୯ʹ૊Ή͜ͱ͕Ͱ͖Δ •

    ϊʔυͷ௥Ճ࡟আ͕ΦϯϥΠϯͰ؆୯ʹ
  30. ElasticsearchΛͲ͏ͱΒ͑Δ͔ʁ • SPEEDAͰ͸ɺ • ߴ଎ͰڊେͳBitSetԋࢉ૷ஔͱͯ͠ͱΒ͍͑ͯΔ • ݴ͍׵͑ΔͱBitmap Indexͷѻ͍͕௒ಘҙͳγεςϜ

  31. Bitmap Index (Scan) • จࣈྻσʔλͷ৔߹͸
 Term୯ҐͰBitSetΛ
 ͋Β͔͡Ίܭࢉ • ਺஋σʔλͷ৔߹͸౎౓
 ৚݅ͷBitSet͕ੜ੒

    ৚ ݅ A ৚ ݅ B ৚ ݅ C ৚ ݅ D ݁ Ռ Doc1 0 1 1 1 0 Doc2 1 1 1 1 1 Doc3 0 1 0 0 0 Doc4 0 0 0 0 0 Doc5 1 0 0 0 0 Doc6 1 1 1 1 1 Doc7 0 0 0 1 0 Doc8 0 1 1 0 0 Doc9 0 0 0 0 0 Doc10 0 0 1 1 0 : : : : : : Doc2ͱ Doc6͕ ώοτ
  32. σʔλͷ࣋ͪํ in Elasticsearch • 1اۀ=1υΩϡϝϯτͱͯ࣋ͭ͠ (=330ສυΩϡϝϯτ) • 1υΩϡϝϯτͷதʹશͯͷඞཁͳاۀ৘ใΛ࣋ͭ • ࡒ຿σʔλ΋શͯల։͢Δ

    • ࡒ຿σʔλΛԣ࣋ͪ • ҝସ΋ओཁ௨՟Λม׵ͨ͠΋ͷΛ࣋ͭ (ܭ໿40ԯ)
  33. σʔλΛ࣋ͬͯΈͨ݁Ռ • 1υΩϡϝϯτ࠷େͰ40MB௒͑ (JSONϕʔε) • ໿11ສϑΟʔϧυ (=ΧϥϜ਺) • ͦΕͰ΋໰୊ͳ͘ಈ͘ʂʂ •

    צఆՊ໨਺ × ओཁ௨՟਺ + ͦͷଞͷاۀ৘ใ
  34. Ϛοϐϯάͷҋ • ԆʑͱצఆՊ໨ͷ
 ϑΟʔϧυ͕ଓ͘

  35. ࠷৽ͷຊ൪Πϯϑϥߏ੒ • 10୆ͷ෺ཧαʔό಺ͷ20୆ͷԾ૝ϚγϯͰ
 ΫϥελΛߏ੒ • ෺ཧϚγϯ1୆͋ͨΓCPU16ίΞɺ
 ϝϞϦ128GBɺSSD RAID • 30γϟʔυ

    • 2ϨϓϦΧ
  36. ग़དྷΔΑ͏ʹͳͬͨ͜ͱ • ݩʑ࡞Γ͔ͨͬͨੈքΛ࡞Εͨ • اۀΛ༷ʑͳ৚݅Λݩʹݕࡧ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹ

  37. DEMO

  38. None
  39. ͞Βʹग़དྷΔΑ͏ʹͳͬͨ͜ͱ • λʔήοτϦετ • ͋Β͔͡ΊϓϦηοτ͞Εͨ৚݅Λݩʹ
 ͓٬༷ʹձࣾͷϦετΛಧ͚Δ • ͞Βʹ͔ͦ͜ΒߜΓࠐΊΔ • Ϣʔβ͸ࣗ෼Ͱෳࡶͳ৚݅Λࢦఆͯ͘͠Α͍

  40. DEMO

  41. None
  42. ࠓճಘͨ஌ݟ(·ͱΊ) • Elasticsearch͸਺஋σʔλʹରͯ͠ͷݕࡧ΋े෼଎͍ • ϑΟʔϧυ਺͸͍͘Β૿͑ͯ΋ͨͿΜେৎ෉ • ιϑτ΢ΣΞ্ͷϦϛοτ͸ແ͍Β͍͠ • ஌ࣝͷ෯Λ޿͛ΔͨΊʹ͍ΖΜͳษڧձʹͰͯΈΔ

  43. ΤϯδχΞืू

  44. None