
- AWS Redshift
- 실습

AWS에서 지원하는 데이터 웨어하우스 서비스로, 최소 160GB로 시작해서 점진적으로 용량 증감하여 2PB의 데이터까지 처리 가능하다. AWS Redshift는 다음과 같은 특징이 있다.
AWS Redshift는 용량이 부족해질 때마다 새로운 노드를 추가하는 방식으로 스케일링을 수행한다. 만약 dc2.large를 사용하고 있다면,
이를 Resizing이라 부르며 Auto Scaling 옵션을 설정하면 자동으로 이뤄진다. 이는 Snowflake나 BigQuery의 방식과는 굉장히 다르다. 위의 두개는 특별히 용량이 정해져있지 않고 쿼리를 처리하기 위해 사용한 리소스에 해당하는 비용을 지불하는 형식이다.
즉, Snowflake와 BigQuery가 훨씬 더 스케일하는 데이터베이스 기술이라 볼 수 있지만 비용의 예측이 불가능하다는 단점이 존재한다.
만약 Redshift가 두 대 이상의 노드로 구성되면 그 시점부터 테이블 최적화가 중요하다. 한 테이블의 레코드들을 어떻게 다수의 노드에 분산 저장 하는 지와, 또 한 노드 내에서 순서를 정해주어야 한다. 3가지의 속성을 어떻게 설정하느냐에 따라서 어떤 방식으로 저장되는지가 결정된다.
all, even(default), key)key인 경우)
다음의 코드는 'my_table의 레코드들을 column1의 값을 기준으로 분배되고 같은 노드(슬라이스) 안에서는 column3의 값을 기준으로 sorting이 된다.
CREATE TABLE my_table(
column1 INT,
column2 VARCHAR(50),
column3 TIMESTAMP,
column4 DECIMAL(18,2)
) DISTSTYLE KEY DISTKEY(column1) SORTKEY(column3) ;


구성은 기본적으로 설정되어 있는 것을 쓰도록 하자. 구성 저장을 누르고 잠시 기다리면 설치가 완료된다.

처음 Redshift를 생성하면 무료 평가판으로 3개월 간 300$의 크레딧을 사용할 수 있다. 꼭 확인해서 추가적인 과금에 조심하도록 하자.

Redshift를 사용하기 위해 먼저 우리가 생성한 클러스터의 엔드포인트를 확인해 보자. 이 엔드포인트는 나중에 외부에서 연결할 때 필요하므로 복사해 두자.


다음으로는 액세스할 수 있는 계정 설정을 해야한다. 두가지 방법이 있는데 이 실습에서는 1번으로 진행해보자.
다시 대시보드로 돌아가서 네임스페이스로 이동한다.

오른쪽의 작업을 누르고 '관리자 보안 인증 정보 편집'을 누른다.


외부에서 접근을 허용하기 위해 퍼블릭 액세스를 허용하게 설정을 바꿔야 한다.

네트워크와 보안 탭에서 편집해주자.


VPC security group에서 인바운드 규칙도 추가적으로 설정해주어야 한다.



구글 COLAB을 이용해서 redshift에 연결 후 실습을 진행하기 위해 방금 까지 우리가 확인했던 정보를 기억해두자.
이 정보를 이용해서 구글 COLAB에서 연결하면 된다


!pip install ipython-sql==0.4.1
!pip install SQLAlchemy==1.4.49

CREATE SCHEMA raw_data;
CREATE SCHEMA analytics;
CREATE SCHEMA adhoc;
CREATE SCHEMA pii;
select * from pg_namespace;

CREATE USER sasngwon PASSWORD 'password(대소문자1개, 특수문자1개 포함)';
select * from pg_user;

CREATE GROUP analytics_users;
CREATE GROUP pii_users;
CREATE GROUP analytics_authors;
ALTER GROUP analytics_authors ADD USER sangwon;
ALTER GROUP analytics_users ADD USER sangwon;
ALTER GROUP pii_users ADD USER sangwon;
select * from pg_group;

CREATE ROLE staff;
CREATE ROLE manager;
CREATE ROLE external;
GRANT ROLE staff TO sangwon; -- sangwon 대신에 다른 역할(Role)을 지정 가능
GRANT ROLE staff TO ROLE manager;
SELECT * FROM SVV_ROLES;

COPY 명령을 사용해 raw_data 스키마 및 3개의 테이블에 레코드를 적재해보자.
- 각 테이블을 CREATE TABLE 명령으로 raw_data 스키마 밑에 생성
- 이때 각 테이블의 입력이 되는 CSV 파일을 먼저 S3로 복사해야함. (S3 버킷부터 미리 생성하기)
- S3에서 해당 테이블로 복사를 하려면 Redshift가 S3 접근권한을 가져야함
따라서 먼저 Redshift가 S3를 접근할 수 있는 역할을 만들고 (IAM 웹콘솔)
이 역할을 Redshift 클러스터에 지정해야 함 (Redshift 웹 콘솔)
최종적으로 다음과 같은 테이블을 만들면 된다.


AWS S3에 들어가서 버킷 만들기를 누른 뒤 버킷이름을 설정하고 나머지는 기본으로 버킷을 만들어보자.

이후 버킷안에 우리가 준비한 csv 파일들을 업로드하면 된다.

AWS IAM을 이용해 이에 해당하는 역할(Role)을 만들고 이를 Redshift에 부여하면 된다.





우리가 만든 Redshift의 namespace로 이동한 뒤 '보안 및 암호화' 탭에서 방금 만든 IAM role을 추가해주자.




COPY 명령을 사용해서 앞서 업로드한 CSV파일을 테이블로 복사해보자.
CREATE TABLE raw_data.user_session_channel (
userid integer ,
sessionid varchar(32) primary key,
channel varchar(32)
);
COPY raw_data.user_session_channel
FROM '(S3 버킷에 업로드한 파일의 URI)'
credentials 'aws_iam_role=(아까 만든 역할의 ARN)'
delimiter ',' dateformat 'auto' timeformat 'auto' IGNOREHEADER 1 removequotes;
SELECT * FROM raw_data.user_session_channel LIMIT 10;

강의가 꼼꼼하고 따라 하기 쉽게 구성이 되어있어서 실습하는데 어려움은 없었다. 그래도 AWS의 과금 압박은 무섭다... 시간당 0.25$ 라고 하니까 문제될 건 없겠지만 그래도 꼼꼼하게 체크하는 습관을 들여야 겠다.