데이터실무

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

관계형 데이터베이스 수집

데이터 수집
데이터 수집 실무
관계형 데이터베이스 수집
작성자
admin
작성일
2021-02-15 13:19
조회
2051

빅데이터 분석시 분산환경(하둡)과 데이터베이스 시스템의 데이터를 연계해 분석할 필요가 있다. 그러기 위해서는 정형 데이터인 데이터베이스 시스템의 데이터와 분산환경(하둡)에 저장된 데이터를 통합해야 한다. 관계형 데이터베이스 상호간에도 데이터를 통합하기 위해서는 벤더에서 제공하는 제품이 필요하다. 하둡과 정형 데이터베이스 시스템 간 통합을 위해서 마찬가지로 상호 연결할 수 있는 브리지가 필요하다. 관계형 데이터베이스 수집에서는 관계형 데이터베이스와 하둡을 연결할 수 있는 프로그램에 대해 알아보자.

브리지의 필요성

[그림 Ⅰ-2-4] 브리지의 필요성


스쿱 소개

하둡과 관계형 데이터베이스와 같은 정형 데이터 저장소간에 데이터를 효과적으로 전달하기 위해 시작된 스쿱(Sqoop)은 2012년 4월 아파치 인큐베이터 프로젝트로 출발해 지금은 아파치의 톱레벨프로젝트가 됐다. 이번 절에서는 Sqoop1.4.5 버전의 설치와 운영에 관해 알아보겠다. (가장 최근 stable 버전은 1.4.5다.)


스쿱 소개

스쿱(Sqoop)은 하둡과 데이터베이스 간 데이터 이동을 간편하게 하기 위해 개발됐다. 데이터를 분석하면서 하둡에서 데이터베이스의 정보를 가져올 일이 있거나 반대로 하둡의 결과를 데이터베이스로 올릴 때에 사용된다. 스쿱은 어떤 패키지나 프레임워크가 아닌, 하둡에서 제공하는 데이터베이스 연결용 맵 인풋 포맷터를 사용한다. 그것이 바로 DBInputFormater와 DBWritable이다.


  • DBInputFormater
    - JDBC와 인터페이스
    - SQL을 통해 테이블에서 Row 추출
    - DB, 테이블, 질의를 인자로 입력
  • DBWritable
    - 데이터베이스의 Row를 기록
    - JDBC의 ResultSet를 읽어서 필드로 변환

이 과정에서 타입의 변환이 일어난다. 다음은 JDBC와 Java 타입을 비교한 것이다.

[표Ⅰ-2-4] 데이터 타입 비교


데이터 타입 JDBC 타입 Java
8,000자까지 고정길이 문자타입 CHAR String
8,000자까지 고정길이 문자타입 VARCHAR String
문자열 LONGVARCHAR String
-10의 38승+1에서 10의 38승 -1 사이의 고정 정밀도 숫자형 NUMERIC java.math.BigDecimal
-10의 38승+1에서 10의 38승 -1 사이의 고정 정밀도 숫자형 DECIMAL java.math.BigDecimal
논리형 BIT boolean
0~255까지의 정수형 TINYNIT byte
2의 15승에서 2의 15승-1 사이의 정수형 SMALLINT short
-2의 31에서 2의 31승-1 사이의 정수형 INTEGER int
-2의 63에서 2의 63승 -1까지의 정수형 BIGINT long
-3.40E + 38에서 3.40E + 38 사이의 부동 정밀도 숫자 REAL float
-1.79E + 308에서 1.79E + 308 사이의 부동 정밀도 숫자 FLOAT double
스쿱 아키텍처

스쿱 아키텍처

[그림Ⅰ-2-5] 스쿱 아키텍처

[그림 Ⅰ-2-5]와 같이 스쿱은 DBMS 벤더에서 제공하는 JDBC를 사용해 스쿱의 ORM을 거쳐 하둡으로 저장처리 하기 위한 자바(Java) 소스를 생성한다. JDBC로 테이블 정보를 읽어 들인 다음, 맵리듀스에서 사용할 수 있도록 데이터 형 변환용 자바 클래스를 생성한다. 생성한 자바 클래스(위젯)의 예는 다음과 같다.

생성한 자바 클래스(위젯)의 예

이 정보를 사용해 스쿱에서 데이터베이스를 읽어올 때, 각 필드의 값을 mapper의 recordreader에 전달하는 데 사용한다.


스쿱의 맵 온리 잡 리듀스 처리방법

스쿱 잡 리듀스

[그림Ⅰ-2-6] 스쿱 잡 리듀스

[그림 Ⅰ-2-6]와 같이 스쿱은 hdfs 저장소에서 스쿱 잡의 맵정보를 통해 하둡클러스터의 메타데이터를 수집하고 맵온리 잡을 이용해 하둡클러스터에 데이터를 저장한다.
다음은 스쿱에서 사용하는 DBWritable에 있는 인터페이스다. readFields()와 write() 메소드에서 위에서 생성한 위젯을 사용해 정보를 전달할 수 있다.

스쿱에서 사용하는 DBWritable에 있는 인터페이스


스쿱 설치

패키지 설치
  • - 리눅스 또는 맥 OS X 시스템
  • - JDK 1.6 이상
  • - 하둡(hadoop) 1.X 이상
관계형 데이터베이스 설치

스쿱과 연동하기 위해 먼저 관계형 데이터베이스를 설치한다. 관계형 데이터베이스는 오픈소스 데이터베이스인 mysql을 선택했다. mysql을 설치하자.

mysql 설치


  1. ① mysql 패키지를 찾는다.
  2. ② mysql 패키지를 인스톨한다(64비트).
  3. ③ mysql 서비스를 구동한다.
  4. ④ mysql 을 시작한다.
  5. ⑤ 설치가 잘 됐는지 mysql에 접속해 table을 조회한다.
  6. ⑥ mysql을 나온다.
  7. ⑦ mysql 서비스를 종료한다.

mysql 연동 테스트용 샘플 데이터를 설치한다. 샘플 데이터로는 mysql에서 제공하는 sakila db(사킬라 샘플 데이터베이스는 mysql에서 제공하는 기능 확인을 위해 예제로 제공되는 데이터베이스다)를 사용한다. 내려 받은 다음에 설치한 mysql 데이터베이스로 올린다.

설치한 mysql 데이터베이스로 올린다


  1. ① wget을 사용해 사킬라 DB를 다운로드한다.
  2. ② 사킬라 DB의 압축을 푼다.
  3. ③ 사킬라 DB 디렉터리로 이동한다.
  4. ④ mysql을 시작한다.
  5. ⑤ 사킬라 DB의 스키마를 설치한다.
  6. ⑥ 사킬라 DB의 테스트 데이터를 삽입한다.
  7. ⑦ 사킬라 DB를 시작한다.

데이터가 준비됐으면, 스쿱에서 사용할 mysql 계정을 생성한다. 본 예제에서는 샘플 데이터베이스의 이름을 hadoop으로 했으며, 접근 계정과 암호를 각각 hadoop과 hadoop00으로 사용했다.

스쿱에서 사용할 mysql 계정을 생성


  1. ① 테이블을 보여준다.
  2. ② mysql이라는 스키마를 사용한다.
  3. ③ 유저를 추가한다. User명 hadoop 패스워드 hadoop00
  4. ④ hadoop 유저에게 권한을 부여한다.
  5. ⑤ Grant 테이블을 다시 읽어 변경사항을 적용한다.
  6. ⑥ 사킬라 유저의 모든 권한을 hadoop유저에게 부여한다.
  7. ⑦ Grant 테이블을 다시 읽어 변경사항을 적용한다.
스쿱설치

mysql 설정이 완료되었으면 스쿱을 설치한다. 스쿱은 가장 최근의 안정 버전인 1.4.5를 사용하고, 하둡은 1.0.X대의 버전을 사용할 것이므로 1.0.0이 표시된 것을 내려 받는다. 이어서 심볼릭 링크를 만들어 준다.

스쿱 설치


  1. ① wget을 사용해 스쿱을 다운로드한다.
  2. ② 다운받은 스쿱의 압축을 푼다.
  3. ③ sqoop-1.4.5.bin_hadoop-1.0.0 디렉터리를 sqoop 디렉터리로 심볼릭 링크를 생성한다.

설치가 완료 되었으면 사용자의 .bash_profile에 SQOOP_HOME을 추가한다.

사용자의 .bash_profile에 SQOOP_HOME을 추가


  1. ① vi 에디터를 통해 .bash_profile을 연다.
  2. ② SQOOP_HOME에 설치 디렉터리를 추가한다.
  3. ③ .bash_profile을 반영한다.

하둡 설치 디렉터리를 bin/configure-sqoop 파일 가장 아래쪽에 설정한다.

bin/configure-sqoop 파일 설정


  1. ① vi 에디터를 사용해 스쿱홈 디렉토티 아래 bin디렉터리의 configure-sqoop을 연다.
  2. ② Configure-sqoop 파일의 맨 아래에 하둡 설치 디렉터리를 추가한다. 하둡설치 디렉터리가 이미 익스포트돼 있다면 export HADOOP_HOME=${HADOOP_HOME}으로 입력하는 것이 좋다.

스쿱에서 생성한 맵리듀스 작업은 데이터베이스에서 데이터를 추출(import)하거나 입력(export)할 때에 jdbc를 사용하도록 돼 있다. 따라서 mysql jdbc driver를 $SQOOP_HOME/lib 아래에 복사해 스쿱이 사용할 수 있도록 한다.

mysql jdbc driver를 $SQOOP_HOME/lib 아래에 복사

mysql 개발자 사이트

[그림 Ⅰ-2-7] mysql 개발자 사이트


  1. ① mysql 개발자 사이트에 접속해 jdbc 드라이버를 다운로드한다. 로그인하려면 오라클 계정이 필요하다. 혹은 wget을 사용해 다음 주소로 다운로드한다.
    http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.34.tar.gz
  2. ② 다운로드 받은 파일의 압축을 푼다.
  3. ③ 압축을 푼 파일중 “mysql-connector-java-5.1.34-bin.jar”을 $SQOOP_HOME/lib 디렉터리에 복사한다.

하둡의 동작상태를 확인한다.

하둡의 동작상태를 확인


  1. ① hadoop fs -ls 명령어로 하둡의 동작상태를 확인한다.
  2. ② 다운로드 받은 파일의 압축을 푼다.
  3. ③ 위의 에러는 하둡이 실행되지 않을 경우 발생하므로 하둡홈의 bin디렉터리에 있는 start-all.sh 스크립트를 실행해 하둡을 가동한다.

스쿱과 하둡의 연동

스쿱과 mysql을 정상적으로 설치하고 하둡이 정상적으로 동작한다면 mysql과 하둡간에 데이터를 주고 받는 것을 실습해 보자.


mysql에서 하둡으로 데이터 가져오기

사킬라 DB의 city 테이블 전체를 스쿱을 사용해 하둡으로 복사해 보자.

city 테이블 전체를 스쿱을 사용해 하둡으로 복사


  1. ① 하둡으로 데이터를 가지고 올 때는 import를 사용한다.
  2. ② map이 접근할 데이터베이스 정보를 입력한다.
  3. ③ 하둡으로 복사할 테이블을 지정한다. 여기서는 city 테이블을 입력한다.
  4. ④ mysql에 접근하기 위한 계정정보이다.
  5. ⑤ 데이터베이스를 하둡에 복사할 때 사용할 맵퍼(mapper) 개수다. 여기서는 1개의 맵퍼를 사용한다.
  6. ⑥ 가져온 데이터베이스 내용을 하둡에 저장할 위치를 지정한다.

인자를 적용해 스쿱의 import 명령을 수행해 보자.

스쿱의 import 명령을 수행


  1. ① 스쿱의 홈디렉터리로 이동한다.
  2. ② 사킬라DB의 city 테이블 전체를 하둡으로 저장한다.

다음은 실행결과 화면이다.

실행결과 화면

실행결과 화면

map 100%로 나오면 import 작업이 완료된 것이다. 실행결과가 제대로 저장되었는지 하둡을 확인해 보자.

city 테이블 전체를 스쿱을 사용해 하둡으로 복사

하둡에서 결과값이 어떻게 나오나 확인해보자.

하둡에서 결과값 확인

mysql에서 쿼리결과만 하둡으로 가져와 보자.

mysql에서 쿼리결과만 하둡으로 가져옴


  1. ① 검색할 쿼리를 입력한다. 여기서는 도시(city) 이름이 k로 시작하는 곳을 검색하는 쿼리를 입력했다.
  2. ② 맵퍼를 2개 이상 사용할 때 입력하는 옵션이다.
  3. ③ 여러 개의 매퍼를 사용할 경우 매퍼별로 나누는 기준이 필요하다 만일 테이블에 프라이머리 키가 없다면, 보기와 같이 기준 컬럼을 입력해 준다. 여기서는 city_id 컬럼을 기준으로 한다.

인자를 적용해 스쿱의 import 명령을 수행해 보자.

인자를 적용해 스쿱의 import 명령을 수행

사킬라 DB의 city 테이블에서 조건에 맞는 데이터 세트를 가져와 하둡의 query_01디렉터리에 저장한다. 다음은 실행결과 화면이다.

city 테이블에서 조건에 맞는 데이터 세트를 가져와 하둡의 query_01디렉터리에 저장. 실행결과

city 테이블에서 조건에 맞는 데이터 세트를 가져와 하둡의 query_01디렉터리에 저장. 실행결과

데이터베이스 전체를 하둡으로 가져오는 방법을 알아보자.

데이터베이스 전체를 하둡으로 가져오는 방법


  1. ① 사킬라DB 전체 테이블을 가져오기 위해서는 sqoop-import-all-tables 명령을 사용한다.

다음은 실행 화면이다.

실행 화면


하둡에서 mysql로 데이터 저장하기

하둡에 저장된 파일을 사킬라 DB의 테이블에 스쿱을 사용해 삽입해보자.

하둡에 저장된 파일을 사킬라 DB의 테이블에 스쿱을 사용해 삽입


  1. ① 하둡에서 데이터를 DBMS로 저장할 때는 export를 사용한다.
  2. ② map이 접근할 데이터베이스 정보를 입력한다.
  3. ③ mysql에 접근하기 위한 계정정보다.
  4. ④ 하둡에서 복사할 테이블을 지정한다. 여기서는 city 테이블을 입력한다.
  5. ⑤ 익스포트할 하둡파일의 위치를 지정한다.
하둡의 하이브와 연동

하둡의 하이브 테이블과 mysql과 연동하기 위해서는 다음과 같이 명령어를 입력해야 한다.

하둡의 하이브 테이블과 mysql과 연동하기 위한 명령어


  1. ① 하이브의 홈 디렉터리를 지정한다.
  2. ② 하이브 테이블을 사용하겠다는 옵션이다.
  3. ③ 하이브 테이블의 이름을 입력한다.
  4. ④ 하이브가 사용하는 하둡 디렉터리를 지정한다.
  5. ⑤ 하이브가 사용하는 구분자를 지정하는 옵션이다.

만약 시스템에 하이브가 설치돼 있고 하이브에 직접 스쿱을 이용해 데이터를 저장하면 하이브의 고수준 쿼리 언어인 HiveQL을 사용할 수 있기 때문에 하둡의 맵리듀스 작업을 거치지 않아도 데이터를 다루는 데 편리하다.
실습을 통해 살펴 보았듯이 스쿱은 DBMS와 하둡 시스템과의 브리지 역할을 한다. 스쿱을 하둡파일 시스템의 관점에서만 보면 단순히 DBMS와 하둡과의 데이터 인터페이스 역할만 한다. 하지만 DBMS의 관점에서 보면 스쿱은 하둡 파일 시스템 외에도 로컬 시스템의 CSV, Avro, Thrift Binary까지 지원하므로 이를 활용하면 데이터 수집 시 훨씬 유연한 아키텍처를 구성할 수 있을 것이다.