본문 바로가기
학습장/Data Engineering

Sqoop ETL

by daedoo_ 2021. 2. 21.

Sqoop (SQL to Hadoop)

Sqoop은 RBMS <-> HDFS 사이에 데이터 ETL을 위해 만들어진 프로젝트이며,

하둡의 YARN, MapReduce 위에서 동작하는 하둡 에코시스템의 툴 중의 하나입니다.

 

CLI로 간단하게 DB와 HDFS사이에 ETL 실행 가능

--query 옵션을 사용하면 가져올 데이터에 select 쿼리 사용 가능

--num-mapper (또는 -m ) 옵션으로 병렬성 크기 지정가능

 

다양한 종류의 DB 지원

MySQL의 경우 기본적으로 지원하며, 그 외에 DB는 jdbc 드라이버를  /var/lib/sqoop 에 위치시켜야 함.

 

주요 명령어

sqoop eval

실제 적재 작업이 수행되지는 않고, --query 파라미터에 작성된 쿼리를 RDB에서 수행하여 결과값 출력

해당 RDB와의 통신 확인 또는 정상 동작체크 

 

sqoop import

RDB -> HDFS 에 적재할 때 사용

parquet, text, csv, avro 등의 형식 지원

적재하고자 하는 테이블에 decimal 타입의 컬럼이 포함되어 있다면 avro 타입으로 저장해야함.

parquet으로 수행해도 에러는 나지 않지만, 해당 parquet을 읽을 때 에러발생

( java.lang.UnsupportedOperationException, Parquet.column.Dictionary.decodeToInt )

#!/bin/bash

sqoop import \
--connect jdbc:mysql://10.59.68.12/db_name \
--username xxxx \
--password xxxx \
--query "select * from table1 where d_col1 >= '2020-01-01' and d_col1 <= '2020-12-31' and \$CONDITIONS" \
--m 10 \
--target-dir hdfs경로 \
--split-by key_col \
--as-parquetfile

Query로 병렬 import 시 쿼리문에 $CONDITIONS 키워드 포함해야함

$CONDITIONS 위치에 맵퍼들이 n빵한 split-by 컬럼값이 할당되어 수행됨 ( "" 로 쿼리를 감쌀 경우에는 \$CONDITIONS 와 같이 사용)

 

 

import 주요 옵션

-m 또는 -num-mapper

병렬 import를 위한 인자값으로 맵퍼 프로세스 개수 지정

RDB와 YARN 리소스의 가용한 자원 범위하에서 적절히 사용하면 수행속도 크게 향상

RDB 테이블 데이터가 많은 경우 맵퍼 개수를 적게 설정하면 에러 발생할 수도 있음

( GC Overhead limit exceeded error )

 

--split-by 

병렬 import 시에 분할할 기준 컬럼 (1개만 지정 가능, PK 또는 인덱스 설정 된 컬럼)

해당 컬럼의 min, max 값을 추출해서, num-mappers 값에 따라 분할하여 각 맵퍼에 할당

min/max을 바탕으로 맵퍼 갯수만큼 n빵하므로 해당 컬럼 값이 균등하게 분포하지 않으면 속도 보장 안됨

 

mapper들은 소스DB에서 각자 세션 마다 아래와 같은 SQL을 수행하여 소스 데이터를 퍼온다.

$CONDITIONS 부분에 split-by 에 지정된 컬럼이 나뉘어진 범위로 들어감

mapper1 - select * from table1 where d_col1 >= '2020-01-01' and d_col1 <= '2020-12-31' and (key_col >= 0 and key_col < 100)
mapper2 - select * from table1 where d_col1 >= '2020-01-01' and d_col1 <= '2020-12-31' and (key_col >= 100 and key_col < 200)
mapper3 - select * from table1 where d_col1 >= '2020-01-01' and d_col1 <= '2020-12-31' and (key_col >= 200 and key_col < 300)
...

 

sqoop export

HDFS -> RDB에 적재 시에 사용

타겟 테이블은 미리 생성 되어있어야 함

import 처럼 num-mapper 지정 가능

#!/bin/bash

sqoop export \
--connect jdbc:mysql://192.59.68.12/db_name \
--username xxxx \
--password xxxx \
--table target_table
--export-dir 타겟테이블에 적재할 hdfs경로 \
--m 10 \
--verbose

 

 

export 관련 좀 더 자세한 사항은 아래 포스팅 참고 부탁 드립니다.

 

 

sqoop export

지난번에 sqoop 주요 명령어 별 기본 파라미터에 대해 포스팅 하였습니다. 2021.02.21 - [학습장] - Sqoop ETL 금일은 sqoop export 관련 테스트시 확인하였던 내용들을 기록하고자 합니다. parquet 파일로 테

ourhistory160109.tistory.com

 

'학습장 > Data Engineering' 카테고리의 다른 글

sqoop export  (0) 2021.03.12
pyspark groupBy 샘플코드  (0) 2021.03.01
DataStage Job Xml export  (0) 2021.01.17
Hadoop 설치(2)  (1) 2021.01.10
Cloudera 활용한 Hadoop 설치  (0) 2021.01.10

댓글