2021년 4월 6일 화요일

Greenplum PXF - Object 스토리지 연동(s3, GCP, MinIO)

Greenplum-오브젝트 스토리지 연동 (PXF로 Greenplum과  S3, GCP, MinIO 연동하기)

참고링크: https://github.com/gpdbkr/GreenplumPXF


최근에 클라우드에 대한 요건이 많아지면서, DB와 오브젝트 스토리지 연동에 대해서 요건들이 발생하고 있습니다.

Greenplum은 하둡(HDFS, HiveORC, Hbase) 연동 이외에 오브젝트 스토리지인 S3, GCP, Minio에 대한 연동을 병렬로 지원하고 있습니다.


이때 중요한 것은 DB와 오브젝트 스토리지간의 단순 연동이 아닌, 병렬로 데이터 처리하는 것이 중요합니다. 병렬 프로세스의 경우 작게는 32개 많게는 54개~128개까지 처리할 수 있기에 성능적으로 엄청 큰 차이가 납니다.

 

또한 스토리지에서 저장된 데이터를 가져올 때 Parquet 포맷으로 할 경우 자체적으로 인덱스가 포함되어 있습니다. 이로써 스토리지에서 모든 데이터를 가져오는 것이 아니라, Parquet에서 필터링된 데이터만 가져오기 때문에 속도 개선과 소스시스템인 스토리지에 부하를 줄일 수 있습니다. 이러한 유형을 확인하기 위하여 CSV포맷과 Parquet 포맷 2개에 대한 예제를 작성하였습니다.


아래 테스트 스크립트는 Greenplum의 전체 Data Flow 중 object storage와 연결된 부분의 소스입니다. 






### AWS S3 연동

1. 테스트용 AWS 계정 생성

    - https://aws.amazon.com/ko/free/ 에 접속하면 5GB 미만으로 사용시 12개월 테스트 가능


2. S3 생성

   1) 버킷 만들기 : 버킷은 도메인주소 사용에 필요하여, DNS 형식으로 이름을 생성. 

       - 예시: tpcdsdemo

   2) 리전 : 서울

       - 나중에 필요함.(서울 코드 : ap-northeast-2)

   3) 옵션 중 "이 버킷의 퍼블릭 액세스 차단 설정" 체크 해제

       - 필요한 경우 일부 항목 체크 해제

   4) 나머지 옵션은 기본값으로 설정 후 "버킷 만들기" 클릭

       - 나머지 옵션들 추후 변경 가능


3. The AWS Access Key Id 생성

   1) 내보안자격증명 클릭 (Identity and Access Management(IAM))

      - AWS 웹콘솔에서 오른쪽 상단 접속 ID(계정)을 클릭하면 리스트가 나오며 중 "내 보안 자격 증명" 클릭

   2) 왼쪽 메뉴 중 "사용자" 선택 후 "사용자 추가"

      - 사용자 이름 입력 후 AWS 액세스 유형 선택은 "프로그래밍 방식 액세스" 선택 후 [다음: 권한] 클릭

   3) 기존 그룹이 있으면 그룹에 사용자 추가, 없으면 [다음: 태그] 클릭

   4) 태그 필요 시 입력, 없으면 [다음: 검토] 클릭

   5) 사용자 추가 완료 후 [.csv 다운로드] 선택하여 access key 파일 다운로드

      - 액세스 키 ID와 비밀 키 확인을 필요함. 생성시 다운로드만 가능

      ex) 액세스 키 ID : AKIAZZZZZZZ24HOEVVY 

          보안 액세스 키(비밀 키) : tMZZZZzzzZZZz+UBe+27ECIk6gNKojfpUqH/T

   6) 생성된 사용자 클릭 후 "권한"'이 사용자는 아직 권한이 없습니다. ~' 라고 나올시 우축 "인라인 정책 추가" 클릭

      - 서비스 : S3

      - 작업 : 모든 S3 작업(s3:*) 선택

      - 리소스 : 모든 리소스

      - 모두 선택 후 [정책 검토] 클릭

   7) 정책 검토에서 이름 입력 후 [정책 생성] 클릭


4. Greenplum 연동 테스트

  1) Greenplum pxf s3 설정

    $ mkdir $PXF_CONF/servers/s3srvcfg?         

    $ cp $PXF_CONF/templates/s3-site.xml $PXF_CONF/servers/s3srvcfg

   

    - 키입력

      YOUR_AWS_ACCESS_KEY_ID 에 액세스 키 ID 입력 

      YOUR_AWS_ACCESS_KEY_ID 와 보안 액세스 키 입력         

      $ cat s3-site.xml

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

  <property>

      <name>fs.s3a.access.key</name>

      <value>YOUR_AWS_ACCESS_KEY_ID</value>

  </property>

  <property>

      <name>fs.s3a.secret.key</name>

      <value>YOUR_AWS_SECRET_ACCESS_KEY</value>

  </property>

  <property>

      <name>fs.s3a.fast.upload</name>

      <value>true</value>

  </property>

</configuration>

  2) 설정을 Greenplum 데이터베이스 모든 클러스터에 싱크

  $ pxf cluster sync


  3) Greenplum에서 S3데이터 - text format unload/load  

CREATE WRITABLE EXTERNAL TABLE aws_s3.ext_w_catalog_returns 

(like tpcds.catalog_returns)

  LOCATION ('pxf://tpcdsdemo/catalog_returns.csv?PROFILE=s3:text&SERVER=s3srvcfg')

  FORMAT 'CSV' 

DISTRIBUTED BY (cr_item_sk, cr_order_number);


insert into aws_s3.ext_w_catalog_returns 

select * from tpcds.catalog_returns;


CREATE EXTERNAL TABLE aws_s3.ext_r_catalog_returns 

(like tpcds.catalog_returns)

  LOCATION ('pxf://tpcdsdemo/catalog_returns.csv?PROFILE=s3:text&SERVER=s3srvcfg')

  FORMAT 'CSV' ;


insert into aws_s3.catalog_returns_csv 

select * from aws_s3.ext_r_catalog_returns;


  4) Greenplum에서 S3 데이터 - parquet format unload/load 

CREATE WRITABLE EXTERNAL TABLE aws_s3.ext_w_catalog_returns 

(like tpcds.catalog_returns)

  LOCATION ('pxf://tpcdsdemo/catalog_returns.parquet?PROFILE=s3:parquet&SERVER=s3srvcfg')

  FORMAT 'CUSTOM' (FORMATTER='pxfwritable_export'

DISTRIBUTED BY (cr_item_sk, cr_order_number);


insert into aws_s3.ext_w_catalog_returns 

select * from tpcds.catalog_returns;


CREATE EXTERNAL TABLE aws_s3.ext_r_catalog_returns 

(like tpcds.catalog_returns)

  LOCATION ('pxf://tpcdsdemo/catalog_returns.parquet?PROFILE=s3:parquet&SERVER=s3srvcfg')

  FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import') ;


insert into aws_s3.catalog_returns_parquet 

select * from aws_s3.ext_r_catalog_returns;

 



### GCP 연동

1. 테스트용 구글 계정 생성

   - https://console.cloud.google.com/storage 에 접속하여 계정 생성. 신규 생성 시 90일동안 한화로 약 30만원 정도의 트래픽 사용 가능


2. GCP 버킷 생성

   1) Cloud Storage 브라우저에서 "버킷 만들기 클릭"

      ex) 

      - 버킷 이름 지정 : test

      - 데이터 저장 위치 선택 : Region / 위치 - asia-northeast3 (서울)

      - 데이터의 기본 스토리지 클래스 선택 : Standard

      - 객체 액세스를 제어하는 방식 선택 : 균일한 액세스 제어

      - 고급 설정(선택사항) : 기본

      - [만들기 ] 클릭

   2) 생성된 버킷 클릭 후 "권한" 탭 선택

      - 권한 -> 추가 선택 후 새 구성원에 "allUsers", 역할은 "저장소 관리자" 선택 후 [저장] 클릭

      - 팝업창에 [공개 액서스 허용] 클릭


3. IAM 키 생성

   1) IAM 및 관리자 메뉴 -> 서비스 계정 선택 후 "서비스 계정 만들기" 클릭

      ex)

      - 서비스 계정 세부정보 : tpcds

      - 이 서비스 계정에 프로젝트에 대한 액세스 권한 부여 : 저장소 관리자

      - 3번은 선택 사항. 안적어도 무방

      - [완료] 클릭

   2) 생성된 계정 클릭

      - 메뉴 중 "키" 탭에서 "키 추가 -> 새 키 만들기" 클릭

      - 키 유형은 JSON 선택 후 [만들기] 클릭

      - 비공개 키가 해당 브라우저를 통해 컴퓨터에 자동 저장됨

      - 해당 키.json 파일은 접속이 필요한 서버에 업로드 하여 사용



4. GCP? Greenplum 연동 테스트

  1) Greenplum pxf gcp 설정 

    $ mkdir $PXF_CONF/servers/gcssrvcfg

    $ cp $PXF_CONF/templates/gs-site.xml $PXF_CONF/servers/gcssrvcfg/?

    

    - IAM 키에서 발급한 gcs-account key json 파일 복사 

    - 키입력

      YOUR_GOOGLE_STORAGE_KEYFILE 에 json 파일경로 입력

      ex) /usr/local/greenplum-pxf/servers/gcssrvcfg/nimble-crane-329291-b019695d47c4.json 

      $ cat gs-site.xml

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

    <property>

        <name>google.cloud.auth.service.account.enable</name>

        <value>true</value>

    </property>

    <property>

        <name>google.cloud.auth.service.account.json.keyfile</name>

        <value>YOUR_GOOGLE_STORAGE_KEYFILE</value>

    </property>

    <property>

        <name>fs.AbstractFileSystem.gs.impl</name>

        <value>com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS</value>

    </property>

</configuration>

    

  2) 설정을 Greenplum 데이터베이스 모든 클러스터에 싱크

  $ pxf cluster sync



  3) Greenplum에서 GCP 데이터 - text format unload/load 

CREATE WRITABLE EXTERNAL TABLE gcp.ext_w_catalog_returns 

(like tpcds.catalog_returns)

  LOCATION ('pxf://tpcdsdemo/catalog_returns.csv?PROFILE=gs:text&SERVER=gcssrvcfg')

  FORMAT 'CSV' 

DISTRIBUTED BY (cr_item_sk, cr_order_number);


insert into gcp.ext_w_catalog_returns 

select * from tpcds.catalog_returns;


CREATE EXTERNAL TABLE gcp.ext_r_catalog_returns 

(like tpcds.catalog_returns)

  LOCATION ('pxf://tpcdsdemo/catalog_returns.csv?PROFILE=gs:text&SERVER=gcssrvcfg')

  FORMAT 'CSV' ;


insert into gcp.catalog_returns_csv 

select * from gcp.ext_r_catalog_returns; 


   4) Greenplum에서 GCP 데이터 - parquet format unload/load 

CREATE WRITABLE EXTERNAL TABLE gcp.ext_w_catalog_returns 

(like tpcds.catalog_returns)

  LOCATION ('pxf://tpcdsdemo/catalog_returns.parquet?PROFILE=gs:parquet&SERVER=gcssrvcfg')

  FORMAT 'CUSTOM' (FORMATTER='pxfwritable_export'

DISTRIBUTED BY (cr_item_sk, cr_order_number);


insert into gcp.ext_w_catalog_returns 

select * from tpcds.catalog_returns;


CREATE EXTERNAL TABLE gcp.ext_r_catalog_returns 

(like tpcds.catalog_returns)

  LOCATION ('pxf://tpcdsdemo/catalog_returns.parquet?PROFILE=gs:parquet&SERVER=gcssrvcfg')

  FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import') ;


insert into gcp.catalog_returns_parquet 

select * from gcp.ext_r_catalog_returns;



### MinIO 생성

1. minio 다운로드 

   $ wget https://dl.min.io/server/minio/release/linux-amd64/minio?   

   $ chmod +x minio?

2. minio 구동?

   $ ./minio server <스토리지로 사용할 폴더 경로>?


3. 버킷 생성?

   http://<minio ip>:9000     ?

   계정 : minioadmin/minioadmin?

   create bucket 클릭 후 생성

    

4. MinIO 연동 테스트

  1) Greenplum pxf Minio 설정 

    $ mkdir $PXF_CONF/servers/minio?

    $ cp $PXF_CONF/templates/minio-site.xml $PXF_CONF/servers/minio/?

   

    - 키입력 

     YOUR_MINIO_URL 에 URL 입력 

       ex) http://192.168.2.161:9000

     YOUR_AWS_ACCESS_KEY_ID와 YOUR_AWS_SECRET_ACCESS_KEY 에 아이디/패스워드 입력 

      $ cat minio-site.xml

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

    <property>

        <name>fs.s3a.endpoint</name>

        <value>YOUR_MINIO_URL</value>

    </property>

    <property>

        <name>fs.s3a.access.key</name>

        <value>YOUR_AWS_ACCESS_KEY_ID</value>

    </property>

    <property>

        <name>fs.s3a.secret.key</name>

        <value>YOUR_AWS_SECRET_ACCESS_KEY</value>

    </property>

    <property>

        <name>fs.s3a.fast.upload</name>

        <value>true</value>

    </property>

    <property>

        <name>fs.s3a.path.style.access</name>

        <value>true</value>

    </property>

</configuration>

  2) 새 서버 구성을 Greenplum 데이터베이스 클러스터에 복사

  $ pxf cluster sync

 

  3) Greenplum에서 MinIO 데이터 - text format unload/load 

CREATE WRITABLE EXTERNAL TABLE minio.ext_w_catalog_returns 

(like tpcds.catalog_returns)

  LOCATION ('pxf://tpcdsdemo/catalog_returns.csv?PROFILE=s3:text&SERVER=minio')

  FORMAT 'CSV' 

DISTRIBUTED BY (cr_item_sk, cr_order_number);


insert into minio.ext_w_catalog_returns 

select * from tpcds.catalog_returns;


CREATE EXTERNAL TABLE minio.ext_r_catalog_returns 

(like tpcds.catalog_returns)

  LOCATION ('pxf://tpcdsdemo/catalog_returns.csv?PROFILE=s3:text&SERVER=minio')

  FORMAT 'CSV' ;


insert into minio.catalog_returns_csv 

select * from minio.ext_r_catalog_returns;

  

  

  4) Greenplum에서 MinIO 데이터 -parquet format unload/load 

CREATE WRITABLE EXTERNAL TABLE minio.ext_w_catalog_returns 

(like tpcds.catalog_returns)

  LOCATION ('pxf://tpcdsdemo/catalog_returns.parquet?PROFILE=s3:parquet&SERVER=minio')

  FORMAT 'CUSTOM' (FORMATTER='pxfwritable_export'

DISTRIBUTED BY (cr_item_sk, cr_order_number);  


insert into minio.ext_w_catalog_returns 

select * from tpcds.catalog_returns;


CREATE EXTERNAL TABLE minio.ext_r_catalog_returns 

(like tpcds.catalog_returns)

  LOCATION ('pxf://tpcdsdemo/catalog_returns.parquet?PROFILE=s3:parquet&SERVER=minio')

  FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import') ;


insert into minio.catalog_returns_parquet 

select * from minio.ext_r_catalog_returns;


Greenplum Backup & Restore

Greenplum에서는 gpbackup과 gprestore를 이용해서 대량의 데이터를 병렬로 백업/병렬로 복구를 지원하고 있습니다. Full 백업이외에도 incremental 백업을 지원하고 있습니다.  - incremental 백업시에는 반드시 사전...