하둡 완벽 가이드 - 15. SQOOP
본문 바로가기


Programmer/hadoop

하둡 완벽 가이드 - 15. SQOOP

사용자의 입장으로만 하둡을 바라보게 되어 깊이가 부족하다는 생각을 하게 되었다.
하둡 완벽 가이드를 읽고 이해한대로 정리한다.


스쿱은 HDFS 외부의 스토리지 저장소에 있는 데이터에 맵리듀스 프로그램이 접근할 수 있게 하는 외부 API 이다. 구조화된 데이터 저장소에서 데이터를 추출해서 하둡으로 보내 처리할 수 있도록 해주는 오픈 소스 도구다. 스쿱으로 데이터를 HBase로 옮길 수도 있다.

스쿱의 작동 방식과 데이터 처리 파이프라인에서 스쿱을 활용하는 방법을 살펴보자.

15.1 스쿱 얻기

스쿱은 여러 곳에서 내려받을 수 있다.

내려받아 sqoop 명령어로 호출할 수 있다.

15.2 스쿱 커넥터

스쿱 커넥터는 외부 저장 시스템에서 데이터를 하둡으로 임포트하거나 하둡에서 외부 저장 시스템에 익스포트 할 수 있도록 해주는 모듈식 컴포넌트다. 다양한 저장소에서 동작하는 커넥터를 내려받아 사용할 수 있다.

15.3 임포트 예제

1. 외부 저장 시스템(여기서는 mysql)에 테이블을 생성하고 데이터를 만든다
2. JDBC 드라이버 JAR(Connector/J)를 내려받아 스쿱의 lib 디렉터리에 저장한다. (커넥터다)
3. import 한다

sqoop import --connect jdbc:mysql://localhost/hadoopquide --table widgets -m 1

4. sqoop을 호출한 경로에 있는 hadoop에 테이블이 추가된다.

기본적으로 스쿱은 임포트한 데이터로 콤마로 구분된 텍스트 파일을 생성한다. 컬럼 구분자는 명시적으로 지정할 수 있으며, 필드 내용을 구분하는데 enclosing 및 escape 문자를 사용할 수 있다. 

15.3.1 텍스트와 바이너리 파일 포맷

텍스트 외에 바이너리 파일 포맷인 시퀀스 파일, 에이브로 데이터 파일, 파케이 파일으로도 임포트할 수 있다. 그러나 에이브로 데이터 파일 또는 시퀀스 파일을 하이브에 로드할 수 없다. (에이브로 데이터 파일은 수동으로 로드 할 수 있고, 파케이는 스쿱으로 바로 된다)
시퀀스 파일의 다른 단점은 자바 기반인 것이다.

15.4 생성된 코드

데이터베이스 테이블의 내용을 HDFS에 저장하는 것 외에도 스쿱은 로컬 디렉터리에 자바 소스 파일({테이블명.java})을 생성한다. 

스쿱은 HDFS에 쓰기 전에 데이터베이스 원본의 특정 테이블 데이터를 역직렬화하기 위해 미리 생성된 자바 코드를 사용한다. 이 코드는 맵리듀스에서 레코드를 처리하거나 레코드를 HDFS에 시퀀스 파일로 저장할 때 사용한다. 시퀀스 파일에 저장하는 임포트 과정에서 스쿱은 생성된 클래스를 사용해서 시퀀스 파일의 키-값 쌍 포맷의 "값" 항목에 임포트한 각 행을 저장한다.

테이블 명 말고 다른 이름으로도 자바 코드의 클래스 명을 지정할 수 있다.

15.5 임포트 자세히 살펴보기

스쿱도 하둡처럼 자바로 작성되었다. JDBC API로 애플리케이션이 RDBMS에 저장된 데이터에 접근할 수 있으며, 그 데이터의 특성을 파악할 수 있다. 대부분의 데이이터베이스 벤더는 JDBC API와 드라이버를 제공한다.

스쿱은 임포트를 시작하기 전에 JDBC로 임포트 대상 테이블을 검사하고, 모든 컬럼의 목록과 SQL 데이터 타입을 추출한다. 그리고 SQL 데이터 타입(VARCHAR, INTEGER등)을 맵리듀스 애플리케이션의 필드에 적용된 자바 자료형(String, Integer 등)으로 매핑한다. 그 다음 생성된 레코드와 컨테이너 클래스를 임포트 할 때 사용한다.

임포트 할 때 단순한 select 쿼리를 수행한다. 이러한 쿼리를 다수의 노드에 분산시키면 임포트 성능을 높일 수 있으므로, 기본키를 기준으로 분할 기준 컬럼으로 삼아 각 맵 태스크에 수행시킨다. 

15.5.2 임포트와 일관성

HDFS에 데이터를 임포트할 때 독립된 프로세스에서 맵 태스크가 병렬로 실행되므로 일관성 문제가 발생한다. 이 문제를 해결하기 위해 기존 행을 수정하는 프로세스의 실행을 막는 수밖에 없다.

15.6 불러온 데이터로 작업하기

text 기반의 임포트로 저장된 데이터는 하둡 스트리밍 스크립트나 기본 TextInputFormat으로 실행되는 맵리듀스 잡으로 쉽게 처리할 수 있다.

15.7 대용량 객체 임포트하기

대용량 객체는 보통 행 외부에 저장된다. 특정 쿼리 기준에 부합하는 행을 서낵하기 위해 행을 스캐닝할 때 보통 디스크의 행별로 모든 컬럼을 읽어 인라인 형태로 저장된다면 스캔 성능에 심각한 영향을 끼칠것이기 때문이다.