프로그래밍

[Sqoop] Ubuntu 20.04 Sqoop 활용

RainIron 2021. 6. 7. 18:26
반응형

※ Sqoop(정형 데이터 수집)

* MySQL -> Sqoop -> HDFS

* RDB -> HDFS

* HDFS -> RDB

 

* 대용량 데이터 전송 솔루션

* 커넥터(Connector)를 사용하여 RDBMS에서 HDFS로 데이터를 수집하거나 HDFS에서 RDBMS로 데이터를 보내는 기능 수행

* Oracle, MS-SQL, DB2와 같은 상용 RDBMS와 MySQL과 같은 오픈소스 RDBMS 지원


※ 설치

1. File Download

wget https://downloads.apache.org/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz

https://downloads.apache.org/sqoop/1.4.7/

 

Index of /sqoop/1.4.7

 

downloads.apache.org

2. Tar xvzf

tar xvzf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz 

 

3. 환경변수 설정

* .bashrc 파일의 환경 변수를 추가한다.

export SQOOP_HOME=/home/hdoop/sqoop-1.4.7/
export PATH=$PATH:$SQOOP_HOME/bin

 

* 환경 변수 변경 적용

source .bashrc

 

* 환경 변수 확인

echo $SQOOP_HOME

 

4. lib 폴더 내 jar 파일 대체 및 추가

* sqoop-1.4.7/lib/commons-lang-3.3.4.jar 삭제 후 commons-lang-2.6.jar 추가

http://commons.apache.org/proper/commons-lang/download_lang.cgi

 

Lang – Download Apache Commons Lang

Download Apache Commons Lang Using a Mirror We recommend you use a mirror to download our release builds, but you must verify the integrity of the downloaded files using signatures downloaded from our main distribution directories. Recent releases (48 hour

commons.apache.org

 

* jdbc 드라이버 추가(Hive 설치 때 사용한 JDBC driver를 복사해서 사용하면 된다)

" mysql-connector-java-8.0.24.jar "


※ Sqoop 실행 및 활용

1. MySQL => Sqoop 사용 => HDFS

* sqoop을 실행하기 전에, start-all.sh 실행하여 하둡을 실행해야 한다.

 

* sqoop list-databases: 데이터베이스 리스트 출력

sqoop list-databases --connect jdbc:mysql://localhost:3306/?serverTimezone=UTC --username root -password root

 

* sqoop import: MySQL -> HDFS

sqoop import --connect jdbc:mysql://localhost:3306/test?serverTimezone=UTC\
--username root \
--password root \
--table employee \
--m 1 \
--target-dir /sqoop/employee \
--delete-target-dir

--connect: 연결하려는 MySQL 서버(연결하려는 db까지 명시)

--username, --password

--table: 테이블명

--m: 몇 개의 파일로 저장할 지 결정하는 파라미터(예: -m 1 (파일 1개로 저장))

--target-dir: HDFS 입력 위치

--delete-target-dir: HDFS 입력 위치 폴더가 이미 존재하면 삭제하고 생성할 수 있도록 함.

Import한 테이블을 HDFS 영역에서 확인

 

* 만약 2개의 파일로 나누어 저장한다면?

sqoop import --connect jdbc:mysql://localhost:3306/test?serverTimezone=UTC --username root --password root --table employee --m 2 --target-dir /sqoop/employee --delete-target-dir

 

2. HDFS => Sqoop 사용 => MySQL

* mysql> truncate employee; 를 사용해 데이터를 지운 다음, HDFS에서 데이터를 Export한다.

sqoop export --connect jdbc:mysql://localhost:3306/test?serverTimezone=UTC\
--username root \
--password root \
--table employee \
--m 2 \
--export-dir /sqoop/employee

중간 내용 생략
결과 확인

3. DB 변경 시 내용 반영(MySQL -> HDFS)

INSERT INTO employee(ename, dept, hiredate) VALUES('nata', 'f', '2021-06-06');

sqoop import --connect jdbc:mysql://localhost:3306/test?serverTimezone=UTC\
--username root \
--password root \
--table employee \
--m 1 \
--target-dir /sqoop/employee \
--incremental append
--check-column id

 

4. MySQL -> Sqoop -> Hive -> HDFS

* Hive를 거치는 이유: Hive에 있는 메타 데이터 테이블을 이용해야만 데이터 처리가 가능하기 때문에, 데이터 처리를 요구하는 서비스를 구현할 경우에는 Hive를 연계해야한다. 반대로, 데이터 처리가 필요 없는 서비스의 경우 Sqoop의 기능만 사용해(Import/Export 기능) 서비스를 구현한다.

★ 실행 전 수행사항

1) Hive의 파일 중 hive-exec-3.1.2.jar 파일을 sqoop/lib에 복사해놓아야 한다.

 

2) Hive의 출력용 table은 미리 삭제

 

3) metastore 서버 실행: $ hive --service metastore &

 

* 실행

sqoop import --connect jdbc:mysql://localhost:3306/test?serverTimezone=UTC\
--username root \
--password root \
--table employee \
--m 2 \
--hive-import \
--fields-terminated-by "," \
--columns "eid, ename, dept, hiredate"

실행 후, 제대로 Import 되었는지 HDFS 영역에서 확인해본다.

Sqoop을 통해 HDFS에 파일을 저장했으니, Hive로 데이터를 확인해보자

COUNT(*)를 써서 MapReduce 작업도 확인해보자

내가 그림에 소질 없는 이유

5. MySQL <- Sqoop <- Hive <- HDFS

TRUNCATE TABLE employee;

SELECT * FROM employee;

sqoop export --connect jdbc:mysql://localhost:3306/test?serverTimezone=UTC \
--username root \
--password root \
--table employee \
--m 2 \
--export-dir /user/hive/warehouse/employee \
--input-fields-terminated-by ","

반응형