INSERT INTO
는 내가 적재하려는 데이터의 수가 적을 경우 선호되는 방식이다.root 유저
로 로그인해야 한다.docker exec --user root -it Scheduler_Container_ID sh
sudo apt-get update
sudo apt-get install -y default-libmysqlclient-dev
sudo apt-get install -y gcc
sudo pip3 install --ignore-installed "apache-airflow-providers-mysql"
Access Key ID
와 Secret Access Key
를 사용하는 것으로 바뀌었다.Access Key ID
와 Secret Access Key
를 사용하고 주기적으로 변경해 준다.{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::s3이름",
"arn:aws:s3:::s3이름/*"
]
}
]
❓ Daily Update이고, 테이블 이름이 A이고 MySQL에서 읽어온다면
SELECT * FROM A WHERE DATE(MODIFIED) = DATE(EXECUTION_DATE)
SELECT * FROM A WHERE DATE(MODIFIED) = DATE(EXECUTION_DATE)
UPSERT
를 지정s3_to_redshift_nps = S3ToRedshiftOperator(
task_id = 's3_to_redshift_nps',
s3_bucket = s3_bucket,
s3_key = s3_key,
schema = schema,
table = table,
copy_options=['csv'],
redshift_conn_id = "redshift_dev_db",
aws_conn_id = "aws_conn_id",
method = "UPSERT",
upsert_keys = ["id"], #id를 기준으로 있는 레코드인지 없는 레코드인지를 확인해 주고 없다면 새로 만드는 것을 redshift에서 알아서 처리해 줌
dag = dag
)
✍ 어떻게 backfill로 구현할 것인가?
1. SqlToS3Operator
- SqlToS3Operator는 MySQL의 SQL 결과를 S3에 적재해 준다.
- 이때 S3 어떤 bucket에 적재를 할 것인지에 대해 설정해 주어야 한다.
- s3://s3_bucket/s3_key
2. S3ToRedshiftOperator
- S3를 Redshift 테이블로 COPY 해 준다.
- 이때 파라미터를 제대로 넘겨 주어야 한다.
- (s3://s3_bucket/{ID}-nps) -> Redshift (스키마.nps)
3. DB slave/master
Master
와Slave
는 DB의 구조인데Replication(복제) 매커니즘
을 이용해 DB 데이터를 물리적으로 복사해 다른 곳에 넣어 두는 기술을 의미한다.- DB 트래픽 분산과 백업을 위해 도입된 개념으로
Master
은 메인 프로세스를 담당하고,Slave
는 그외 보조의 일을 담당하는 것이다.- 예를 들어 DB 트래픽 분산 시
Master DB
는 데이터의 변경(INSERT, UPDATE, DELETE)을 하고,Slave DB
는 데이터를 읽기(SELECT)만 한다. 이후 변경이 일어난 데이터들이 Master DB에서 Slave DB로 전달된다.- 즉,
Master
는 데이터 동시성이 아주 높게 요구되는 트랜잭션을 담당하고,Slave
는 읽기만 데이터 동시성이 꼭 보장될 필요 없는 경우에 읽기 전용으로 데이터를 가지고 오게 된다.