sqoop으로 관계형 데이터 불러오기
-이번장에서 배울 것
0. sqoop 이 무엇인가?
-Cloudera에서 원래 개발한 오픈 소스 아파치 프로젝트이다.
-이름은 “SQL-to-Hadoop” 이걸 줄여서 만든 것이다.
-HDFS와 데이터베이스 사이에서 데이터를 교량 역할을 한다.
-하둡 맵리듀스를 사용하여 데이터를 불러오는 사용자 쪽의 어플리케이션이다.
1. RDBMS에서 가져온 테이블들을 하둡 클러스터로 어떻게 불러올지
-순서:1.테이블정보를 파악 -> 2.클러스터에 작업 할당 -> 3.테이블을 패치하고 HDFS로 보냄.
(사용자에서 출발-> 1.데이터베이스 2.HDFS 3.데이터베이스-HDFS)
1:가능하면 기본키를 결정한다.
2:boundary query를 실행하여 불러올 레코드들을 본다.
3:작업의 수(mapper)에 따라 boundary query 결과를 나눈다.
기초문법
-MySQL 데이터베이스에 있는 데이터를 보여줌.
sqoop list-tables --connect jdbc:mysql://dbhost/loudacre --username id --password p
-전체 데이터베이스를 가져옴.
sqoop import-all-tables --connect jdbc:mysql://dbhost/loudacre --username id --password p
-디렉토리를 명시해줌.
sqoop import-all-tables --connect jdbc:mysql://dbhost/loudacre \
--username id --password p --warehouse-dir /directory_path
-테이블 하나만 가져옴.
sqoop import --table tablename --connect jdbc:mysql://dbhost/loudacre \
--username id --password p
2. 불러오는 테이블의 파일 포맷과 구분자를 어떻게 다루는지
-구분자를 설정함.
sqoop import --table tablename --connect jdbc:mysql://dbhost/loudacre \
--username id --password p --fields-terminated-by “\t”
-계속 전체 테이블을 가져오면 비효율적이기 때문에 이전에 import한 이후로 변경된 부분만
가져오고 싶을때 사용함.
sqoop import --table tablename --connect jdbc:mysql://dbhost/loudacre \
--username id --password p \
--incremental lastmodified \
--check-column mod_df \
--last-value ‘2015-09-30 16:00:00’ # last-value열은 시간이어야함.
-incremental의 lastmodified 같은 경우는 check-column을 시간으로 두어 그 시간 이후에
새로 등록된 데이터를 가져오게 된다.
sqoop import --table tablename --connect jdbc:mysql://dbhost/loudacre \
--username id --password p \
--incremental append \
--check-column id \
--last-value ‘100’’
incremental의 append는 check-column에서 지정한 열을 기준으로 last-value 보다 큰 로우
들을 가져오게 된다.
-하둡에서 데이터베이스로 데이터를 보내기.
sqoop export --connect jdbc:mysql://dbhost/loudacre \
--username id --password p \
--export-dir /export_PATH \
--update-mode allowinsert \
--table product_recommendations
3. 불러오는 데이터의 행이나 열을 어떻게 다루는지
-부분적으로 테이블을 불러오기.
sqoop import --table accounts --connect jdbc:mysql://dbhost/loudacre \
--username id --password p \
--columns ‘id, first_name, last_name, state, 등의 컬럼명’
-테이블에서 요청에 매칭되는 행만 불러오기.
sqoop import --table accounts --connect jdbc:mysql://dbhost/loudacre \
--username id --password p \
--where ‘state= ‘CA’”
-자유로운 형식의 쿼리문을 사용하기
sqoop import --connect jdbc:mysql://dbhost/loudacre \
--username id --password p \
--target-dir /data/loudacre/payable \
--split-by accounts.id \
--query ‘SELECT accounts.id, first_name, last_name FROM accounts JOIN invoices ON (accounts.id = invoices.cust_id) WHERE $CONDITIONS’
--target-dir는 자유로운 형식(free-form)의 쿼리문을 사용하기 위해 주는 옵션임.
--split-by는 mappers의 작업을 나누기 위해 사용되는 필드를 명시함.
WHERE $CONDITIONS literal token(소스코드의 고유한 값을 대표하는 용어) 을 반드시 추가해주어야한다.
-WHERE 기준이 있는 자유 형식 쿼리문을 사용하기
sqoop import --connect jdbc:mysql://dbhost/loudacre \
--username id --password p \
--target-dir /data/loudacre/payable \
--split-by accounts.id \
--query ‘SELECT accounts.id, first_name, last_name FROM accounts JOIN invoices ON (accounts.id = invoices.cust_id) WHERE $CONDITIONS AND bill_amount >= 40’
-WHERE 뒤에 AND를 사용해서 기준을 명시함.
4. sqoop의 성능을 증가시킬 기술은 무엇이 있는지
-기본적으로 sqoop은 4개의 병렬작업(mappers)을 사용하여 데이터를 불러옴.
-작업수를 늘리면 임포트 속도를 빠르게 향상시킬 수도 있음.
-split-by를 사용해서 기준 열을 바꿀 수도 있음.(위의 예시)
sqoop import --connect jdbc:mysql://dbhost/loudacre \
--username id --password p \
-m 8
5. 기존의 것과 다음 세대 버전의 sqoop을 어떻게 비교하는지
-스쿱의 한계
1.클라이언트는 RDBMS와 연결되어 있어야 하고, JDBC drivers가 설치되어 있어야 한다.
2.클러스터와 클라이언트와의 연결을 필요로 한다.
3.RDBMS의 username과 password를 명시해야한다.
4.외부 어플리케이션의 CLI(command line interface)를 병합하기가 어렵다.
-sqoop2
1.클라이언트가 오직 sqoop서버와 연결돼있어도 됩니다.
2.더 나은 리소스 관리가 가능해집니다.
3.sqoop2서버는 CLI, REST API, Web UI 와 접근이 용이해진다.
4.최종사용자인 end user는 credentials(신임장)를 더이상 갖고 있지 않아도된다.
이글은 서울과학기술대학교 권혁윤 교수님의 강의를 토대로 필기한 내용임을 밝힙니다. :)
'빅데이터 시스템' 카테고리의 다른 글
RDD와 함께 스파크 활용하기. (0) | 2019.12.15 |
---|---|
스파크 기초 (0) | 2019.12.15 |
데이터 파일 파티셔닝 (0) | 2019.12.15 |
Impala와 Hive로 모델링하고 관리하기 (0) | 2019.12.15 |
Impala와 Hive 소개 (0) | 2019.12.15 |
댓글