Limits of Facebook Prophet
Specific purpose and applications
โข
Time series data with patterns and seasonality
โข
Strong seasonality patterns: Data with similar patterns depends on timeย โย Login patterns, employee entry, commute patterns
โข
Naver Online Payment Reference -ย https://d2.naver.com/helloworld/0065813
๊ณผ๊ฑฐ์ ์ฅ๊ธฐ์ ์ธ ์ถ์ธ๋ฅผ ๋ณด๊ณ ์ดํ์ ๋๋ต์ ์ธ ์ถ์ธ๋ฅผ ํ์ธํ๋ ์ฉ๋๋ก ์ฌ์ฉํ ๋ Prophet ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ฅญํ ๊ฒฐ๊ณผ๋ฌผ์ ๋ณด์ฌ ์ค๋ค. ํนํ ๊ฐ์์ค๋ฐ ๋ฐ์ดํฐ์ ๋ณ๋์ด ์๋ ์ํฉ์์๋ ์ค์ ๋ฐ์ดํฐ์ ์์ฃผ ๊ทผ์ ํ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ ์ค๋ค.ํ์ง๋ง ๋ช
์ ์ด๋ ๊ธฐํ ์ํฉ์ ์ํด ๊ฑฐ๋๋์ด ํ์์ ์ผ๋ก ํ๋ฝํ๊ฑฐ๋ ์ฆ๊ฐํ๋ ๊ฒฝ์ฐ, ์ฌ์
ํ๋ ๋ฑ์ผ๋ก ์ธํด ์ ๋ฐ์ ์ธ ๊ฑฐ๋๋ ์์ฒด๊ฐ ๋ณ๋๋๋ ๊ฒฝ์ฐ ๋ฑ์์๋ ์ ์ ํ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ ์ฃผ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ์๋ค. ๊ณผ๊ฑฐ์ ์ถ์ธ๋ฅผ ๋ฐ๋ผ ์ฃผ๊ธฐ ํจ์๋ฅผ ๋ง๋ค๊ณ ์ดํ์ ๊ฑฐ๋๋ฅผ ์์ธกํ๋ ๋ชจ๋ธ์ ํ๊ณ ๋๋ฌธ์ด๋ค.
DB Active Session๊ณผ ํน์ ์ํ์ ํ๋งค ์ถ์ด๋ฅผ ๊ด๋ จ์์ผ ์์ธกํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฐ?
๊ณ ๋ ค๋์ด์ผ ํ Factor๊ฐ ๋๋ฌด ๋ง๋ค!ย โย ๋ฐ์ดํฐ ๊ณผํ์ ๋ฐ AI ์ ์์ญ
โข
์์ผ: ์์์ผ์ ์ ํ๋ฆฌ๋ ์ ํ์ด ์ผ์์ผ์๋ ์ ํ๋ฆฌ๋?
โข
์๊ฐ: ์ ๋
8์์ ์ ํ๋ฆฌ๋ ์ ํ์ด ์ค์ 8์์๋ ์ ํ๋ฆฌ๋?
โข
ํด์ผ: ํ์ผ์ ์ ํ๋ฆฌ๋ ์ ํ์ด ํด์ผ์๋ ์ ํ๋ฆฌ๋?
โข
์ธ๋ถ ์์ธ: ๋ ์จ, ๊ณ์ , ์ฌํ์ ์ด์(๋ง์คํฌ)์ ๋ฐ๋ผ ์ ํ๋ฆฌ๊ณ ๋ ํ๋ฆฌ๋๋ฐ ์ด๋ป๊ฒ ๊ฐ์ค์น๋ฅผ ๋ ๊ฒ ์ธ๊ฐ?
DB Active Session๊ณผ Plain ์ํ ํ๋งค ์ถ์ด๋ง ์กฐํฉํ์ฌ ์์ธก ๋ชจ๋ธ์ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๋ ๊ฒ์ผ๊น?
๊ณ ๋ ค๋๋ Factor (์ฌ์ฉ๊ฐ๋ฅ)
โข
์์ผ
โข
์๊ฐ
โข
ํด์ผ
Active Session ์นด์ดํธ์ ์ฃผ๋ฌธ ์๋์ ์ด๋ป๊ฒ ์กฐํฉํด์ ์์ธก ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ์ง ์๊ฐํด๋ณด์ (Prophet ์ผ๋ก ๊ฐ๋ฅํ๊ฐ?)
PoC
๊ทธ๋ ๋ค๋ฉด ์ฐ์ DB Active Session ๋ง ๊ฐ๊ณ ์์ธก์ ํด ๋ดค์๋ ์ด๋ ์ ๋ ๋ง๋์ง๋ฅผ ์ดํด๋ณด์
โข
DB Active Session ์นด์ดํธ์๋ง์ผ๋ก ์์ธก ๋ฐ์ดํฐ๋ฅผ ๋์
ํด๋ณด๊ณ ์ผ์ถ ๋ง๋์ง PoC ํด๋ณด์ย
โข
DB Active ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ InfluxDB ์ ์์งํ๋ค
โข
์? ๊ทธ๋๋ Static ํ ์๋ฆผ ํ๊ณ์น๋ฅผ ์ค์ ํด์ ํ๋ ๊ฒ ๋ณด๋ค ์ข ๋ Flexible ํ ์๋ฆผ ์์น๋ฅผ ์ ์ํด ์ค ์ ๋ ์๋ค.
WebDB Active User Session Count ์์ง ๋ฐ ์์ธก
์ค์๊ฐ์ ๋ฐํ์ผ๋ก ๊ณตํด์ผ ๋ฐ์ดํฐ ์ ๋ ฅํ์ฌ ์ ์ฉํ ๊ฒฐ๊ณผ
โข
๊ธฐ์กด ์ธ์
์๊ฐ ๋ฎ์ ๊ฒฝ์ฐ ์๋ฆผ์ ๋ฐ๋ ์ค์ ์ ์๋ค๊ณ ํจ
โข
์ธ์
์๋ฅผ 120์ ๋๊ฐ ๋๋ ๊ฒฝ์ฐ ์๋ฆผ์ ๋ฐ๊ณ ์๋ค๊ณ ํจ
โข
๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ผ์ด์ค๋ฅผ ์ดํด๋ณด์
โฆ
๋งค์ผ ์๋ฒฝ 2์ ๋ฐฐ์น ์์
์ ์นด์ดํธ ํ
โช
Sub-Daily ์ต์
์ ํ์ฉํด์ Fitting ํด๋ณด์ย
โช
On/Off Seasonality ๋ฅผ ํ์ฉํด์ Fitting ํด๋ณด์
๋งค์ผ 02:03~02:06 ์ฌ์ด ๋ฐฐ์น์์ ์ ๋ฐ์ดํฐ๋ ๊ทธ๋ํ์์ ์๋ณด์ด๊ฒ ์ฒ๋ฆฌ
โข
์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ์ถ๊ฐํ ์ด์ : ์์ธ ์๊ฐ์ ๊ฐ๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ์๋ฆฌ์ฆ์ ๋ฏธ๋ฆฌ ๋ฃ๊ณ Alert ์์ ์กฐ๊ฑด์ ๊ฑฐ๋ ์ฅ์์ ๋์ค์ ์ฌ์ฉ ์์ (๋ณผ ์๊ฐ ์์ผ๋ฉฐ, ํ์์ ์์ ํด์ผํ๋ฏ๋ก)
โข
์ถํ์๋ ์ฌ๋ฌ ์์
๋ค์ด ์๋ ์๊ฐ์ ๊ฒฝ์ฐ ๋ณ๋ ์๋ฆฌ์ฆ๋ก ๋ด๊ณ , ํด๋น Alert ์กฐ๊ฑด์ ํด๋น ์๊ฐ์๋ ์๋ฆผ ๋ณด๋ด์ง ์๋๋ก ์ค์ ํ๋ฉด ๊ฐ๋ฅ
โข
์ ์ด์ ๋ฐฐ์น ์์
์ ์ฌ์ฉ๋๋ ์ธ์
์ ์ ์ธํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์๋์ง ํ์ธ ํ์ย โ ์์
์ค์ ์๋ชป๋๋ ๊ฒฝ์ฐ๋ ๋ด์ผํ๋ฏ๋ก ๋ฐ์ดํฐ ๋ณด์ ํด์ผํจ
โข
Grafana ์์๋ ํน์ ์๊ฐ๋์ ์๋ฆผ์ ์๋ณด๋ด๋ ๋ฐฉ์์ ์์ฒญ์ด ๋ง์์ง๋ง ์์ง ๊ฐ๋ฐ๋์ง ์์
โข
๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก, ํด๋น ์๊ฐ/๋ถ์ ๊ฐ์ ํ
์ด๋ธ์ ์
๋ ฅํ๋๋ก ํ์ฌ, query ์กฐ๊ฑด์ ์
๋ ฅํจ
SELECT max("qty") FROM "active_session_webdb" WHERE $timeFilter and (hour != 2 and minute < 6 and minute > 3) GROUP BY time($__interval) fill(linear)
SQL
๋ณต์ฌ
Redis ์ ๋ณด ์์ง ๋ฐ ์์ธก ๋ฐ์ดํฐ ์์ฑ - Data ๊ธฐ๋ฐ ์ฅ์ ์ด์์งํ ๊ฐ์ง PoC
โข
ํ์ฌ: Prometheus ๋ก ์์ง๋๊ณ ์๋ ์๋ฃ๋ฅผ Grafana์ ์ฐ๋ํ์ฌ ๋ชจ๋ํฐ๋ง ์งํ์ค
โข
Redis์ Key ์นด์ดํธ๊ฐ ์ฆ๊ฐ๋ง ํ๊ณ ์ค์ด๋ค์ง ์๋ ๊ฒฝ์ฐ ์ฅ์ ๋ฐ์ ํ ์ ์์ (๋ฉ๋ชจ๋ฆฌ ์์ง)
โข
Key ์นด์ดํธ๋ฅผ ๋ณด๋ฉด ํจํด์ด ๋ณด์ด๊ธฐ๋ ํ์ฌ ์ ์ฉ ๊ฐ๋ฅ์ฑ์ด ๋ณด์
โข
๊ฐ์ Category ์์๋ Load Balancing ์ด ๋์ด ์๋์ง ๊ฑฐ์ ์ผ์นํ๋ ํจํด์ ๋ณด์ (์์
์์ ์ ์ ์ธํ๋ฉด ๋ค๋ฅธ ํจํด์ ๋ณด์ด๋ ๊ฒฝ์ฐ ์๋ฆผ์ ์ ์ฉ ํ ์ ์์์ง๋...)
โข
Redis ๋ฅผ ๋ฐ๋ผ๋ณด๋ WAS์ ๋์๋ฅผ ์ผ์ถ ๋น์ทํ๊ฒ ๋๋ ๋๊ณ ์ฌ์ฉํ๋ ํค์ฌ์ ๊ฐ์ ์นดํ
๊ณ ๋ฆฌ์ ์๊ฐ ๋ฌ๋ผ๋ ์ด์ํ ๊ฒ์ด ์์
โข
Key Count ๋ ์ ์ธ: MC ๊ฐ์ธํ์ ๊ฒฝ์ฐ 0์ด์ฌ๋ ์ด์ํ ๊ฒ์ด ์๋, ๊ทธ๋ฅ DB ์ฉ๋๋ก ์ฌ์ฉํ์ฌ ์ ์ธ
Data ์ ์ฅ ๊ณํ: Prometheusย โ InfluxDB
โข
Redis ์ ๋ณด๋ Prometheus ๋ก ์ ์ฅ๋์ด ์์
โข
Prometheus ์ ์์ธก ๋ฐ์ดํฐ๋ฅผ ์
ํ๋ ์์
์ ์ถ์ฒ๋์ง ์์
โฆ
์์ ๋ฐ์ดํฐ, ๋ฏธ๋ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ๋ฉด ์ ๋์ํ์ง ์๋๋ค๊ณ ๋ค์
Data ์ถ์ถ
โข
Prometheus RestAPI ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถ
โข
Python Pandas ๋ฅผ ํตํด DataFrame ์ Merge ํ์ฌ ํ๊ฐ์ InfluxDB์ ์ฃผ์
โข
InfluxDB ์ฃผ์
์ Facebook Prophet ์์ธก ๋ฐ์ดํฐ๋ ํจ๊ป ์ถ๊ฐย โ Prometheus ์ InfluxDB ์ฑํฌ ํ๋ก์ธ์ค๋ฅผ ์๋์ผ๋ก ์์ฃผํ๊ณ , ๋ณ๋ ํ๋ก์ธ์ค๋ก ์์ธก ๋ฐ์ดํฐ ์์ฑ ๋ฐฐ์น๊ฐ ํ์ํจ
โข
Prometheus ์์ ์ถ์ถ์ ์๋ฆฌ์ฆ๋น 11,000 ํฌ์ธํธ ์ด์ ์ถ์ถ์ 400 ์๋ฌ ๋ฐ์ย โ ๋ฒ์๋ฅผ ์ข๊ฒ ๋๋ ๊ทธ๋ฃนํ ํด์ ํด์ผํจ
Data ํ์ธ
Local ํ๊ฒฝ์ InfluxDB ์คํ
docker run -p 8086:8086 -v influxdb:/var/lib/influxdb influxdb
Local ํ๊ฒฝ์ Chronograf ์คํ
docker run -it --rm -p 18888:8888 chronograf --influxdb-url=http://*.*.*.*:8086
Data ์ฃผ์
Crontab ์ค์
โข
Prometheusย โ InfluxDB ๋ก ์ฑํฌ๋ 1๋ถ ์ฃผ๊ธฐ๋ก ๋ง์ง๋ง 2๋ถ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ์
โข
์์ธก ๋ฐ์ดํฐ ์์ฑ์ 30์ผ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ์๊ฐ + 3์๊ฐ ์์ธก ๋ฐ์ดํฐ๋ฅผ ์๊ฐ๋จ์๋ก 10๋ถ์ ์์ํ์ฌ 3์ธํธ(๊ณตํต, ๋งค์ฅ, ๊ณตํต)์ ์์ธก ๋ฐ์ดํฐ๋ฅผ ์ฃผ์
(๋ฐ์คํฌํ์์ ์คํ์ 28๋ถ์ ๋ ์์ ๋จ)
* * * * * /home/phil/Documents/prophet/redisSync.sh >> /home/phil/Documents/prophet/log_redisSync.log 2>&1
30 * * * * /home/phil/Documents/prophet/forecastRedisKeyCount.sh >> /home/phil/Documents/prophet/log_redisForecast.log 2>&1
Bash
๋ณต์ฌ
Data ์ ์ฉ ์์ ๋ฒ์
โข
Key Count: ์๋ฃ
โข
Client
์๋ฆผ ์ค์ ์์ฉ ์์ ๋ฒ์
โข
์ํ์ ์์ธก ๊ฐ ๋ฒ์ด๋๋ ๊ฒ์ ๋ํด ์๋ฆผ (๊ฒฝ๊ณ )
โข
์ธํธ๋ก ๊ตฌ์ฑ๋ ์๋น์ค์ ๋ํด์๋ ๋ ๊ทธ๋ํ์ ์ฐจ์ด๊ฐ ํน์ ๊ฐ์ด์ ๋ฒ์ด์ง๋ ๊ฒฝ์ฐ ์๋ฆผ (๊ฒฝ๊ณ )
โฆ
์) ๊ณตํต 1 vs ๊ณตํต 2 ๊ฐ์ด ๊ฐ์๊ธฐ ๋ง์ด ์ฐจ์ด๋๋ ๊ฒฝ์ฐ (์์ธก๋ฒ์์์ ๋ฒ์ด๋๋ ๊ฒ์ผ๋ก๋ ์ปค๋ฒ๊ฐ ๋ ๋ฏ)
Grafana ์ ์ฉ
Alternatives
Comming soon