2020년 10월 11일 일요일

Apache Sqoop [3] - 유저가이드2 [ sqoop-import ]

 

[ Sqoop-Import ]


1. 일반인수 (Common arguments)

  • --connect <jdbc-uri> : JDBC 접속URI 지정
  • --connect-manager <class-name> : 사용할 연결 관리자
  • --driver <class-name> : JDBC driver class 지정
  • --hadoop-mapred-home <dir> : Override $HADOOP_MAPRED_HOME
  • --help : 도움말
  • --password-file : 인증관련 파일 경로
  • -P : 콘솔에서 비밀번호를 읽을 때
  • --password <password> : 인증패스워드 SET
  • --username <username> : 유저이름 SET
  • --verbose : working시 더 많은 정보 출력
  • --relaxed-isolation : 매퍼에 대해 커밋되지 않은 읽기 데이터를 가져온다. HDFS에 저장되기전 데이터를 컨트롤하기 위한 인수


2. 데이터베이스 서버 접속

접속예시

$ sqoop import --connect jdbc:mysql://database.example.com/employees \
    --username aaron --password 12345


비밀번호가 저장된 파일을 이용하여 접속

$ sqoop import --connect jdbc:mysql://database.example.com/employees \
    --username venkatesh --password-file ${user.home}/.password


또는 -P 인수를 통해 비밀번호를 콘솔에서 입력할 수 있다.

$ sqoop import --connect jdbc:mysql://database.example.com/employees \
    --username aaron -P
password: *****


Sqoop은 몇몇 데이터베이스(Mysql)들은 기본적으로 지원한다. 지원하는 데이터베이스들의 JDBC가 설치되어 있기 때문이다. 

그러나 다른 데이터베이스를 사용하기위해 JDBC를 설치해야 하는 경우 해당 .jar파일을 $SQOOP_HOME/lib 경로에 추가시켜야한다. (데비안-/usr/lib/sqoop/lib) 



3. 유효성관련 인수 (Validation arguments)

인수   인수   
--validate
복사된 데이터의 유효성 검사 사용, 단일 테이블 복사본만 지원

--validator <class-name>
특정 vaildator클래스 지정

--validation-threshold <class-name>
사용할 유효성 검사 임계값 클래스 지정

--validation-failurehandler <class-name>
사용할 유효성 검사 오류 처리기 클래스 지정



4. Import 관련 인수 (Import control arguments)

인수   인수   
--append
기존 HDFS의 데이터세트에 데이터 추가

--as-avrodatafile
Avro 데이터파일로 가져오기

--as-sequencefile
SequenceFiles 데이터파일로 가져오기

--as-textfile
text파일로 가져오기 (default)

--as-parquetfile
Parquet 데이터파일로 가져오기

--boundary-query <statement>
분할 작성에 사용한 경계쿼리

--columns <col,col,col…>
테이블에서 가져올 Columns

--delete-target-dir
target directory가 있을 경우 삭제

--direct
데이터베이스에 대한 직접 컨넥터 사용

--fetch-size <n>
데이터베이스에서 한 번에 읽을 항목 수

--inline-lob-limit <n>
inline LOB의 최대크기 설정

-m,--num-mappers <n>
병렬로 작업 할 map tasks 수 설정

-e,--query <statement>
쿼리로 가져올 데이터 지정

--split-by <column-name>
컬럼을 구분하는데 사용되는 유닛 ex) ","

--split-limit <n>
정수 및 날짜 열에 대한 분할크기지정

--autoreset-to-one-mapper
primary key나 분할 기준열이 없는 경우 자동적으로 매퍼가 조정

--table <table-name>
읽을 테이블 지정

--target-dir <dir>
HDFS 디렉토리 경로 

--temporary-rootdir <dir>
import될 동안 생성할 임시 HDFS 디렉토리 경로

--warehouse-dir <dir>
지정된 테이블의 상위 HDFS 디렉토리

--where <where clause>
작성할 WHERE절

-z,--compress
압축사용

--compression-codec <c>
사용할 하둡 아축 코덱 (default gzip)

--null-string <null-string>
문자열컬럼이 null일 떄 쓸 문자열

--null-non-string <null-string>
비문자열컬럼이 null일 때 쓸 문자열


예시1)

$ sqoop import \
  --table employ \ \
--columns "id,name,age" \ --where "id > 300"


예시2)

$ sqoop import \
  --query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \
  --split-by a.id --target-dir /user/foo/joinresults

--query 사용시 WHERE절 뒤에 "AND \$CONDITIONS" 문구를 추가하여 이 문장이 조건절을 나타내고 있다는 표시를 해줘야 한다.

Ex) "SELECT * FROM x WHERE a='foo' AND \$CONDITIONS"

또한 복잡한 조인쿼리는 오류가 생길 수 있다.



5. 병렬 제어 (Contorlling Parallelism)

-m 또는 --num-mappers 인수로 제어 할 수 있다. 병렬시 분할 기준은 기본키 또는 지정한 키값이다. 예를 들어 기본키가 0-1000이고, -m 4(맵리듀스 4개)로 설정하면 각 맵태스크는 250개씩 나누어 작업을 한다.

기본 키값이 균일하게 분포되지 않으면 작업 불균형이 생긴다. --split-by인수를 사용해 명시적인 컬럼을 선택한다.

--split-limit옵션을 사용하여 -m 또는 --num-mapers를 재정의 할 수 있다. --split-limit옵션은 분할된 태스크의 크기를 제한한다. 같은 예시로 위의 1-1000개의 기본키가 있는 테스크를 똑같이 -m 4, 그리고 --split-limit옵션은 task 200개로 지정하면 맵퍼수가 하나 증가하며 5개로 재조정된다.



6. 저장위치

 /shared/foo 에 저장된다

$ sqoop import --connnect <connect-str> --table foo --warehouse-dir /shared \
    ...
$ sqoop import --connnect <connect-str> --table foo --target-dir /shared/foo\
    ...

--target-dir와 --warehouse-dir은 같이 쓸 수 없다. 또한 대상 디렉토리가 HDFS에 이미 존재하는 경우 작동하지 않는다. 그럴 경우 대상 디렉토리 이름을 변경하던가 --delete-target-dir인수를 사용하여 기존 파일을 지운후 가져오는 방식을 사용해야 한다.


댓글 없음:

댓글 쓰기