본문 바로가기
프로N잡러/프로그래밍&자격증

[GPDB] 6. Loading Data

by 뮤지구 2024. 1. 9.

 

 

INSERT (병렬처리x, master 거침)

- 일반적인 db 에서 지원되는 insert 문

- 적은 수의 row를 진행할 경우 사용

- INSERT INTO <table> SELECT FROM <external table>

 

COPY (병렬처리x, master 거침)

- postgreSQL 명령어로, 명령어 1번으로 모든 row 를 load 함.

- file 이나 standard input에서 table로 데이터를 넣을 때 사용

더보기

COPY

  • 모든 데이터는 Master 를 통해 load 됨
  • Master 를 거쳐 처리되기 때문에 한꺼번에 대량의 데이터를 다루기엔 어려울 수 있음 (병렬처리x)
COPY mytable FROM '/data/myfile.csv ’ WITH CSV HEADER;
COPY 'select * from mytable TO '/data/my_output_file';

 

  • Syntax

- REJECT LIMIT ~ ROWS : 각 segment 별로 ~건 이상 오류가 발생할 경우 rollback

  • Error 발생 
    - db 의 시스템 로그에 들어가며, 누적되어 쌓이므로 별도로 관리해주어야 함
 

External Table & gpfdist (병렬처리, master 거치지 않음)

- gpfdist : 파일을 병렬처리하기 위한 process 

- gpload : gpfdist 와 external table을 활용하여 I/F

external table 은 로컬 테이블처럼 보여지며, 해당 테이블을 gpload 를 통해 데이터를 가져옴

gpload 실행 시 gpfdist 띄우고 external 생성/삭제 등 일련의 과정들을 내부적으로 실행해줌

 

External Table 상세 설명

더보기

 

 

1) file

- 파일을 직접적으로 연결하여 external table 생성

 

2) gpfdist

- gpfdist agent를 통하여 connection을 열어주고, 해당 connection 을 통해 external table 생성

- gpfdist 가 mdw를 통하지 않고 각각 sdw와 직접 통신함. 

- 이 때, 들어오는 데이터가 분산키에 맞지 않다면 각 sdw 가 mdw 처럼 다른 sdw 로 보내주는 역할도 진행.

 

3) Web Table Protocol

- sh 파일 실행의 경우 superuser 로서 모두 실행 가능한 상태여야 함

 
  •  
  • Error 발생 


gpload

  • gpload 사용을 위해 yaml 파일 정의가 필요
  • gpu, memory, network 리소스 여유가 있다면 여러개 gpload 동시 수행 가능
  • 많은 양의 데이터를 load 하는 경우, 진행 전 index는 drop, 진행 후 vacuum/analyze 작업 진행 권장.
  • 명령어

명령어 예시)

gpload f <YAML conf file>

gpload d vpdb h 172.28.12.250 p 5432 f conf gpload_orders.conf l log/ gpload_orders.log

 

  • yaml file 예시)

 


PXF

  • Hadoop 연동하여 data load 하게끔 하는 I/F
  • Profile 예시

실습

1) copy

-- copy 를 이용하여 d_airlines 테이블에 데이터 로드
COPY training.d_airlines 
FROM '/home/gpadmin/data/L_AIRLINE_ID.csv' 
csv
log errors
segment reject limit 50 rows;

-- 에러 로그 확인
SELECT * FROM gp_read_error_log('training.d_airlines');
-- 에러 로그 삭제
SELECT gp_truncate_error_log ('training.d_airlines');

-- copy 구문 수정하여 데이터 다시 로드
TRUNCATE TABLE training.d_airlines ;
COPY training.d_airlines 
FROM '/home/gpadmin/data/L_AIRLINE_ID.csv' 
Csv header
log errors
segment reject limit 50 rows;
 

2) gpfdist

--server에서 gpfdist process 올려놓기
 gpfdist -d /home/gpadmin/data -p 8080 >> gpfdist.log 2>&1 &

--db external table 생성 후 insert
CREATE EXTERNAL TABLE training.ext_f_otp_load
 (LIKE training.f_otp_load)
 LOCATION ('gpfdist://mdw:8080/otp*.gz')
 FORMAT 'csv' (header) LOG ERRORS SEGMENT REJECT LIMIT 50000 rows;
 
--INSERT INTO training.f_otp_load
SELECT * FROM training.ext_f_otp_load;

--오류 확인
SELECT DISTINCT relname, errmsg, count(*)
 FROM gp_read_error_log('training.ext_f_otp_load')
GROUP BY 1, 2;

--오류 데이터행만 별도 파일로 저장
SELECT rawdata FROM gp_read_error_log('training.ext_f_otp_load');
COPY (SELECT rawdata FROM gp_read_error_log('training.ext_f_otp_load'))
TO '/home/gpadmin/data/f_otp_load.bad' ;
 

3) gpload

--gpload.yaml 파일 설정 (맨 밑 REUSE_TABLES=TRUE, FALSE 둘다 실행해봄)

--SERVER에서 GPLOAD 실행

gpload -d testdb -f gpload.yaml
 

Quiz

2, 4, 5