1. redshift가 뭔가요?

- postgresql를 기반으로한 AWS의 서비스입니다.

- 실습에서는 데이터웨어하우스로 사용하기 위해 구축합니다.

- 관리형 데이터베이스 서비스인 RDS를 사용하면 Zero-ETL을 구축할 수 있습니다.

https://docs.aws.amazon.com/ko_kr/redshift/latest/dg/c_redshift-and-postgres-sql.html

 

Amazon Redshift 및 PostgreSQL - Amazon Redshift

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

https://docs.aws.amazon.com/ko_kr/redshift/latest/mgmt/serverless-whatis.html

 

Amazon Redshift 서버리스란 무엇인가요? - Amazon Redshift

Amazon Redshift 서버리스란 무엇인가요? Amazon Redshift Serverless는 데이터 웨어하우스 용량을 자동으로 프로비저닝하고 기본 리소스를 지능적으로 확장합니다. Amazon Redshift Serverless는 용량을 몇 초 만

docs.aws.amazon.com

 

2. Zero-ETL은 뭔가요?

- ETL 과정에서 복잡한 파이프라인 생성을 생략하는 기능입니다.

- AWS의 관리형 데이터베이스인 RDS를 사용하면 CDC 기능을 사용해서 redshift에 데이터를 바로 쌓을 수 있습니다.

- ETL은 데이터른 추출하고 변환하고 적재하는 과정을 말합니다.

- CDC는 데이터베이스의 변경되는 데이터를 바로 다른 DB나 저장소에 반영하는 것으로 생각하면 됩니다.

https://aws.amazon.com/ko/what-is/zero-etl/

 

제로 ETL이란? - 제로 ETL에 대한 설명 - AWS

제로 ETL은 ETL 데이터 파이프라인을 구축할 필요성을 없애거나 최소화하는 통합 세트입니다. 추출, 전환, 적재(ETL)는 다양한 소스의 데이터를 결합, 정리 및 정규화하여 분석, 인공 지능 (AI) 및 기

aws.amazon.com

 

3. 요금은 어떻게 나올까

- 기본적으로 저장된 데이터의 용량에 따라 월별 요금이 나옵니다.

- 그리고 쿼리 작업을 하는데 사용하는 컴퓨팅 리소스에 따라 요금이 나옵니다.

https://aws.amazon.com/ko/redshift/pricing/

 

클라우드 데이터 웨어하우스 – Amazon Redshift 요금–Amazon Web Services

 

aws.amazon.com

 

4. 너무 복잡해요!

- 용어에 대해서 너무 깊게 이해할 필요는 없습니다.

- 실습을 진행하면서 어떤 기능인지 눈으로 확인하고 이해해도 괜찮아요.

- 생각보다 redshift를 이용한 CDC 방법이 제일 쉬울 수 있습니다.

 

 

4. 다음 글 예고

- AWS에서 redshift를 직접 생성합니다.

1. 데이터 레이크란 무엇인가요?

- 어떤 서비스에서 생성되는 데이터를 모두 적재하는 저장소를 운영하는 것으로 생각하면 됩니다.

- 원천 데이터에서 저장소 까지 데이터를 적재하는 작업과 적재한 데이터를 잘 사용할 수 있도록 하는 작업이 주를 이룹니다.

 

2. AWS는 어렵지 않나요?

- 익히기는 어렵지만 로컬 컴퓨터에 실제 구축을 하는 것 보다 훨씬 적은 노력이 들어갑니다.

- 현재는 대부분의 기능은 자동으로 관리되는 관리형 기능이 많기 때문에 인프라 지식도 생각보다 많이 필요 없습니다.

 

3. 시작하며

- 대략적인 구조는 원천 데이터 베이스와 동일한 데이터를 가지는 데이터 웨어하우스를 만들고 파일로 적재합니다.

- 사용되는 기능은 s3, redshift, RDS, DMS, Athena 등이 있습니다.

- 당연히 AWS에 가입해서 리소스를 생성하는 작업이 있으니 AWS 계정을 생성하고 시작하세요!

- 사용에 따라 금액이 나올 수 있으나, 공부를 위해 조금은 투자를 한다고 생각하면 안 아까울지도??

1. airflow 테스트 환경 구축

- 간단한 테스트 환경 구축을 위해 airflow에서 제공하는 docker compose yaml파일을 사용한다.

- 아래의 스크린샷과 같은 부분에서 다운받을 수 있다.

- 링크 : https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html

curl로 다운하는 것도 가능하다

2. airflow에서 사용할 파이썬 라이브러리 추가 방법

- docker compose 파일에 간단하게 라이브러리를 추가하는 방법이 있다.

- airflow에서 pymysql이 기본으로 제공되지 않는데, pymysql을 설치하려면 아래와 같이 내용을 수정하고 저장하자.

## docker compose 파일에서 추가로 설치할 python module을 등록하는 경우
## 아래와 같은 environment 찾아서 수정 후 docker compose up -d
_PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:- pymysql}

## module을 여러개 설치해야하는 경우는 아래와 같이 공백으로 구분하여 추가한다
_PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:- pymysql pandas numpy}

3. airflow를 실행하자

- docker compose 파일이 있는 폴더에서 docker compose up -d으로 airflow 환경을 구축한다.

- airflow에서 사용하려는 port를 이미 사용하고 있는 경우 yaml에서 port 번호를 바꿔주도록 하자.

- 공식적으로 제공하는 파일에서는 id와 password는 모두 airflow이므로 변경이 필요하면 yaml에서 바꿔주자.

- localhost:8080 으로 접속해서 아래와 같은 창이 뜨면 테스트 환경 구축에 성공한 것이다.

 

'데이터 시스템 구축 정보 공유 > airflow' 카테고리의 다른 글

1. Airflow란?  (0) 2022.07.31

1. 2023년 정리
- 2023년에는 새로운 것을 많이 공부했지만 글로 정리는 많이 하지 못했다.
- 10월 말 부터는 건강에 큰 문제가 생겨서 회복에만 집중했다.
- 아직도 기복이 좀 있지만 이제 일상생활은 어느 정도 잘할 수 있게 됐다.

 


2. 블로그 계획
- 그동안 노션에만 정리하고 블로그에 올리지 못한 것을 정리해서 올리기로 했다.
- 초기 세팅부터 자세하게 쓰는 것을 목표로 했는데, 그것 때문에 오히려 작성을 미루는 경우가 많은 것 같았다.
- 이제는 실질적으로 필요한 내용만 적고, 참고했던 블로그나 문서를 레퍼런스로 달아두는 방식으로 하기로 했다.
- 너무 중복되는 내용들은 다른 블로그에도 많고, 나에게 필요한 내용이나 기억하고 싶은 것을 위주로 하기로 했다.


3. 주요 작성 내용
- 이번에는 에어플로우와 데이터레이크 구축 관련 내용을 주로 작성할 것 같다.
- 아마도 이번에는 데이터베이스나 실시간 데이터 처리에 대해서 많은 추가 내용을 적을 수 있을 것 같다.

1. 문제 상황

- with문으로 임시로 subquery를 작성하고 select를 하면서 확인하는 상황

- subquery 결과를 확인하는 도중 에러가 발생

 

2. 해결 방법

- athena에서는 주석이 있는 쿼리라고 해도 마지막 줄에 적어두면 안된다.

 

3. 예시

- 아래와 같은 경우에는 에러가 발생한다.

select * from my_kt1_subset;
-- select * from my_kt2_subset;

 

- 주석이 있어도 마지막 줄이 아닌 다른 줄에 쿼리를 임시로 저장해두자

-- select * from my_kt2_subset;
select * from my_kt1_subset;

1. 문제 상황

- AWS Athena에서 s3에 저장된 parquet 파일로 table을 만들었다.

- 생성은 문제없이 됐으나 "TYPE_MISMATCH: Unable to read parquet data. This is most likely caused by a mismatch between the parquet and metastore schema'"라는 에러 메세지가 발생

 

2. 해결 방법

- CREATE TABLE 관련 AWS 문서를 확인했다.

https://docs.aws.amazon.com/ko_kr/athena/latest/ug/create-table.html

 

CREATE TABLE - Amazon Athena

비 문자열 데이터 유형은 Athena에서 string으로 캐스팅할 수 없습니다. 대신 varchar로 캐스팅합니다.

docs.aws.amazon.com

- date 항목에 아래와 같은 내용이 있었다.

- parquet에 1970-01-01 보다 작은 날짜가 있는지 확인하고 그보다 작은 날짜는 수정했다.

parquet파일을 열어 확인해보니 birth_date에 1970년 보다 작은 날짜가 있다

 

3. 결론

- 날짜 형식을 쓰려면 1970-01-01보다 작은 날짜가 있는지 확인해야 한다.

- timestamp 형식을 쓰는 경우 1970-01-01 보다 큰 날짜 값만 사용하는 것을 상정해야 한다.

- 그보다 작은 날짜를 쓸 일이 있다면 string을 사용하여 날짜를 저장하고 사용하는 것이 좋을 것으로 보인다.

- 예를 들어 string으로 하는 경우 20230810 같은 방식으로 저장하면 된다.

'AWS 문제 해결 기록 > Athena' 카테고리의 다른 글

Only one sql statement is allowed.  (0) 2023.08.23

1. 문제 상황

- 기본 값을 사용하여 도커를 설치하는 경우 도커 컨테이너의 network는 172.17.xxx.xxx 대역으로 생성된다.

- 도커 기반의 서비스 구성에서 IP가 172.17.xxx.xxx인 곳에 접근하려는 경우 도커 브릿지 네트워크 대역폭과의 충돌이 문제가 되는 경우가 있다.

 

 

 

2. 해결 방안

- 기본으로 설정된 대역폭을 임의로 변경하여 문제를 해결한다.

- 기본적인 IP 대역폭을 변경하는 방법은 매우 쉽다.

- 아래의 설명대로 /etc/docker/daemon.json 파일을 설정을 변경하면 된다.

https://docs.docker.com/network/bridge/#use-the-default-bridge-network

 

Use bridge networks

 

docs.docker.com

 

 

 

3. 변경 과정

- /etc/docker/daemon.json 파일이 없는 경우에는 생성하면 된다.

- 일반적인 설정 값은 기본 값을 써도 무방하므로 아래와 같이 bip만 변경하자.

- ip는 예시 이므로 임의로 다른 것을 지정해도 된다.

{
  "bip": "192.168.1.1/24"
}

- 이후 도커 서비스를 restart하면 끝이고, 기존에 기본 네트워크를 사용하던 컨테이너들은 자동으로 새로운 대역폭으로 ip 생성된다.

1. 변수의 타입

- 변수는 크게 기본형과 참조형이 있다.

  • 기본형 : boolean, char, byte, short, int, long, float, double로 계산을 위한 실제 값을 저장하는 형식
  • 참조형 : 어떤 값이 저장되어 있는 메모리 주소를 저장. 기본형을 제외한 모든 형식

- 참조형 변수를 선언할때는 변수의 타입으로 클래스의 이름을 사용한다.

Date today = new Date(); // Date객체를 생성하고 today에 그 주소를 저장한다.

 

 

 

2. 기본형

- 기본형은 크게 4가지로 구분할 수 있다.

  • 논리형
    • boolean : true, false로 논리식 계산에 사용
  • 문자형
    • char : 문자를 저장하는데 사용
  • 정수형
    • byte, short, int, long : 정수를 저장하는데 사용. 주로 int를 사용하고 byte는 2진수, short는 C언어와 호환을 위해 사용한다.
  • 실수형
    • float, double : 실수를 저장하는데 사용. 주로 double이 사용된다.

- boolean은 다른 기본형과 변환과 연산이 불가능 하다.

- 다른 기본형은 서로 변환과 연산이 가능하다.

- 정수형이나 실수형은 사용할 값의 범위에 차이가 있는 것이므로 확인후 사용하자.

- 주로 boolean, char, int, double을 사용한다고 생각하면 된다.

 

 

 

3. 상수

- 상수는 일반 변수와 같은 방식으로 선언할 수 있지만, 그 값을 변경할 수 없다.

- 상수를 선언하는 방법은 변수 타입 앞에 final을 붙이면 된다.

- 상수는 반드시 선언과 동시에 초기화해야하고, 그 이후에는 값 변경이 불가능 하다.

class ConstantEx1 {
    public static void main(String[] args) {
        // 아래의 주석을 해제하고 실행하면 선언만 해서 에러가 발생하는 것을 볼 수 있다.
        // final int MY_CONSTANT;
        final int MY_CONSTANT = 100;
        System.out.println(MY_CONSTANT);
        
        // 아래의 주석을 해제하고 실행하면 MY_CONSTANT를 변경할 수 없다는 에러가 발생한다.
        // MY_CONSTANT = 200;
    }
}

 

 

 

4. 리터럴

- 변수가 가지고 있는 값 자체를 말하는 것이 리터럴이다.

- 예를 들면 final MY_NUM = 100; 의 리터럴은 100이다.

- 리터럴에는 접미사를 붙여서 구분한다.

class Literal {
    public static void main(String[] args) {
        int myInt = 100;
        long myLong = 100L;
        // _을 구분자로 사용할 수 있다. 결론적으로 100000000이 할당된다.
        long myLong2 = 100_000_000L;

        float myFloat = 1.23f;
        double myDouble = 1.23d;
        // d는 생략할 수 있다.
        double myDouble2 = 1.23;

        System.out.println(myLong2);
    }
}

 

1. 변수란?

- 단 하나의 값을 저장할 수 있는 메모리 공간

- 변수타입과 변수 이름을 작성하여 변수를 선언한다.

- 선언한 변수에 값을 넣어서 초기화 한다.

// 변수 선언과 초기화
int var1;
int var1 = 20;

// 타입이 같은 변수는 한 줄에 선언과 초기화를 할 수 있다
int var2, var3;
int var2 = 30, var3 = 35;

// 선언과 초기화를 동시에 할 수도 있다.
int var4 = 100;
int var5 = 300;

 

 

 

2. 변수 선언과 초기화

- 변수에 값을 저장하고 읽어오는 예제는 아래와 같다.

- 변수의 값이 int이므로 사칙연산의 결과가 변수가 할당된다.

class VarEx1 {
    public static void main(String[] args) {
        int year = 2022;
        int month = 8;

        System.out.println(year);
        System.out.println(month);
        
        year = year + 1000;
        month = year - 2000;
       
        System.out.println(year);
        System.out.println(month);
    }
}

 

 

 

3. 변수의 교환

- 이미 값이 할당된 변수에 다른 변수를 할당하면 다른 변수의 값이 할당된다.

class VarEx2 {
    public static void main(String[] args) {
        int var1 = 10;
        int var2 = 20;
        var2 = var1;
		
        // ""에 문자열을 적어서 출력할 수 있고, +를 사용해 변수와 합쳐서 결합된 문자열을 만들 수 있다.
        System.out.println("var1 :"+var1+", var2 :"+var2);

        var1 = 10;
        var2 = 20;
        int tmp = 30;
        var2 = tmp;

        System.out.println("var1 : "+var1+", var2 :"+var2);
    }
}

 

 

4. 변수의 명명 규칙

- 대소문자가 구분되어야하고 길이에 제한이 없다.

- 예약어는 사용해서는 안된다(if 등등)

- 숫자로 시작할 수 없다.

- 특수문자는 _와 $만 허용한다.

 

 

 

5. 그 외에 지키면 좋을 규칙

- 클래스의 이름의 첫 글자는 항상 대문자로 한다.

- 변수와 메서드의 이름의 첫 글자는 항상 소문자로 한다.

- 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다(lastIndex, StringBuffer)

- 상수의 이름은 모두 대문자로 한다, 여러 단어로 이루어진 경우 _로 구분한다(PI, MAX_NUM)

 

1. 시작은 'Hello, World.'

- Hello, World가 출력되는 프로그램을 작성해본다.

- Hello.java를 작성 -> javac.exe가 컴파일 -> Hello.class 생성 -> java.exe가 실행 -> 'Hello, World.'가 출력되는 방식으로 프로그램이 만들어진다.

 

 

 

2. 클래스 작성

- 자바에서 모든 코드는 클래스 안에 작성되어야한다.

- class 다음에 클래스 이름을 적고 {} 안에 코드를 작성한다.

- 주석은 한 줄에는 //, 여러 줄에는 /* 주석내용 */을 사용한다.

- 자바에서는 public static void main (String[] args)을 항상 선언해야한다.

- 아래와 같이 간단한 프로그램으로 위 내용을 확인해보자.

class Hello {
    public static void main(String[] args) {
        // 이건 한 줄 주석
    /* 이건
       여러줄
       주석 */
        System.out.println("Hello, world.");
    }
}

 

 

 

3. 클래스 파일 작성 시 주의점

- public 클래스와 파일 이름이 동일해야 한다.

- public 클래스가 없는 경우 어떤 클래스로도 이름을 정할 수 있다.

- public 2개가 한 파일에 존재할 수 없다.

- public 클래스의 이름은 대소문자도 구분해야한다.

+ Recent posts