์ค์๊ฐ ๊ด๊ณ ์ฌ์ฉ์ ID ๋งคํ
์ค์๊ฐ ๊ด๊ณ ์ฌ์ฉ์ ID ๋งคํ ๊ด๋ จ
๋ค์ด๋ฒ ๊ด๊ณ ์์คํ ์์๋ ๊ด๊ณ ๋ ธ์ถ ์ฌ์ฉ์๋ฅผ ๋ํํ ์ ์๋ ID๋ฅผ ์์ฑํ๋ ์์ ์ด ํ์ํฉ๋๋ค. ์ค์๊ฐ ๊ด๊ณ ์ฌ์ฉ์ ID ๋งคํ ์์คํ ์ ๋๋์ ์ด๋ฒคํธ ๋ก๊ทธ์์ ์ถ์ถํ ์ฌ์ฉ์ ID๋ก ๊ด๊ณ ์ฌ์ฉ์๋ฅผ ๋ํํ ์ ์๋ ๊ทธ๋ฃน ID๋ฅผ ๋งคํํฉ๋๋ค.
์ด ๊ธ์์๋ ์ค์๊ฐ ๊ด๊ณ ์ฌ์ฉ์ ID ๋งคํ ์์คํ
์ ์ค๊ณ๋ถํฐ ๊ฐ ์ฃผ์ ๋ชจ๋์ ์๊ฐํฉ๋๋ค. gRPC, Spark Structured Streaming์ ์ด์ฉํ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ๋ฅผ ๊ตฌ์ถํ ๋ฐฉ๋ฒ๊ณผ ์ฌ์ฉ์ ID๋ฅผ ๊ทธ๋ํ ๊ตฌ์กฐ๋ก ๋งคํํ๋ ๋ฒ์ ํฌํจํฉ๋๋ค. ์ค๋ช
๊ณผ์ ์์ ์ธ๊ธ๋๋ ์์ ์ํฉ๊ณผ ID ํ์
(ad_id
, mobile_id
, browser_id
)์ ์ค๋ช
์ ์ํด ๊ฐ์์ผ๋ก ์์ฑ๋ ๊ฒ์
๋๋ค.
๊ด๊ณ ์ฌ์ฉ์ ID ๋งคํ ์๊ฐ
Jack์ด๋ผ๋ ๊ฐ์์ ์ธ๋ฌผ์ด ์์ต๋๋ค. Jack์ ์ฌ๋ฌ ๋๋ฐ์ด์ค(pc, ๋ชจ๋ฐ์ผ)๋ฅผ ๊ฐ์ง๊ณ ์๊ณ ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํฉ๋๋ค. Jack์ด ์ฌ๋ฌ ๋๋ฐ์ด์ค์ ๋ธ๋ผ์ฐ์ ๋ก ์๋น์ค๋ฅผ ์ด์ฉํด ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ์ด๋ฒคํธ ๋ก๊ทธ๊ฐ ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. ๊ฐ๋ณ ๋ก๊ทธ๋ง ๋ด์๋ ๊ฐ ID ํ์ ์ ์ฌ๋ฌ ๊ฐ์ด ํ ๋ช ์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ธ ๊ฐ์ ๋ก๊ทธ๋ฅผ ๋ชจ์์ ์ค๋ณต๋ ๊ฐ์ ์ฐ๊ฒฐํด๋ณด๋ฉด ์ด๋จ๊น์? ad_id
๊ฐ a
๋ ์ฒซ ๋ฒ์งธ ๋ก๊ทธ์ ๋ ๋ฒ์งธ ๋ก๊ทธ์ ์์ต๋๋ค. mobile_id
๊ฐ b
๋ ์ฒซ ๋ฒ์งธ ๋ก๊ทธ์ ์ธ ๋ฒ์งธ ๋ก๊ทธ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ์ค๋ณต๋ ๊ฐ์ ์ฐ๊ฒฐํ๋ฉด, ์ด ์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง๋ ๋ชจ๋ฅด์ง๋ง ํ ๋ช
์๊ฒ์ ์ธ ๊ฐ์ ๋ก๊ทธ๊ฐ ๋ฐ์ํ๋ค๊ณ ์ถ๋ก ํ ์ ์์ต๋๋ค.
์ด ์ธ ๊ฐ์ ๋ก๊ทธ์์ ๋์จ ์ฌ์ฉ์ ID์ ํ๋์ group_id
๊ฐ j
๋ฅผ ๋งคํํฉ๋๋ค.
์ด์ ๊ฐ์ด, ์ค์๊ฐ ๋๋ ์ด๋ฒคํธ ๋ก๊ทธ์์ ์ถ์ถํ ์ฌ์ฉ์ ID๋ฅผ ์ฐ๊ฒฐํด์ ๊ฐ์ ๊ด๊ณ ๊ทธ๋ฃน ID์ ๋งคํํ๋ ์์คํ ์ ์ค์๊ฐ ๊ด๊ณ ์ฌ์ฉ์ ID ๋งคํ ์์คํ ์ด๋ผ๊ณ ๋ถ๋ฅด๊ณ ์์ต๋๋ค.
์์คํ ์ค๊ณ
๋ค์์ ์ค์๊ฐ ๊ด๊ณ ์ฌ์ฉ์ ID ๋งคํ ์์คํ ์ค๊ณ๋์ ๋๋ค. ์ ์ฒด ํ์ดํ๋ผ์ธ์ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๋ฅผ ์งํฅํ์ฌ ๊ฐ ๋ชจ๋์ด Apache Kafka๋ก ์ฐ๊ฒฐ๋์ด ๋์ปคํ๋ง๋์ด ์์ต๋๋ค. ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ ํ๋ฆ์ผ๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์์ ๋ฐ๋ผ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ ๋ ฅ ๋ฐ์ดํฐ๋ ์ด๋ฒคํธ ๋ก๊ทธ๋ก, HDFS์ ์ ์ฅ๋ ํ์ผ ๋ฐ์ดํฐ์ Apache Kafka์ ์ ์ฅ๋ ์ค์๊ฐ ๋ฐ์ดํฐ์ ๋๋ค. ์ค์๊ฐ ๋ฐ์ดํฐ๋ 5๋ง TPS ์ด์์ ์ฒ๋ฆฌํ๊ณ ์์ต๋๋ค.
id extraction์ด๋ผ๋ Apache Spark ์ฑ์ผ๋ก ์ด๋ฒคํธ ๋ก๊ทธ์์ ์ฌ์ฉ์ ID๋ง ์ถ์ถํด์ id pair ํ ํฝ์ ์์ฑํฉ๋๋ค. ์ด๋ ์ ๋ ฅ ๋ฐ์ดํฐ ํ์ ์ ๋ฐ๋ผ์ ๋ฐฐ์น ์ฑ๊ณผ Spark Structured Streaming ์ฑ์ผ๋ก ๋ถ๋ฆฌํด์ ์ฒ๋ฆฌํฉ๋๋ค. ์ฑ์์๋ ํน์ ์๋์ฐ๋ก ์ค๋ณต ์ ๊ฑฐ๋ฅผ ์คํํ์ฌ ๋ถํ๋ฅผ ์ค์ ๋๋ค.
id pair to id generator๋ผ๋ Spark Structured Streaming ์ฑ์์๋ id pair ํ ํฝ์ ์๋น(consume)ํด์ id generator gRPC์ ID ๋งคํ ์์ฒญ์ ๋ณด๋ ๋๋ค. gPRC ์๋ฒ์์๋ ๋งคํ ๊ฒฐ๊ณผ๋ฅผ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ id mapping ํ ํฝ์ ์ ์ฅํฉ๋๋ค. id generator gRPC ์๋ฒ์ ID ๋งคํ ๊ณผ์ ์ ๋ค์์ ๋ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค. ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋งคํ ๊ฒฐ๊ณผ๋ ๋น ๋ฅธ ์ฝ๊ธฐ๊ฐ ํ์ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
id mapping ํ ํฝ์ ์ ์ฅ๋ ๋งคํ ๊ฒฐ๊ณผ๋ ์๋น๋์ด HDFS์ ์ธ์ปจ๋๋ฆฌ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๊ณ ๊ฐ๊ฐ ๋ฐฐ์น์ Spark Structured Streaming ์ฑ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. HDFS ๋ฐ์ดํฐ๋ ๋ถ์์ ์ฌ์ฉ๋๊ณ ์ธ์ปจ๋๋ฆฌ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ HA๊ฐ ๋ชฉ์ ์ ๋๋ค.
๋ชจ๋ ๋ชจ๋์ ๋ถ์ฐ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ค๊ณ๋ก ์ด๋ฃจ์ด์ ธ ์์ด ๋ฐ์ดํฐ๊ฐ ํ ๋ฒ์ ๋ชฐ๋ฆฌ๋ ์ํฉ์์๋ ์ ์ฐํ ๋์ฒ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
ID ๋งคํ ํธ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ
๋๋์ ์ด๋ฒคํธ ๋ก๊ทธ๊ฐ ์ค์๊ฐ์ผ๋ก ์ ์ ๋์์ ๋ ์ค๋ณต๋๋ ์ฌ์ฉ์ ID๋ฅผ ์ฐ๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ํ์ํฉ๋๋ค. ์ด๋ป๊ฒ ์ฌ์ฉ์ ID๋ฅผ ์ฐ๊ฒฐํ ์ ์์๊น์?
๋จ์ํ๊ฒ๋ ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ํ์ง๋ง ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ๋งคํ ์ผ์ด์ค๋ฅผ ํ์ ํ๊ณ ์์ฑํ์ง ์๋๋ค๋ฉด ์๊ธฐ์น ์์ ๋งคํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค.
์กฐ๊ธ ๋ ์๊ฐ์ ํด๋ณด๋ฉด ์ฌ์ฉ์ ID๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ์ ๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๋ฌธ์ ๋ก ์นํํ ์ ์์ต๋๋ค. ๊ฐ ์ฌ์ฉ์ ID๋ฅผ ๋ ธ๋(node)๋ก ํํํ๊ณ ๋์ผํ ์ฌ์ฉ์๊ฐ ์์ฑํ ID๋ผ๊ณ ํ๋จ๋๋ ๊ฒฝ์ฐ ๊ฐ์ (edge)์ผ๋ก ์ฐ๊ฒฐํฉ๋๋ค. ๋ค์ ๊ทธ๋ฆผ์์ ์ค๋ฅธ์ชฝ ๊ทธ๋ํ๋ ์ผ์ชฝ์ ์ด๋ฒคํธ ๋ก๊ทธ์์ ์์ฑํ ๊ทธ๋ํ์ ๋๋ค.
ID ํ์ ์ฐ์ ์์
๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ดํด์ด ์์ฑ๋๊ฑฐ๋ ๊ฐ ๋ ธ๋๊ฐ ๋ฌดํ์ผ๋ก ์ฐ๊ฒฐ๋ ์๋ ์์ต๋๋ค. ๊ทธ๋์ ์ด๋ฐ ์ฌ์ดํด์ ๋์ด๋ด๊ณ ์ ํํ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ์ฌ์ฉ์๋ฅผ ๋ํํ๊ธฐ ์ฉ์ดํ ID ํ์ ์ ์ฐ์ ์์๋ฅผ ์ ์ํ์ต๋๋ค.
์๋ฅผ ๋ค์ด ad_id, mobile_id, browser_id๊ฐ ์กด์ฌํ ๋, ad_id๋ ์ฌ์ฉ์ ๋จ์๋ก ๋ฐ๊ธ๋๋ ID, mobile_id๋ ๋๋ฐ์ด์ค ๋จ์๋ก ๋ฐ๊ธ๋๋ ID, browser_id๋ ๋ธ๋ผ์ฐ์ ๋จ์๋ก ๋ฐ๊ธ๋๋ ID๋ผ๊ณ ์ ์ํ๊ฒ ์ต๋๋ค. ์ฌ์ฉ์๋ฅผ ๋ํํ๊ธฐ ์ฉ์ดํ ์์๋๋ก ID ํ์ ์ ๋์ดํ๋ฉด ad_id > mobile_id > browser_id ์์๊ฐ ๋ฉ๋๋ค. ์ด ์์๋ฅผ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๊ธฐ์ค์ ์ฐ์ ์์๋ก ์ฌ์ฉํฉ๋๋ค.
ID ๋งคํ ํธ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ ์์ฑ ์์
์ด๋ฏธ ๋งคํ ๊ฒฐ๊ณผ๊ฐ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋์ด ์๊ณ ์๋ก์ด ๋ก๊ทธ๊ฐ ์ค์๊ฐ์ผ๋ก ๋ค์ด์จ ์ํฉ์ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ์ฌ์ฉ์ ID๊ฐ ์ ์ฅ๋ id, ๊ธฐ์ค ID ํ์ ์ด ์ ์ฅ๋ root_type, ๋งคํ ๊ทธ๋ฃน ID๊ฐ ์ ์ฅ๋ group_id, ๋ก๊ทธ ์ด๋ฒคํธ ์๊ฐ์ด ์ ์ฅ๋ event_time ํ๋๊ฐ ์์ต๋๋ค. ์ด ์์์์๋ ์ด๋ฏธ ์ ์ฅ๋ ID ๋งคํ์ ์ด๋ฒคํธ ์๊ฐ์ด ์๋ก ์ ์ ๋ ์ด๋ฒคํธ ๋ก๊ทธ์ ์ด๋ฒคํธ ์๊ฐ๋ณด๋ค ์ต์ ์ธ ์ํฉ์ ๊ฐ์ ํ๊ณ ์์ต๋๋ค. ์ด๋ ํด๋น ์๊ณ ๋ฆฌ์ฆ์ด ๋ก๊ทธ์ ์ ์ ์์์ ์๊ด์์ด ๋์ผํ ๋งคํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํด๋ด๋ ๊ฒ์ ๊ฐ์กฐํ๊ธฐ ์ํ ์ํฉ์ ๋๋ค.
์ด์ด์ ํธ๋ฆฌ ๊ตฌ์กฐ ์์ฑ์ ๋จ๊ณ๋ณ๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค.
1. ํธ๋ฆฌ ๋ ธ๋ ์์ฑ
๋จผ์ ๋ ธ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ ์ ๋ ์ด๋ฒคํธ ๋ก๊ทธ์์ ์ฌ์ฉ์ ID๋ฅผ ์ถ์ถํ์ฌ ๋ก๊ทธ ๋ ธ๋๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฆผ์์๋ ์ฌ๊ฐํ ๋ ธ๋๋ก ํํ๋์์ต๋๋ค. ๋ก๊ทธ ๋ ธ๋์๋ ID ๊ฐ, ID ํ์ , ์ด๋ฒคํธ ์๊ฐ์ด ์ ์ฅ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๋ก๊ทธ ๋ ธ๋์ ์ฌ์ฉ์ ID์ ๋ํด์ ์ด๋ฏธ ๋งคํ๋ ๊ทธ๋ฃน ID๊ฐ ์๋์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ํฉ๋๋ค. ๊ฐ ๋ก๊ทธ ๋ ธ๋์ ๋งคํ๋ ๊ทธ๋ฃน ID๊ฐ ์๋ค๋ฉด ํด๋น ๊ทธ๋ฃน ID๋ฅผ ์คํ ๋ฆฌ์ง ๋ ธ๋๋ก ์์ฑํ์ฌ ๋ก๊ทธ ๋ ธ๋์ ์์ ๋ ธ๋๋ก ์ฐ๊ฒฐํฉ๋๋ค. ์คํ ๋ฆฌ์ง ๋ ธ๋์๋ ๊ทธ๋ฃน ID, ๊ธฐ์ค ID ํ์ , ์ด๋ฒคํธ ์๊ฐ์ด ์ ์ฅ๋ฉ๋๋ค.
2. ํธ๋ฆฌ ๊ตฌ์กฐ ์์ฑ
๋ง๋ค์ด์ง ๋
ธ๋๋ฅผ ๊ฐ์ง๊ณ ์์ ํ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์์ฑํฉ๋๋ค. ๋ก๊ทธ ๋
ธ๋๋ค์ ID ํ์
์ฐ์ ์์์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ฐ๊ฒฐํฉ๋๋ค. ์ฆ, ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ID ํ์
์ธ ad_id
๊ฐ ๊ฐ์ฅ ๋ง๋จ ๋
ธ๋๊ฐ ๋๊ณ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋ฎ์ ID ํ์
์ธ browser_id
๊ฐ ๋ฃจํธ ๋
ธ๋๊ฐ ๋ฉ๋๋ค. ์ฐ๊ฒฐ์ ์๋ฃํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด์ง ํธ๋ฆฌ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
3. ๊ฐ ๋ก๊ทธ ๋ ธ๋์ ๊ธฐ์ค ๋ ธ๋ ์ฐพ๊ธฐ
๊ฐ ๋ก๊ทธ ๋
ธ๋์ ๊ธฐ์ค ๋
ธ๋๋ฅผ ๊ฒ์ํฉ๋๋ค. ๊ธฐ์ค ๋
ธ๋๋ ์ฌ์ฉ์๋ฅผ ๊ฐ์ฅ ์ ๋ํํ ์ ์๋ ๋
ธ๋์
๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ ํด๋น ๋
ธ๋์ ID ํ์
์ด root_type
์ผ๋ก ์ ์ฅ๋ฉ๋๋ค. ๋ก๊ทธ ๋
ธ๋ ์์ ์ด ๋ง๋จ ๋
ธ๋์ธ ๊ฒฝ์ฐ๋ ์ค์ค๋ก๊ฐ ๊ธฐ์ค ๋
ธ๋๊ฐ ๋๊ณ ์๋ก์ด ๊ทธ๋ฃน ID๋ฅผ ๋ฐ๊ธํฉ๋๋ค. ๋ก๊ทธ ๋
ธ๋๊ฐ ๋ง๋จ ๋
ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ๋ ํด๋น ๋
ธ๋์ ์์์ธ ๋ง๋จ ๋
ธ๋ ์ค์์ ๊ธฐ์ค ๋
ธ๋๋ฅผ ์ฐพ์ต๋๋ค. ์์ ๋ง๋จ ๋
ธ๋ ์ค์์ ๊ธฐ์ค ๋
ธ๋๋ฅผ ์ฐพ๋ ์กฐ๊ฑด์ ์์๋๋ก ๋ค์ ๊ณผ ๊ฐ์ต๋๋ค.
- ID ํ์ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๋ ธ๋
- 1์ด ๋์ผํ ๊ฒฝ์ฐ, ์ด๋ฒคํธ ์๊ฐ์ด ๊ฐ์ฅ ์ต์ ์ธ ๋ ธ๋
- 1, 2๊ฐ ๋์ผํ ๊ฒฝ์ฐ, ์คํ ๋ฆฌ์ง ๋ ธ๋
- 1, 2, 3์ด ๋์ผํ ๊ฒฝ์ฐ, ๊ฒฝ๋ก๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋
b ๋ก๊ทธ ๋ ธ๋์ ๊ธฐ์ค ๋ ธ๋๋ฅผ ๊ฒ์ํ๊ฒ ์ต๋๋ค. ์์ ๋ง๋จ ๋ ธ๋๋ a, g2, g1์ ๋๋ค. ๊ทธ ์ค์์ ๊ธฐ์ค ๋ ธ๋ ์กฐ๊ฑด 4์ ๋ฐ๋ผ b ๋ก๊ทธ ๋ ธ๋์ ๊ธฐ์ค ๋ ธ๋๋ g1์ด ๋ฉ๋๋ค.
m ๋ก๊ทธ ๋ ธ๋์ ๊ธฐ์ค ๋ ธ๋๋ฅผ ๊ฒ์ํ๊ฒ ์ต๋๋ค. ์์ ๋ง๋จ ๋ ธ๋๋ a, g2์ ๋๋ค. ๊ทธ ์ค์์ ๊ธฐ์ค ๋ ธ๋ ์กฐ๊ฑด 2์ ๋ฐ๋ผ์ m ๋ก๊ทธ ๋ ธ๋์ ๊ธฐ์ค ๋ ธ๋๋ g2๊ฐ ๋ฉ๋๋ค.
a ๋ก๊ทธ ๋ ธ๋๋ ๋ง๋จ ๋ ธ๋์ด๋ฏ๋ก ์ค์ค๋ก ๊ธฐ์ค ๋ ธ๋๊ฐ ๋๊ณ ์๋ก์ด ๊ทธ๋ฃน ID๋ฅผ ๋ฐ๊ธํฉ๋๋ค.
4. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒฐ๊ณผ ์ ์ฅ
์์ฑ๋ ํธ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋งคํ ๊ฒฐ๊ณผ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ฅํฉ๋๋ค. b, m์ ๊ทธ๋ฃน ID์ ๋ณ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. a๋ ์๋ก ๋ฐ๊ธ๋ ๊ทธ๋ฃน ID๋ก ์ ์ฅ๋ฉ๋๋ค.
gRPC ๊ธฐ๋ฐ ID ์์ฑ๊ธฐ
ID ์์ฑ๊ธฐ๋ ID ๋งคํ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ๊ตฌํ์ฒด์ ๋๋ค. ์ข ๋ ์ ํํ ๋งํ๋ฉด, ์ ๋ ฅ์ผ๋ก ์ฌ์ฉ์ ID ๋ชฉ๋ก์ ๊ฐ๊ณ ์ถ๋ ฅ์ผ๋ก ๋งคํ๋ ๊ด๊ณ ์ฌ์ฉ์ ID๊ฐ ๋ฐํ๋๋ gRPC API ์๋ฒ์ ๋๋ค.
๋ค์ ๊ทธ๋ฆผ์ ID ์์ฑ๊ธฐ ์๋ฒ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ ๊ฐ์ ํด๋ผ์ด์ธํธ ์ฑ์ด ์์ต๋๋ค. ๊ฐ ์ฑ์๋ gRPC ํด๋ผ์ด์ธํธ๊ฐ ๋ด์ฅ๋์ด ID ๋งคํ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ID ๋งคํ ์ฑ์ ์์์ ์ค๋ช ํ Spark Structured Streaming์ผ๋ก ๊ตฌํ๋ ์ฑ์ ๋๋ค. Apache Kafka ํ ํฝ์ ํตํด์ ์ค์๊ฐ์ผ๋ก ๋งคํํ ์ ์ ID ๋ฆฌ์คํธ๊ฐ ๋ค์ด์ค๊ณ , ์ด ๋ฆฌ์คํธ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ํจ์๋ฅผ ํธ์ถํด ๋งค์นญ๋ ๊ด๊ณ ์ฌ์ฉ์ ID๋ฅผ ๋ฐํ๋ฐ์ต๋๋ค.
ID ์์ฑ๊ธฐ๋ ๋๋์ ํธ๋ํฝ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ ํด๋ผ์ด์ธํธ ๋จ์์ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํ๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑํ์ต๋๋ค. ํ๋ก์๋ฅผ ์ด์ฉํ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ๋ฐ๋์ ํ๋ก์๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ค๋ ์ ์์ ์ฑ๋ฅ์์ ์์ค์ด ์์ ์ ์์ต๋๋ค. ๋ํ gRPC๋ ํด๋ผ์ด์ธํธ ๋จ์์์ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ด ์ฉ์ดํ๋ค๋ ์ ๋ ์ฃผ์ํ์ต๋๋ค. ์๋ฒ์ ๋ชฉ๋ก๊ณผ ๊ฐ๋จํ ๋ช ๊ฐ์ง ์ต์ ์ ์ค์ ํ๋ฉด ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํด์ ์๋ฒ๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์๋ฒ ๋ชฉ๋ก์ ์ป๋ ๊ฒ๊ณผ ์๋ฒ ์ค์ง, ํฌ์ ์์ ๋ชฉ๋ก์ ๊ฐฑ์ ํ๋ ๊ฒ์ ์ง์ ๊ตฌํํด์ผ ํฉ๋๋ค. ๊ทธ๋์ ์ด๋ Apache ZooKeeper๋ฅผ ์ด์ฉํด์ ๊ตฌํํ์ต๋๋ค. ID ์์ฑ๊ธฐ๊ฐ ์์๋ ๋ ์๋ฒ๋ณ ์์ ์ง๋ ธ๋(znode)๊ฐ ์์ฑ๋ฉ๋๋ค. ์์ ์ง๋ ธ๋๋ ์ธ์ ์ด ๋๊ธฐ๋ฉด ์ญ์ ๋๊ธฐ ๋๋ฌธ์, ์๋ฒ๊ฐ ๋์ ์ค์ผ ๋๋ ์์ง ์ง๋ ธ๋๋ฅผ ์ ์งํ๋ค ์ค์ง๋๋ฉด ์ธ์ ์ด ๋๊ธฐ๊ณ ์๋์ผ๋ก ์ญ์ ๋ฉ๋๋ค.
Spark Structured Streaming ์ฑ
์์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ, ์ค์๊ฐ ๊ด๊ณ ์ฌ์ฉ์ ID ๋งคํ ์์คํ ์ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๋ก Apache Kafka์ ์ฌ๋ฌ Apache Spark ์ฑ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ์์คํ ์ค๊ณ์์ ์ค๋ช ํ Apache Spark ์ฑ ์ค์์ Spark Structured Streaming ์ฑ์ ๋ช ๊ฐ์ง ์ค์ ์ ๋ํด์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
๊ฐ Spark Structured Streaming ์ฑ์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋ฐ๋ผ ์ ์ ํ ํธ๋ฆฌ๊ฑฐ ์ต์ ์ ์ฌ์ฉํด์ ์คํํ์ต๋๋ค. ๋ฐฐ์น, ์คํธ๋ฆฌ๋ฐ ํธ๋ฆฌ๊ฑฐ ์ค์ ์ ๋ฐ๋ผ์ ๋ ธ๋์ ๋ฐ์ค์ ์ ์ผ๋ก ๊ตฌ๋ถํ์ต๋๋ค. ๊ฐ์ฅ ์ผ์ชฝ์ id extraction ์ฑ์ ์ ๋ ฅ์ด ์ค์๊ฐ ๋ฐ์ดํฐ์ด๊ณ ์๋์ฐ ๋จ์๋ก ์ค๋ณต์ ์ ๊ฑฐํ๊ธฐ ๋๋ฌธ์ fixed interval ํธ๋ฆฌ๊ฑฐ ์ต์ ์ ์ฌ์ฉํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ append HDFS file ์ฑ์ ์ถ๋ ฅ์ด HDFS์ด๊ณ ๋ถ์์ฉ์ด๊ธฐ ๋๋ฌธ์ ์ค์๊ฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ์ง ์์ผ๋ฏ๋ก once ํธ๋ฆฌ๊ฑฐ ์ต์ ์ ์ฌ์ฉํ์ต๋๋ค.
Spark Structured Streaming์ HDFS, Apache Kafka ๋ฑ ๋ช ๊ฐ์ง ์ฑํฌ(sink) ์ต์
์ ์ ๊ณตํฉ๋๋ค. ํ์ง๋ง ๊ธฐ๋ณธ ์ ๊ณตํ์ง ์๋ ์คํ ๋ฆฌ์ง๋ ์ง์ ์ฑํฌ๋ฅผ ๊ฐ๋ฐํด์ผ ๋ฉ๋๋ค. ์ธ์ปจ๋๋ฆฌ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ถ๋ ฅ์ ์ ์ฅํ๋ merge in-memory db ์ฑ์์๋ ์ง์ ์ฑํฌ๋ฅผ ๊ฐ๋ฐํด์ ์ฌ์ฉํ์ต๋๋ค. ์ปค์คํ
์ฑํฌ๋ foreachBath
๋ก ๊ตฌํํ ์ ์์ต๋๋ค. process
ํจ์์ dataframe
์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ์ฅํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ค์์ ์๋ ์ฝ๋์
๋๋ค.
df.writeStream
.outputMode(option.outputMode)
.option("checkpointLocation", option.checkpointPath)
.foreachBatch(process _)
def process(df: DataFrame, id: Long): Unit = {
import ss.implicits._
df.as[StorageRecord].foreachPartition { iter: Iterator[StorageRecord] =>
iter.grouped(batchSize).foreach(records => {
client.puts(-1, records.toList)
})
}
}
๋ง์น๋ฉฐ
์ค์๊ฐ ๊ด๊ณ ์ฌ์ฉ์ ID ๋งคํ์ ๊ฐ์ ์ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ฒซ ๋ฒ์งธ๋ก ๋ถ์ฐ ์ฒ๋ฆฌ์ ๋ง์ดํฌ๋ก ์์คํ ์ํคํ ์ฒ๋ฅผ ํตํ ํ์ฅ ๊ฐ๋ฅํ ์ค๊ณ๊ฐ ์์ต๋๋ค. ๋ํ gRPC๋ฅผ ํตํด์ ํด๋ผ์ด์ธํธ ์ฑ์ด ๋์ด๋๋ ์ ์ฐํ๊ฒ ๋์ฒ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํธ๋ฆฌ ๊ตฌ์กฐ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ID ํ์ ์ด ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ถ๊ฐ๋์ด๋ ์ ์ฐํ๊ฒ ๋์ฒํ ์ ์์ต๋๋ค.
์ด ๊ธ์ ํตํด์ ์ ํฌ๊ฐ ์ฌ์ฉ์ ID ๋งคํ์ ๊ตฌํํ๋ฉฐ ์ป์ ์ง์๊ณผ ๊ฒฝํ๊ณผ ๋๋ถ์ด ๋ ๋์ ์๋น์ค๋ฅผ ์ํ ์ธ์ฌ์ดํธ๋ฅผ ์ป์ผ์ จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
Info
์์ ๊ธ์ ์ฌ๋ด ๊ธฐ์ ๊ณต์ ํ์ฌ์ธ NAVER ENGINEERING DAY 2024์์ ๋ฐํํ ๋ด์ฉ์ ํ ๋๋ก ์์ฑ๋์์ผ๋ฉฐ, ๊ด๋ จ ์์์ ๋งํฌ์์ ๋ณด์ค ์ ์์ต๋๋ค.