Apache sqoop

11
Apache Sqoop 아꿈사 Cecil 13107월요일

Transcript of Apache sqoop

Page 1: Apache sqoop

Apache Sqoop아꿈사Cecil

13년 10월 7일 월요일

Page 2: Apache sqoop

이미지 출처: siliconweek, <http://www.siliconweek.es/noticias/apache-sqoop-se-convierte-en-proyecto-prioritario-para-big-data-21558>

하둡과 RDBMS 사이에서 데이터를 전송하기 위한 Tool

Import Export

13년 10월 7일 월요일

Page 3: Apache sqoop

Import

13년 10월 7일 월요일

Page 4: Apache sqoop

)LJXUH�������6TRRS¦V�LPSRUW�SURFHVV

%DVHG�RQ�WKH�85/�LQ�WKH�FRQQHFW�VWULQJ�XVHG�WR�DFFHVV�WKH�GDWDEDVH�6TRRS�DWWHPSWV�WR�SUHGLFW�ZKLFK�GULYHU�LW�VKRXOG�ORDG��<RX�PD\�VWLOOQHHG�WR�GRZQORDG�WKH�-'%&�GULYHU�LWVHOI�DQG�LQVWDOO�LW�RQ�\RXU�6TRRSFOLHQW��)RU�FDVHV�ZKHUH�6TRRS�GRHV�QRW�NQRZ�ZKLFK�-'%&�GULYHU�LV�DS�SURSULDWH��XVHUV�FDQ�VSHFLI\�H[DFWO\�KRZ�WR�ORDG�WKH�-'%&�GULYHU�LQWR6TRRS��7KLV� FDSDELOLW\� DOORZV� 6TRRS� WR�ZRUN�ZLWK� D�ZLGH� YDULHW\�RIGDWDEDVH�SODWIRUPV�

%HIRUH�WKH�LPSRUW�FDQ�VWDUW��6TRRS�XVHV�-'%&�WR�H[DPLQH�WKH�WDEOH�LW�LV�WR�LPSRUW��,WUHWULHYHV�D�OLVW�RI�DOO�WKH�FROXPQV�DQG�WKHLU�64/�GDWD�W\SHV��7KHVH�64/�W\SHV��VARCHAR�INTEGER��DQG�VR�RQ��FDQ�WKHQ�EH�PDSSHG�WR�-DYD�GDWD�W\SHV��String��Integer��HWF����ZKLFKZLOO�KROG�WKH�ILHOG�YDOXHV�LQ�0DS5HGXFH�DSSOLFDWLRQV��6TRRS¦V�FRGH�JHQHUDWRU�ZLOO�XVHWKLV�LQIRUPDWLRQ�WR�FUHDWH�D�WDEOH�VSHFLILF�FODVV�WR�KROG�D�UHFRUG�H[WUDFWHG�IURP�WKH�WDEOH�

7KH�Widget�FODVV�IURP�HDUOLHU��IRU�H[DPSOH��FRQWDLQV�WKH�IROORZLQJ�PHWKRGV�WKDW�UHWULHYHHDFK�FROXPQ�IURP�DQ�H[WUDFWHG�UHFRUG�

public Integer get_id();public String get_widget_name();public java.math.BigDecimal get_price();public java.sql.Date get_design_date();public Integer get_version();public String get_design_comment();

0RUH�FULWLFDO�WR�WKH�LPSRUW�V\VWHP¦V�RSHUDWLRQ��WKRXJK��DUH�WKH�VHULDOL]DWLRQ�PHWKRGVWKDW�IRUP�WKH�DBWritable�LQWHUIDFH��ZKLFK�DOORZ�WKH�Widget�FODVV�WR�LQWHUDFW�ZLWK�-'%&�

532 | Chapter 15:ಗSqoop

www.it-ebooks.info

Import Flow

1. JDBC를 이용해서 임포트할 테이블을 검사2. 레코드 컨테이너 클래스 생성3. 맵리듀스 잡 실행

• 맵 태스크는 쿼리를 실행하고 컨테이너 클래스를 사용

해서 인스턴스로 역직렬화

13년 10월 7일 월요일

Page 5: Apache sqoop

컨테이너 클래스

public class widgets extends SqoopRecord implements DBWritable, Writable {... public void readFields(ResultSet __dbResults) throws SQLException { // Importing this.__cur_result_set = __dbResults; this.id = JdbcWritableBridge.readInteger(1, __dbResults); this.widget_name = JdbcWritableBridge.readString(2, __dbResults); this.price = JdbcWritableBridge.readBigDecimal(3, __dbResults); this.design_date = JdbcWritableBridge.readDate(4, __dbResults); this.version = JdbcWritableBridge.readInteger(5, __dbResults); this.design_comment = JdbcWritableBridge.readString(6, __dbResults); }

// Exporting public int write(PreparedStatement __dbStmt, int __off) throws SQLException { JdbcWritableBridge.writeInteger(id, 1 + __off, 4, __dbStmt); JdbcWritableBridge.writeString(widget_name, 2 + __off, 12, __dbStmt); JdbcWritableBridge.writeBigDecimal(price, 3 + __off, 3, __dbStmt); JdbcWritableBridge.writeDate(design_date, 4 + __off, 91, __dbStmt); JdbcWritableBridge.writeInteger(version, 5 + __off, 4, __dbStmt); JdbcWritableBridge.writeString(design_comment, 6 + __off, 12, __dbStmt); return 6; }...}

Sqoop은 데이터를 직렬화/역직렬화하는 컨테이너 클래스를 생성하여 테이블로부터 추출된 레코드를 유지

13년 10월 7일 월요일

Page 6: Apache sqoop

성능을 위한 Map Task의 분할

임포트 성능은 쿼리를 다수의 노드에 분산시켜서 얻을 수 있음

Sqoop은 테이블에 대한 메타 데이터를 사용하여 분할을 결정(DataDrivenDBInputFormat)

“-m 1” 옵션을 사용하면 1개의 맵 태스크만 실행 됨.

Ex) 주키의 최소/최대 값 이용0 ~ 99,999 값을 가지는 ID 컬럼이고, 5개의 맵태스크가 실행될 경우

각각의 맵 태스크는 아래와 같은 쿼리를 실행

SELECT * FROM widgets WHERE id >=0 AND id < 20000;SELECT * FROM widgets WHERE id >=20000 AND id < 40000;

:

13년 10월 7일 월요일

Page 7: Apache sqoop

ETC.

• 임포트 제어하기WHERE 절의 추가하여 전체 테이블이 아닌 일부만 임포트 가능

• 임포트와 일관성데이터 임포트시, 소스 데이터의 일관된 스냅샷에 접근하는 것이 중요. 이를 위해 임포트 기간중 테이블을 수정하는 프로세스를 실행을 막는 것이 필요

• 직접 모드 임포트직접 모드를 사용하여 임포트 성능을 향상 시킬수 있음. 이러한 직접 모드는 데이터

베이스에서 지원하는 툴을 사용(ex: mysqldump ...)

13년 10월 7일 월요일

Page 8: Apache sqoop

Export

13년 10월 7일 월요일

Page 9: Apache sqoop

)LJXUH�������([SRUWV�DUH�SHUIRUPHG�LQ�SDUDOOHO�XVLQJ�0DS5HGXFH

7KH�-'%&�EDVHG�H[SRUW�VWUDWHJ\�EXLOGV�XS�EDWFK�INSERT�VWDWHPHQWV�WKDW�ZLOO�HDFK�DGGPXOWLSOH�UHFRUGV�WR�WKH�WDUJHW�WDEOH�� ,QVHUWLQJ�PDQ\�UHFRUGV�SHU�VWDWHPHQW�SHUIRUPVPXFK�EHWWHU�WKDQ�H[HFXWLQJ�PDQ\�VLQJOH�URZ�INSERT�VWDWHPHQWV�RQ�PRVW�GDWDEDVH�V\V�WHPV��6HSDUDWH�WKUHDGV�DUH�XVHG�WR�UHDG�IURP�+')6�DQG�FRPPXQLFDWH�ZLWK�WKH�GDWD�EDVH��WR�HQVXUH�WKDW�,�2�RSHUDWLRQV�LQYROYLQJ�GLIIHUHQW�V\VWHPV�DUH�RYHUODSSHG�DV�PXFKDV�SRVVLEOH�

)RU�0\64/��6TRRS�FDQ�HPSOR\�D�GLUHFW�PRGH�VWUDWHJ\�XVLQJ�mysqlimport��(DFK�PDSWDVN�VSDZQV�D�mysqlimport�SURFHVV�WKDW�LW�FRPPXQLFDWHV�ZLWK�YLD�D�QDPHG�),)2�RQ�WKHORFDO�ILOHV\VWHP��'DWD�LV�WKHQ�VWUHDPHG�LQWR�mysqlimport�YLD�WKH�),)2�FKDQQHO��DQG�IURPWKHUH�LQWR�WKH�GDWDEDVH�

:KLOH�PRVW�0DS5HGXFH�MREV�UHDGLQJ�IURP�+')6�SLFN�WKH�GHJUHH�RI�SDUDOOHOLVP��QXP�EHU�RI�PDS�WDVNV��EDVHG�RQ�WKH�QXPEHU�DQG�VL]H�RI�WKH�ILOHV�WR�SURFHVV��6TRRS¦V�H[SRUWV\VWHP�DOORZV�XVHUV�H[SOLFLW�FRQWURO�RYHU�WKH�QXPEHU�RI�WDVNV��7KH�SHUIRUPDQFH�RI�WKHH[SRUW�FDQ�EH�DIIHFWHG�E\�WKH�QXPEHU�RI�SDUDOOHO�ZULWHUV�WR�WKH�GDWDEDVH��VR�6TRRS�XVHVWKH�CombineFileInputFormat�FODVV�WR�JURXS�XS�WKH�LQSXW�ILOHV�LQWR�D�VPDOOHU�QXPEHU�RIPDS�WDVNV�

542 | Chapter 15:ಗSqoop

www.it-ebooks.info

Export Flow

1. JDBC를 이용해서 테이블을 검사2. 레코드 컨테이너 클래스 생성3. 맵리듀스 잡 실행

• INSET 문을 만들어서 대상 테이블에 다중 레코드를 추가

13년 10월 7일 월요일

Page 10: Apache sqoop

ETC.

• 익스포트와 트랜잭션프로세스의 병렬성으로 인하여 익스포트는 하나의 단일 동작으로 제어되지 않음.

(하나의 태스트 결과는 다른 태스크가 끝나기 전에 참조될 수 있음)

이를 위해 먼저 임시 테이블에 익스포트 후, 잡이 종료되는 시점에 단일 트랜잭션으로

목표 테이블로 옮김 (staging-table 옵션)

• 직접 모드 익스포트직접 모드를 사용하여 익스 성능을 향상 시킬수 있음. 이러한 직접 모드는 데이터 베이스에서 지원하는 툴을 사용(ex: mysqlimport ...)

13년 10월 7일 월요일

Page 11: Apache sqoop

References

• Tom White (2013). 하둡 완벽가이드. (심탁길, 김현우, 옮김). 서울: 한빛미디어. (원서출판 2012)

13년 10월 7일 월요일