1. ๊ฐ์
์กธ์ ์ํ์ผ๋ก POI (Point Of Interest) ์ถ์ฒ ์์คํ ์ ๊ฐ๋ฐํ๊ธฐ๋ก ํ๋ค.
ํ์ ์ค 2๋ช ์ด Python์ ์ฌ์ฉํ์ฌ AI ๋ชจ๋ธ์ ๊ฐ๋ฐํ๋ ๋ถ๋ถ์ ๋งก์๊ณ ,
๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ์ฌ DB์ ๋ฃ๊ณ , ํ์ต๋ AI ๋ชจ๋ธ์ ์๋น์ค๋ก ์ ๊ณตํ ์ ์๋๋ก ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ ์ญํ ์ ๋งก์๋ค.
AI ๋ชจ๋ธ์ ํ์ต ๋ฐ์ดํฐ๋ก๋ Yelp์ ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค. ๋ฐ์ดํฐ์ ์๋ ์ฝ 900๋ง ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์๊ณ , ์ด ๋ฐ์ดํฐ์ ์๋ก ์ถ๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ AI๋ฅผ ์ฌํ์ตํด์ผ ํ๋ค.
์ฒ์์๋ Spring ์๋ฒ๋ฅผ ๋์ฐ๊ณ , ์คํ๋ง ์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ Python ํ์ผ์ ์คํํ์ฌ ์ฌํ์ต์ ์งํํ ๊ณํ์ด์๋ค. ๊ทธ๋ฌ๋ ๋์ฉ๋ ๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ผ๋ก ์์๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์๋ Spring Batch๋ฅผ ์ฌ์ฉํ์ฌ Chunk ์ฒ๋ฆฌ๋ฅผ ํ์ง๋ง, ์ ํฌ ํ๋ก์ ํธ์์๋ ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๊ฐ์ ธ์จ ๋ค์ AI ๋ชจ๋ธ์ ํ์ต์ํค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์๋ฒ ์ธก๋ฉด์์๋ Python ํ์ผ ํ๋๋ฅผ ์คํํ๋ ๊ฒ ์ด์ธ์๋ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๋ค.
๊ณ ๋ฏผ ๋์, ์ค์ผ์ค๋ง์ ๋งก์ ํ๋ ์๋ฒ ํ๋, ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์๊ฐ๋ ์๋ฒ ํ๋, ์ด๋ ๊ฒ ์ด 2๊ฐ์ ์๋ฒ๋ฅผ ์ด์ฉํ๊ธฐ๋ก ํ๋ค.
spark๋ฅผ ํ์ฉํ ๋ถ์ฐ์ฒ๋ฆฌ๋ ์๊ฐํด๋ดค๋๋ฐ ํ์ด์ฌ ํ์ต ์ฝ๋์์๋ ์ ์ฉํ ์ ์๋๊ฑฐ๋ผ ์ฐ์ ์ ์ ๋ฐฉ๋ฒ๋๋ก ๊ตฌํํด๋ณด๊ธฐ๋ก ํ๋ค.
์ต์ข ์ํคํ ์ฒ๋ ์๋ ์ฌ์ง๊ณผ ๊ฐ๋ค
2. ํฌ๋ก ํญ(crontab)
์คํ๋ง์ ์ค์ผ์ค๋ง์ ์ด์ ์๋ ๋ง์ด ์จ๋ดค์ง๋ง ๋ฆฌ๋ ์ค๋ ์ ๋์ค ํ๊ฒฝ์์ ๊ฐ๋ณ๊ฒ ์ค์ผ์ค๋ง์ ํ ์ ์๋ ํฌ๋ก ํญ์ ๋ํด์ ์ฒ์ ์๊ฒ๋์๊ณ , ๋ฌด๊ฒ๊ฒ ์คํ๋ง ์๋ฒ๋ฅผ ๋์ ์ค์ผ์ค๋ง์ผ๋ก๋ง ์ฌ์ฉํ๋ ๊ฒ ๋ณด๋จ ์ข๋ค๊ณ ์๊ฐํ์ฌ ๋์ ํ๊ฒ ๋์๋ค.
ํฌ๋ก ํญ์ด๋??
๋ฆฌ๋ ์ค๋ ์ ๋์ค ํ๊ฒฝ์์ ์คํ ํ๋ก๊ทธ๋จ์ ์ค์ ํ ์๊ฐ์ ์๋์ผ๋ก ์คํํ ์ ์๋๋ก ์ค์ ํด์ฃผ๋ ํ๋ก๊ทธ๋จ์ด๋ค.
์คํ ํ๊ฒฝ์ ์ค์ ํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ํ ์๊ฐ, ๋ ์ง ๋๋ ๊ฐ๊ฒฉ์ ์ง์ ํ์ฌ ์ฃผ๊ธฐ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์คํ๊ฐ๋ฅํ๋ค.
์์คํ ์ ์ง๊ด๋ฆฌ๋ฅผ ์ํ ์๋ํ๋ฅผ ์ํด ์ด์ฉ๋๊ณ ํ์ผ ๋ค์ด๋ก๋๋ ์ ๊ธฐ์ ์ด๋ฉ์ผ ๋ค์ด๋ก๋๋ฅผ ์ํ ์์ ์๋ ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ค.
ํฌ๋ก ํญ ์ค์น๋ ์์ฃผ ๊ฐ๋จํ๊ฒ ํ ์ ์๋ค.
ํฌ๋ก ํญ ์ค์น
$ sudo apt install cron # ํฌ๋ก ํญ ์ค์น
$ sudo service cron status # status ํ์ธ, ์ ์: active
$ sudo service cron start # ํฌ๋ก ํญ ์๋น์ค ์์
์์ ํ ๋น
$ crontab -e
ํ ๋น๋ ์์ ๋ฆฌ์คํธ ํ์ธ
$ crontab -l
๋ช ์ค๋ง ์ถ๊ฐํ๋ฉด ์ ๋ง ๊ฐ๋จํ๊ฒ ์ค์ผ์ค๋ง ๋ฑ๋กํ ์ ์์๋ค.
์์ ํ ๋นํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ๊ฒ ์์๋ณด์.
๋๋ ์ ์คํฌ๋ฆฝํธ ํ์ผ์ ์ค์ผ์ค๋ง์ ๋ฑ๋กํ๋ค.
ํ ์คํธ์ฉ์ผ๋ก ๋ฑ๋กํ๊ธฐ ๋๋ฌธ์ 1๋ถ๋ง๋ค ๋์๊ฐ๋๋ก ์ค์ ํด์ฃผ์๋ค.
์๋ ๋ช ๋ น์ด๋ "1๋ถ๋ง๋ค /home/kevin/scheduler/test.sh ํ์ผ์ source ๋ช ๋ น์ด๋ก ์คํ์์ผ๋ผ" ์ด๋ค.
* * * * * source /home/kevin/scheduler/test.sh
ํฌ๋ก ํ์์ ๋ค์๊ณผ ๊ฐ๋ค.
* * * * *
๋ถ(0-59) ์๊ฐ(0-23) ์ผ(1-31) ์(1-12) ์์ผ(0-7)
์์ ๊ฐ์ด ๋ชจ๋ ๋ณํ์๋ฉด ๋งค๋ถ, ๋งค์๊ฐ, ๋งค์ผ, ๋งค์, ๋งค์์ผ์ ์๋ฏธํ๋ค. ์์ผ์ 0, 7์ ์ผ์์ผ์ ์๋ฏธํ๋ฉฐ ์์์ผ์ 1, ํ ์์ผ์ 6์ ํด๋นํ๋ค.
์๋๋ ๋ช๊ฐ์ง ์์์ด๋ค.
// ํฌ๋ก ํญ ์ฃผ๊ธฐ
* * * * * {์คํ ๋ช
๋ น}
// ์ ์์๋๋ก ๋ถ ์ ์ผ ์ ์์ผ {์คํ ๋ช
๋ น}
๋ถ : 0-59
์ : 0-23
์ผ : 0-31
์ : 0-12
์์ผ : 0-6 (์ผ-ํ : 0๊ณผ 7์ ์ผ์์ผ์ด๋ฉฐ 1๋ถํฐ ์์์ผ)
// ๋งค ๋ถ๋ง๋ค ์คํ
* * * * * {์คํ ๋ช
๋ น} or /1 * * * * {์คํ ๋ช
๋ น}
// ๋งค ์ ์ ๊ฐ์ ์คํ
0 * * * * {์คํ ๋ช
๋ น}
// ๋งค์ผ ์คํ 13์ ์ ๊ฐ์ ์คํ
0 13 * * * {์คํ ๋ช
๋ น}
// ๋งค์ฃผ ์์์ผ ์์ ์ ์คํ
0 0 * * 1 {์คํ ๋ช
๋ น}
// ๋งค๋ฌ 5์ผ ์์ ์ ์คํ
0 0 5 * * {์คํ ๋ช
๋ น}
// ๋งค์ 25๋ถ, 55๋ถ์ ์คํ
25,55 * * * * {์คํ ๋ช
๋ น}
// 15๋ถ๋ง๋ค ์คํ
*/15 * * * * {์คํ ๋ช
๋ น}
// ๋งค์ผ 3์์ ์คํ
0 3 * * * {์คํ ๋ช
๋ น}
// ๋งค 6์๊ฐ๋ง๋ค(00:30, 06:30, 12:30, 18:30) ์คํ
30 */6 * * * {์คํ ๋ช
๋ น}
// 1์๋ถํฐ ๋งค 6์๊ฐ๋ง๋ค(01:30, 07:30, 13:30, 19:30) ์คํ
30 1-23/6 * * * {์คํ ๋ช
๋ น}
// ํ์ผ(์์์ผ~ํ ์์ผ) 06:00์ ์คํ
0 6 * * 1-6 {์คํ ๋ช
๋ น}
// ํ ์์ผ 07:00์ ์คํ
0 7 * * 6 {์คํ ๋ช
๋ น}
ํฌ๋ก ํญ ์ฌ์์
crontab ์ค์ ๋ณ๊ฒฝ ํ ํญ์ cron ์๋น์ค๋ฅผ ์ฌ์์ํด์ผ ํ๋ค.
์๋ ๋ช ๋ น์ด์ค ํ๋๋ฅผ ์คํํ๋ฉด๋๋ค.
cron restart ๊ฐ ์๋๋ค crond restart ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
service cron restart
service crond restart
password๋ฅผ ์น๊ณ ์ฌ์์ ํด์ฃผ์
2. SCP
์์์ ํฌ๋ก ํญ์ผ๋ก ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์์ผฐ๋๋ฐ,
ํ์ด์ฌ ์ฝ๋๊ฐ ์๋ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํจ ์ด์ ๋ ํ์ด์ฌ ์ฝ๋๋ฅผ ๋๋ ค ๋์จ ๊ฒฐ๊ณผ ํ์ผ(์ถ์ฒ ๋ชจ๋ธ)์ ์คํ๋ง ์๋ฒ๋ก ์ ์กํด์ค์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
์์ง ai ๋ด๋น ํ์๋ค๋ ๊ฐ๋ฐ ์ค์ด๊ธฐ ๋๋ฌธ์ ์์ฑ๋๋ค ๊ฐ์ ํ๊ณ ํ ์คํธ๋ฅผ ์งํํด๋ณด์๋ค.
๋ด ์ ์คํฌ๋ฆฝํธ ์ฝ๋์ ํ์ด์ฌ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
- test.sh
python3 /home/kevin/scheduler/batch.py
# ํ์ด์ฌ ์คํฌ๋ฆฝํธ ์คํ ํ ์์ฑ๋ result.txt ํ์ผ์ xxx ํธ์คํธ๋ก ์ ์กํฉ๋๋ค.
scp /home/kevin/scheduler/result.txt kevin@*.*.*.*:/home/kevin
- batch.py
# ํ์ผ open
with open("/home/kevin/scheduler/result.txt", "w") as file:
for i in range(10):
file.write("test\n")
SCP๋ฅผ ํด์ฃผ๊ธฐ ์ํด์ ๋ชฉ์ ์๋ฒ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํด์ผํ๊ธฐ ๋๋ฌธ์ ์ด ๊ณผ์ ์ ์๋ตํ๊ธฐ ์ํด ๊ณต๊ฐํค๋ฅผ ๋ฑ๋กํด์ฃผ์๋ค.
ssh-keygen -t rsa
์ ๋ช ๋ น์ ์ ๋ ฅํ๋ฉด ๋ช๊ฐ์ง๋ฅผ ๋ฌผ์ด๋ณด๋๋ฐ ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด ๊ทธ๋ฅ ์ํฐ๋ฅผ ๊ณ์ ๋๋ฌ์ ์๋ฃํ๋ฉด ๋๋ค. ์ด๋ ๊ฒ ์์ฑํ๊ณ ๋๋ฉด ๊ฐ์ธํค๋ ~/.ssh/id_rsa๋ก ๊ณต๊ฐํค๋ ~/.ssh/id_rsa.pub๋ก ์์ฑ๋๋ค. ์ด์ ๋ ๊ณต๊ฐํค๋ฅผ ๋ณด๋ด๋ ค๋ ๋ชฉ์ ์ง ์๋ฒ์ ๋ฑ๋กํด์ผ ํ๋ค.
scp /userId/.ssh/id_dsa.pub [host๋ช
]@[ip]:/home/kevin
๋ชฉ์ ์ง ์ด๋ ํ ๊ณต๊ฐํค๊ฐ ์ ์๋์ง ํ์ธํ๊ณ ๋ฑ๋กํด์ค๋ค.
authorized_keys ๋ผ๋ ํ์ผ์ ๋ง๋ ํ ๋ด์ฉ์ ์ถ๊ฐํ๋๋ฐ, authorized_keys ํ์ผ์ด ๋ค๋ฅธ ์ปดํจํฐ์ ํค๋ฅผ ์ ์ฅํ๊ณ ์์ ์ ์๊ธฐ๋๋ฌธ์, ํ์ผ์ ์ด๋ฏธ ๋ด์ฉ์ด ์๋ค๋ฉด (์ํ์ผ์ ๋ฎ์ด์ฐ์ง์๊ณ ) ๊ณต๊ฐํค ํ์ผ ๋ด์ฉ์ ๋ค์ ์ถ๊ฐํด์ผ ํ๋ค.
cat id_dsa.pub >> /userId/.ssh/authorized_keys
๋ณด์์ ์ํด ํผ๋ฏธ์ ์ ๋ณ๊ฒฝ
$ chmod 700 /userId/.ssh/
$ chmod 644 /userId/.ssh/authorized_keys
์ด๋ ๊ฒ ํ ์คํธ๋ ๋์ด๋ฌ๋ค.
๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฌ ๊ฒฝํ์ด ์ฒ์์ด๋ผ ๋ฐ์ดํฐ์ ๊ฐ๊ณต๊ณผ DB ๋๋ ์ฝ์ ๋ฑ ์์์น ๋ชปํ ์ด๋ ค์์ด ์์๋ค. ๋ํ ์ธ๋ฑ์ฑ์ ์ค์์ฑ์ ์ ์คํ ๋๋ ์ ์์๋ค. ์ธ๋ฑ์ฑ์ ํ์ง ์์์ ๋์ ์ฐจ์ด๋ ์ ๋ง ์ด๋ง๋ฌด์....
๋ด๊ฐ ์๊ฐํด๋ธ ๋ฐฉ์์ด ์ต์ ์ธ์ง์ ๋ํ ์๋ฌธ์ด ๋ค์๊ณ , ์ฌ๋ฌ ์ฌ๋๋ค์๊ฒ ์กฐ์ธ์ ๊ตฌํ๊ณ ์์๋ณด์์ง๋ง, ๋ง๋ ํ ๋ค๋ฅธ ํด๊ฒฐ์ฑ ์ ์ฐพ์ง ๋ชปํ๋ค.
๋จ์ ์กธ์ ๊ธฐ๊ฐ๋์ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋ ๊ณ์ ์ฐพ์๋ณผ ์์ ์ด๋ค..