아파치 스쿱
IT 위키
더 많은 작업
- Apache Sqoop; 스쿱
- 관계형 데이터베이스 같은 구조화된 저장소와 하둡 사이에서 대량의 데이터를 주고받는 도구. 맵리듀스로 전송을 병렬 처리한다
스쿱(Sqoop)은 관계형 데이터베이스(RDBMS)의 테이블을 HDFS, 하이브, HBase로 가져오거나(import), 하둡에서 처리한 결과를 다시 RDBMS로 내보내는(export) 명령줄 도구다. 공식 문서는 스쿱을 "아파치 하둡과 관계형 데이터베이스 같은 구조화된 데이터 저장소 사이에서 대량의 데이터를 효율적으로 전송하도록 설계된 도구"라고 소개한다.
ADP 교재는 '대용량 비정형 데이터 처리'에서 하둡과 기존 RDBMS를 잇는 데이터 연동 기술로 스쿱을 다룬다.
- 스쿱은 2012년 3월 아파치 인큐베이터를 졸업하여 최상위(Top Level) 프로젝트가 되었다.
- Apache Attic 기록에 따르면 스쿱은 2021년 6월 은퇴(retired)했고, 2021년 7월 Attic으로 옮기는 작업이 끝났다. 따라서 더 이상 새 기능 개발이나 보안 패치가 나오지 않으며, 웹사이트·메일링 리스트·소스 코드는 읽기 전용으로 남아 있다.
- 마지막 안정 버전은 스쿱 1 계열의 1.4.7이다. 구조를 새로 설계한 스쿱 2(1.99.x)도 1.99.7까지 나왔지만, 공식 사이트는 1.99.7이 1.4.7과 호환되지 않고 기능이 완성되지 않아 운영 환경용이 아니라고 밝혔다.
(2026년 10월 확인)
- 가져올 테이블의 스키마는 데이터베이스에 물어 알아내고, 이를 바탕으로 레코드를 다루는 자바 클래스를 자동으로 만든다.
- 실제 전송은 맵리듀스 작업으로 실행된다. 맵 작업 여러 개가 테이블을 나눠 동시에 읽거나 쓰므로 병렬 처리와 장애 대응을 맵리듀스에서 그대로 얻는다.
- 병렬 정도는 -m(--num-mappers) 옵션으로 정하며, 기본값은 맵 작업 4개다. 테이블은 분할 기준 컬럼(기본은 기본 키, --split-by로 지정)의 최솟값과 최댓값을 구해 맵 작업 수만큼 범위를 나눈다.
- 가져온 결과는 맵 작업마다 파일 하나씩, 여러 파일로 저장된다. 형식은 구분자로 나눈 텍스트, Avro, SequenceFile 등을 고를 수 있다.
- export는 HDFS의 파일을 병렬로 읽어 레코드로 나눈 뒤 대상 테이블에 행으로 넣는다.
| 명령 | 하는 일 |
|---|---|
| sqoop import | 테이블 하나를 HDFS(또는 하이브·HBase)로 가져온다 |
| sqoop import-all-tables | 데이터베이스의 모든 테이블을 가져온다 |
| sqoop export | HDFS 디렉터리의 파일을 RDBMS 테이블로 내보낸다 |
| sqoop list-databases, sqoop list-tables | 데이터베이스, 테이블 목록을 본다 |
| sqoop eval | SQL 문을 실행해 결과를 화면에 보여 준다 |
| sqoop job | 자주 쓰는 import·export 작업을 저장해 두고 다시 실행한다 |
| sqoop codegen | 레코드를 다루는 자바 클래스를 만든다 |
MySQL의 orders 테이블을 맵 작업 8개로 나눠 HDFS로 가져오는 예이다.
sqoop import \
--connect jdbc:mysql://db.example.com/shop \
--username analyst -P \
--table orders \
--split-by order_id \
--target-dir /data/shop/orders \
-m 8
같은 테이블을 하이브 테이블로 바로 가져올 수도 있다.
sqoop import \
--connect jdbc:mysql://db.example.com/shop \
--username analyst -P \
--table orders \
--hive-import --hive-table shop.orders
증분 가져오기(incremental import)는 지난번 이후에 추가되거나 바뀐 행만 가져온다. append 모드는 계속 증가하는 키 값으로 새 행을 찾고, lastmodified 모드는 수정 시각 컬럼으로 바뀐 행을 찾는다.
sqoop import \
--connect jdbc:mysql://db.example.com/shop \
--username analyst -P \
--table orders \
--target-dir /data/shop/orders \
--incremental append \
--check-column order_id \
--last-value 100000
하둡에서 집계한 결과를 RDBMS 테이블로 내보내는 예이다.
sqoop export \
--connect jdbc:mysql://db.example.com/shop \
--username analyst -P \
--table daily_sales \
--export-dir /data/shop/daily_sales
| 항목 | 스쿱 | 플럼 |
|---|---|---|
| 원천 데이터 | RDBMS 등 구조화된 저장소의 정형 데이터 | 로그, 이벤트 같은 스트리밍 데이터 |
| 전송 방향 | 양방향(import, export) | 원천에서 저장소로(수집) |
| 처리 방식 | 맵리듀스 기반 일괄 전송 | 에이전트(소스·채널·싱크)를 통한 연속 수집 |
| 주 용도 | 업무 DB 테이블을 하둡으로 옮기거나 분석 결과를 DB로 되돌림 | 여러 서버의 로그를 HDFS 등으로 모음 |
- 스쿱은 RDBMS와 하둡(HDFS, 하이브, HBase) 사이의 데이터 연동 도구이며, import와 export 두 방향을 모두 지원한다.
- 내부적으로 맵리듀스(맵 작업)를 이용해 병렬로 전송하며, -m 옵션으로 병렬 정도를 정한다(기본 4개).
- 정형 데이터 연동은 스쿱, 로그 수집은 플럼이라는 구분이 자주 출제된다.
- 증분 가져오기의 append·lastmodified 모드와 --check-column, --last-value 옵션의 쓰임을 알아 둔다.