Amazon Redshift ์จ์ดํ์ฐ์ค๋ฅผ ๋์์ผ๋ก ๊ตฌ์ฑ
์ ๋ฒ ํฌ์คํ ๋ค์ ํตํด ์ํ๋ ์์ค ์์คํ ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋๋ฐ ์ด์ Redshift ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ์ฌ ๋ฐ์ดํฐ ์์ง์ ์๋ฃํ ์ฐจ๋ก์ด๋ค!
=> ๋ก๋ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ ์ถ์ถ ์ฐ์ถ๋ฌผ์ด ์ด๋ค ๋ชจ์ต์ธ์ง์ ๋ฐ๋ผ ๋ค๋ฆ
๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค๋ก Amazon Redshift๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ํ ๋ก๋ํ๊ธฐ ์ํด S3์ ํตํฉํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ๋ค
์ฐ์ S3์์ ์ฝ๊ธฐ์ ๊ด๋ จ๋ ๊ถํ์ Redshift ํด๋ฌ์คํฐ์ ์ง์ ํ ๋นํ IAM ์ญํ ์ ์์ฑํด์ผ ํ๋๋ฐ
IAM์ ํ์ ๋ฉ๋ด์์ ์ญํ ์ ์ ํํ๊ณ [์ญํ ๋ง๋ค๊ธฐ]๋ฅผ ํด๋ฆญํ ํ
์ ํํ AWS ์๋น์ค ๋ชฉ๋ก์์ Redshift๋ฅผ ์ฐพ์ ์ ํํ๊ณ [์ฌ์ฉ ์ฌ๋ก ์ ํ] ์์ 'Redshift - Customizable' ์ ์ ํํ๋ค
๊ถํ ์ ์ฑ ์ฐ๊ฒฐ์์ AmazonS3ReadOnlyAccess ๋ฅผ ํด๋ฆญํ๊ณ ์ญํ ์ ์ด๋ฆ์ RedshiftLoadRole๋ก ์ง์ ํด์ฃผ๋ฉด ๋จ
์ด์ ์ด๋ ๊ฒ ์์ฑํ IAM ์ญํ ์ Redshift ํด๋ฌ์คํฐ์ ์ฐ๊ฒฐํ ์ ์์
๋น์ฉ ์ด์ ๋๋ฌธ์ Amazon Redshift Serverless๋ฅผ ์ด์ฉํ๋๋ฐ ์ค์ ์ ๊ธฐ๋ณธ ์ค์ ๊ทธ๋๋ก ํ์๊ณ
IAM ์ญํ ์ฐ๊ฒฐ์์ ์๊น ๋ง๋ RedshiftLoadRole์ ์ ํํ๋ค!
The list of Amazon Resource Names (ARNs) for customer roles must contain the ARN of the default IAM role when a default is specified.
=> IAM ์ญํ ์ฐ๊ฒฐ์ ํ ๋ ์์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด RedshiftLoadRole์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํด์ฃผ๋ฉด ๋จ!
์ด์ [์์ ๊ทธ๋ฃน ์์ฑ] ์ ํด์ค์ผ ํ๋ค
๋จผ์ ์์ ๊ทธ๋ฃน ์์ฑ ํ, ํผ๋ธ๋ฆญ ์ก์ธ์ค๋ฅผ ํ์ฉํ๊ณ ๋ณด์ ๊ทธ๋ฃน์์ Redshift์ ๋ํ ์ธ๋ฐ์ด๋ ๊ท์น์ 0.0.0.0/0 ์ผ๋ก ํด์ค๋ค
๊ทธ๋ฆฌ๊ณ ์๋ก์ด ๋ค์์คํ์ด์ค๋ฅผ ์์ฑํด์ฃผ๋ฉฐ ์์ ๊ทธ๋ฃน์ ํ๋ ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค!
์ด์ pipeline.conf ํ์ผ์ ํ๋์ ์น์ ์ ์ถ๊ฐํด์ค์ผ ํ๋๋ฐ
Redshift ์จ์ดํ์ฐ์ค์ ๋ฐ์ดํฐ ๋ก๋
S3์์ Redshift๋ก ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ COPY ๋ช ๋ น์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค
=> COPY๋ ๋ก๋ ์ค์ธ ๋ฐ์ดํฐ๋ฅผ ๋์ ํ
์ด๋ธ์ ๊ธฐ์กด ํ์ ์ถ๊ฐํจ
(COPY๋ Redshift ํด๋ฌ์คํฐ๋ฅผ ์ฟผ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํ๋ SQL ํด๋ผ์ด์ธํธ๋ Boto3 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ํ์ด์ฌ ์คํฌ๋ฆฝํธ์์ SQL ๋ฌธ์ผ๋ก ์คํํ ์ ์๋ค!)
๊ธฐ๋ณธ์ ์ผ๋ก COPY ๋ช ๋ น์ ์ ๋ ฅ ํ์ผ์ ํ๋์ ๋์ผํ ์์๋ก ๋์ ํ ์ด๋ธ์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๊ธฐ ๋๋ฌธ์
๋ฌ๋ฆฌ ์ง์ ํ์ง ์๋ ํ ์ด ์์ ์์ ๋ก๋ํ๋ CSV์ ํ๋ ์์๋ Redshift์ ๋์ ํ ์ด๋ธ์ ์๋ ์ด์ ์์์ ์ผ์นํด์ผ ํจ!
(env) pip install psycopg2
=> ์์์ ๊ตฌ์ฑํ Redshift ํด๋ฌ์คํฐ์ ์ํธ์์ฉํ๋ ค๋ฉด psycopg2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ผ ํ๋ค
์ด์ copy_to_redshift.py๋ผ๋ ์ ํ์ผ์ ๋ง๋ค๊ณ ์ธ ๊ฐ์ ์ฝ๋ ๋ธ๋ก์ ์ถ๊ฐํ๋ค
1. S3 ๋ฒํท๊ณผ ์ํธ ์์ฉํ๊ธฐ ์ํด boto3, Redshift ํด๋ฌ์คํฐ์์ COPY ๋ช ๋ น์ ์คํํ๊ธฐ ์ํด psycopg2, ๊ทธ๋ฆฌ๊ณ pipeline.conf ํ์ผ์ ์ฝ๊ธฐ ์ํด configparser ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ
2. psycopg2. connect ํจ์์ pipeline.conf ํ์ผ์ ์ ์ฅ๋ ์๊ฒฉ์ฆ๋ช ์ ์ฌ์ฉํ์ฌ Redshift ํด๋ฌ์คํฐ์ ์ฐ๊ฒฐํ๊ธฐ
3. psycopg2 Cursor ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ COPY ๋ช ๋ น์ ์คํ
import boto3
import configparser
import psycopg2
parser = configparser.ConfigParser()
parser.read("../pipeline.conf")
dbname = parser.get("aws_creds", "database")
user = parser.get("aws_creds", "username")
password = parser.get("aws_creds", "password")
host = parser.get("aws_creds", "host")
port = parser.get("aws_creds", "port")
# redshift ํด๋ฌ์คํฐ ์ฐ๊ฒฐ
rs_conn = psycopg2.connect( "dbname=" + dbname + " user=" + user + " password=" + password + " host=" + host + " port=" + port)
# account_id ๋ฐ iam_role์ ๋ก๋
account_id = parser.get("aws_boto_credentials", "account_id")
iam_role = parser.get("aws_creds", "iam_role")
bucket_name = parser.get("aws_boto_credentials", "bucket_name")
# Redshift์ ํ์ผ์ ๋ก๋ํ๊ธฐ ์ํด COPY ๋ช
๋ น์ ์คํ
file_path = ("s3://" + bucket_name + "/order_extract.csv")
role_string = ("arn:aws:iam::" + account_id + ":role/" + iam_role)
sql = "COPY public.Oreders"
sql = sql + " from %s "
sql = sql + " iam_role %s;"
# cursor ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ COPY๋ฅผ ์คํ
cur = rs_conn.cursor()
cur.execute(sql, (file_path, role_string))
# cursor๋ฅผ ์ข
๋ฃํ๊ณ ํธ๋์ญ์
์ ์ปค๋ฐ
cur.close()
rs_conn.commit()
# ์ฐ๊ฒฐ์ ์ข
๋ฃ
rs_conn.close()
์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ธฐ ์ ์ ๋์ ํ ์ด๋ธ์ด ์์ง ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ๋จผ์ ์์ฑํด์ผ ํ๋ค!!
=> Redshift ์์ ์ฟผ๋ฆฌ ํธ์ง๊ธฐ๋ฅผ ํตํด ์์ SQL์ ์คํํ๋ฉด ๋จ
์ ๋ก๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค!
์ฆ๋ถ ๋ฐ ์ ์ฒด ๋ก๋
๋ฐ์ดํฐ ์ ๋ถ๊ฐ ์ถ์ถ๋ ๊ฒฝ์ฐ ๋ก๋ฉ ์คํฌ๋ฆฝํธ์ ์ถ๊ฐํด์ผ ํ ์ฌํญ์ด ํ๋ ์๋ค
=> COPY ์์ ์ ์คํ ํ๊ธฐ ์ ์ Redshift์์ ๋์ ํ ์ด๋ธ์ ์๋ผ์ผ ํ๋ค(TRUNCATE ์ฌ์ฉ)
# ๋์ ํ
์ด๋ธ์ truncate
sql = "TRUNCATE public.Orders;"
cur = rs_conn.cursor()
cur.execute(sql)
cur.close()
rs_conn.commit()
=> ์ด ๋ถ๋ถ์ COPY ๋ช ๋ น ์ ์ ์ถ๊ฐํด์ค๋ค!
๋ฐ์ดํฐ๊ฐ ์ฆ๋ถ ์ถ์ถ๋๋ค๋ฉด ๋์ ํ ์ด๋ธ์ ์๋ฅด๋ฉด ์๋๋ค!
=> ํ ์ด๋ธ์ ์๋ฅด๋ฉด ์ถ์ถ ์์ ์ ๋ง์ง๋ง ์คํ์์ ์ ๋ฐ์ดํธ๋ ๋ ์ฝ๋๋ง ๋จ๊ฒ ๋๋ค
(์ฆ๋ถ ์ถ์ถ์ ๋ฐฉ์์ ๋ฐ๋ผ ๊ธฐ์กด ๋ฐ์ดํฐ๋ค์ด ์ฌ๋ผ์ง ์ ์์)
์ด ๊ฒฝ์ฐ TRUNCATE ๋ง๊ณ COPY ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ๋ ์ฝ๋๊ฐ ๋ง์ง๋ง์ผ๋ก ์ ๋ฐ์ดํธ๋ ์๊ฐ์ ๋ํ๋ด๋ ํ์์คํฌํ์ ์์กดํ์ฌ ๋์ค์ ์ด๋ค ๋ ์ฝ๋๊ฐ ์ต์ ์ธ์ง ์๋ณํ๊ฑฐ๋ ๊ณผ๊ฑฐ ๋ ์ฝ๋๋ฅผ ๋ค์ ๋ณผ ์ ์๋ค!
๊ธฐ๋ก ๋ณด๊ด์ ๊ด์ ์์ ๋ณผ ๋ ๋์ ํ ์ด๋ธ์ ์ด ๋ ๊ธฐ๋ก์ ๋ชจ๋ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ์ด์์ ์
=> ์๋ฅผ ๋ค๋ฉด Orders ํ ์ด๋ธ์์ ์ฃผ๋ฌธ์ด ์ด์ ์ฃผ๋ฌธ๋ ์ํ์ ์ผ๋ง๋ ์ค๋ ์์๋์ง ์๊ณ ์ถ๋ค๋ฉด ๊ธฐ์กด ์ฃผ๋ฌธ ์ ๋ณด์ ์๋ก ๋ก๋๋ ์ฃผ๋ฌธ ์ ๋ณด ๋ชจ๋๋ฅผ ์ฌ์ฉํด์ผ ํจ
CDC ๋ก๊ทธ์์ ์ถ์ถํ ๋ฐ์ดํฐ ๋ก๋
๋ฐ์ดํฐ๊ฐ CDC ๋ฐฉ๋ฒ์ ํตํด ์ถ์ถ๋ ๊ฒฝ์ฐ ์ฆ๋ถ ์ถ์ถ๋ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ํ๋ก์ธ์ค์ ์ ์ฌํ์ง๋ง ์ฝ์ ๋ฐ ์ ๋ฐ์ดํธ๋ ๋ ์ฝ๋๋ฟ๋ง ์๋๋ผ ์ญ์ ๋ ๋ ์ฝ๋์๋ ์์ธ์คํ ์ ์๋ค!
insert|1|Backordered|2020-06-01 12:00:00
update|1|Shipped|2020-06-09 12:00:25
delete|1|Shipped|2020-06-10 09:05:12
=> ์ฃผ๋ฌธ ๋ ์ฝ๋๊ฐ ์ ๋ฐ์ดํธ๋ ๋ค์ ๋ ์ญ์ ๋์์์ ๋ณด์ฌ์ค
์์ ๊ฐ์ ์ํฉ์์ ์ ์ฒด ์ถ์ถ์์๋ ๋ ์ฝ๋๊ฐ ์์ ํ ์ฌ๋ผ์ก์ ๊ฒ์ด๊ณ , ์ฆ๋ถ ์ถ์ถ์์๋ delete๋ฅผ ๊ฐ์ ธ์ค์ง ์์ ๊ฒ์ด๋ค
๊ทธ๋ฌ๋, CDC์ ๊ฒฝ์ฐ ์ญ์ ์ด๋ฒคํธ๊ฐ ์ ํ๋์ด CSV ํ์ผ์ ํฌํจ๋๋ค!
์ญ์ ๋ ๋ ์ฝ๋๋ฅผ ์์ฉํ๋ ค๋ฉด ์ด๋ฒคํธ ์ ํ์ ์ ์ฅํ Redshift ์จ์ดํ์ฐ์ค์ ๋์ ํ ์ด๋ธ์ ์ด์ ์ถ๊ฐํด์ผ ํจ!
(Redshift๋ ์ด ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค)
=> EventType ์ด์ ์ถ๊ฐํ์ฌ ํน์ OrderId์ ๋ํ Insert, update, delete ๋ฑ์ ํฌํจ
๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์์ ๋ฐ์ดํฐ ์์ง์ ๋ชฉํ๋ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ถ์ถํ์ฌ ๋์์ผ๋ก ๋ก๋ํ๋ ๊ฒ
=> ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ธ๋งํ๋ ๋ก์ง์ ํ์ดํ๋ผ์ธ์ ๋ณํ ๋จ๊ณ์์ ๊ตฌํ
ํ์ผ ์คํ ๋ฆฌ์ง๋ฅผ ๋ฐ์ดํฐ ๋ ์ดํฌ๋ก ์ฌ์ฉ
S3 ๋ฒํท(๋๋ ๋ค๋ฅธ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง)์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ณ ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค์ ๋ก๋ํ์ง ์์ ๋๋ ์๋ค!
=> ์ด๋ ๊ฒ ์ ํํ ๋๋ ๋ฐ์ ํํ๋ ํํ๋ก ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ ๋ ์ดํฌ๋ผ๊ณ ํ๋ค
๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค์ ๋ฌ๋ฆฌ ๋ฐ์ดํฐ ๋ ์ดํฌ๋ ๋ค์ํ ํ์์ ๋ฐ์ดํฐ๋ฅผ ์๋ณธ ํ์ ๋๋ ๋์ ๋ฐ๋ผ ๋น์ ํ ํ์์ผ๋ก ์ ์ฅํ๋ค
=> ๋ฐ์ดํฐ ๋ ์ดํฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ์๋ ๋ ์ ๋ ดํ์ง๋ง ์จ์ดํ์ฐ์ค์ ์ ํํ๋ ๋ฐ์ดํฐ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฟผ๋ฆฌํ๋ ๋ฐ ์ต์ ํ ๋์ด ์์ง X
ํ์ง๋ง, ์ต๊ทผ ๋ช ๋ ๋์ SQL์ ์ต์ํ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ ๋ ์ดํฌ์ ๋ฐ์ดํฐ ์ฟผ๋ฆฌ์ ํจ์ฌ ๋ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌ ๋ค์ด ๋ฑ์ฅํจ
- Amazon Athena๋ ์ฌ์ฉ์๊ฐ SQL์ ์ฌ์ฉํ์ฌ S3์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ ์ ์๋ AWS ์๋น์ค
- Amazon Redshift Spectrum์ Redshift๊ฐ S3์ ๋ฐ์ดํฐ์ ์ธ๋ถ ํ ์ด๋ธ๋ก ์ก์ธ์คํ๊ณ Redshift ์จ์ดํ์ฐ์ค์ ํ ์ด๋ธ๊ณผ ํจ๊ป ์ฟผ๋ฆฌ์์ ์ด๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ก ํ๋ ์๋น์ค
์ ๋ฆฌ๋ฅผ ํด๋ณด์๋ฉด ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง ๊ธฐ๋ฐ ๋ฐ์ดํฐ ๋ ์ดํฌ์ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ์จ์ดํ์ฐ์ค์ ์ ์ฅํ๋ ๊ฒ๋ณด๋ค ๋น์ฉ์ด ์ ๋ ดํ๊ณ
๋น์ ํ ๋๋ ๋ฐ์ ํ ๋ฐ์ดํฐ๋ ๋ฏธ๋ฆฌ ์ ์๋ ์คํค๋ง๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์ ํ์ด๋ ์์ฑ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์จ์ดํ์ฐ์ค ์คํค๋ง๋ฅผ ์์ ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ฝ๋ค
(JSON ๋ฌธ์๋ ๋ฐ์ดํฐ ๋ ์ดํฌ์์ ์ ํ ์ ์๋ ๋ฐ์ ํ ๋ฐ์ดํฐ ์ ํ์ ์)
1. ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ ์ ์ด๋ ์ผ์ ์๊ฐ ๋์ ๋ฐ์ดํฐ ๋ ์ดํฌ์ ์ ์ฅํ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์๋ค!
2. ๋ฐ์ดํฐ ๊ณผํ์ ๋๋ ๋จธ์ ๋ฌ๋ ์์ง๋์ด๋ ํ๋ก์ ํธ์ ํ์ ๋จ๊ณ์์ ๋ฐ์ดํฐ๊ฐ ํ์ํ shape(๋ชจ์)์ด ๋ฌด์์ธ์ง ๋ชจ๋ฅผ ์ ์๊ธฐ์ ์๋ณธ ํํ๋ก ๋ฐ์ดํฐ ๋ ์ดํฌ์ ๋ํ ์์ธ์ค ๊ถํ์ ๋ถ์ฌํ์ฌ ๋ฐ์ดํฐ์ ์์ฑ์ ๊ฒฐ์ ํ ์ ์์
(๊ทธ ํ ์จ์ดํ์ฐ์ค์ ํ ์ด๋ธ์ ๋ก๋ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ธ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ -> ์ฟผ๋ฆฌ ์ต์ ํ)
'๐ณ Data Engineering > Data Pipeline' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐ์ดํฐ ์์ง : ๋ฐ์ดํฐ ์ถ์ถ (MongoDB, REST API, ์นดํ์นด ๋ฐ Debezium) (1) | 2024.07.02 |
---|---|
๋ฐ์ดํฐ ์์ง : ๋ฐ์ดํฐ ์ถ์ถ (MySQL) (1) | 2024.06.29 |
์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ํจํด (1) | 2024.05.15 |
์ต์ ๋ฐ์ดํฐ ์ธํ๋ผ (0) | 2024.05.12 |
๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ์๊ฐ (0) | 2024.05.06 |