본문으로 바로가기

이번 포스팅에서는 Embulk를 사용하여 GCP의 BigQuery에 데이터를 넣어보는 테스트를 해보겠다.

Bigquery에 대한 자세한 내용은 여기를 참고하기 바란다.


MySQL -> BigQuery 데이터 넣기


저번 포스팅에서 말했던 것처럼, Embulk는 관련 Plug-in을 설치하고 yml파일만 설정하면 된다.


관련 Plug-in 설치


$ embulk gem install embulk-input-mysql # MySQL에서 데이터를 읽기 위한 플러그인
$ embulk gem install embulk-output-bigquery # BigQuery에 데이터를 넣기 위한 플러그인

# MySQL에서 데이터를 읽기 위해 input, BigQuery에 데이터를 넣기위해 output을 각각 설치해준다.


Embulk 에서는 BigQuery를 쓰면 데이터가 중간에 연결이 끊길수도 있고 그래서 안정성을 위해 다음과 같은 과정을 한다.


  • Embulk -> GCS(Google Cloud Storage)에 csv생성
  • GCS의 csv에서 BigQuery로 임시 테이블 만듦
  • 임시 테이블에서 실제 테이블로 데이터 로딩

# 그래서 설정(out 부분)에서 gcs_bucket 부분을 설정 해야 한다.


우선 완성된 yml파일을 먼저 보고 각 항목을 설정하는 방법을 알아보자.

in:
    type: mysql
    host: 111.111.111.111   # DB 서버 주소
    port: 3306
    user: root   # DB 아이디
    password: root   # DB 비밀번호 
    database: test_database   # DB 이름
    table: test_table   # 테이블 명
    select: "*"   # 가져올 데이터 
    where: "id >= 1 and id < 5000000"   # 조건식
out:
    type: bigquery
    mode: replace
    auth_method: private_key
    service_account_email: 374612135928-compute@developer.gserviceaccount.com    # 구글 클라우드 서비스 계정 ID
    p12_keyfile: /home/Tora/embulk-example/tora-project-0125-c9545032f2f5.p12   # 구글 클라우드 비공개 다운받은 키 경로 
    project: tora-project-0125   # 구글 클라우드 프로젝트 ID 
    dataset: test22   # 빅쿼리 데이터셋
    table: reservation   # 빅쿼리 테이블명
    auto_create_table: true   # 스키마를 안만들어져 있으면 자동으로 만들어주게끔 설정
    gcs_bucket: tora-bucket   # Google Cloud Storage 버킷 이름
    auto_create_gcs_bucket: true   # 만약 Google Cloud Storage 버킷이 없으면 생성
    ignore_unknown_values: true   # 알 수 없는 값이 들어왔을때 무시
    allow_quoted_newlines: true   # quote가 들어올때 새로운 라인 생성
    auto_create_dataset: true   # 빅쿼리에 미리 데이터셋이 만들어져 있지 않으면 자동으로 생성


in:부분은 저번 포스팅의 Cloud SQL 정보를 그대로 담으면 된다. (데이터를 가져올 곳의 정보 입력)

추가된 부분은 select부분으로, 가져올 데이터에 대한 SQL문이다.


out:부분에서 설정해야할 것들은 다음과 같다. (데이터를 넣을 곳의 정보 입력)

1. service_account_email

2. p12_keyfile

3. project

4. dataset

5. table

6. gcs_bucket



1. service_account_email

# 여기에는 구글 클라우드의 서비스 계정 ID를 작성하면 된다. 


콘솔의 좌측 상단의 메뉴를 눌러서 IAM 및 관리자로 들어간다.

IAM 및 관리자에서 서비스 계정에 있는 서비스 계정 ID를 복사해서 설정에 넣는다.



2. p12_keyfile

# 여기에는 구글 클라우드의 비공개 keyfile의 경로를 작성하면 된다. 


IAM 및 관리자에서 서비스 계정에 있는 우측의 옵션탭에서 키만들기를 클릭한다.

그럼 JSON으로 할건지 P12로 할건지 정하는데, 여기서는 P12로 선택한다.

새 비공개 키를 만들건지에 대해서 나오는데 여기서는 설정없이 그냥 닫기를 누른다.

그럼 다음과 같이 p12 파일을 다운로드 받는데 이 파일의 위치를 위 빅쿼리 설정(out:) p12_keyfile에 넣어준다.


# keyfile은 default로 로컬로 다운받아진다. 

본 글에서는 VM환경에서 실습을 진행하므로 keyfile을 VM instance로 옮겨줘야 한다.


로컬에 있는 파일을 Google Cloud환경으로 옮기기 위해서는 다음의 방법이 있다.


1. GCS의 Bucket을 이용한 방법 (gsutil)

2. Cloud SDK를 설치 후, 로컬에서 커맨드 입력 (gcloud compute scp)


본 글에서는 BigQuery의 설정을 할 때, Bucket의 설정을 하게되므로 1번 방법을 사용하겠다.


그렇다면, 먼저 Bucket을 생성해보자.


메뉴에서 Storage를 누른다.

상단에 버킷 생성을 누른다.

다음과 같이 나오면 이름을 넣고 기본 저장소 클래스를 선택하고 만들기 버튼을 누른다.

다음과 같이 생성된 Bucket을 볼 수 있다.

Bucket 이름을 클릭하여 상단에 파일 업로드 버튼을 누른다.

로컬에 다운로드 받은 p12파일을 업로드한다.


이제 이 p12파일VM instance에 옮기면 된다.

먼저, 실습한 내용을 보자.

p12파일이 VM instance로 잘 이동된 것을 볼 수 있다.


Bucket에 있는 파일을 옮기는 구문은 다음과 같다.

$ sudo gsutil cp -r [Bucket의 파일경로] [복사한 파일을 위치시킬 디렉토리 명]



p12파일을 옮기는 작업도 끝났다.

Bucket의 이름은 out: 부분의 gcs_bucket에 적어주면 된다. 

그러면 6. gcs_bucket 의 설정도 끝난다.


3. project

# 여기에는 구글 클라우드 프로젝트 ID를 적어주면 된다.

일단 정보를 가져오기 위해서 Google Cloud Platform의 메인으로 간다.

그럼 대시보드에서 프로젝트 ID를 알 수 있다.

4. dataset

# 여기에는 BigQuery의 dataset 적어주면 된다.


메뉴에서 BigQuery에 들어간다.

그럼 다음과 같이 나온다.

우측의 화살표를 클릭 후, Create new dataset을 클릭한다.

다음과 같이 나오면 Dataset ID를 넣고 OK를 누른다.

BigQuery의 Dataset이 생성된 것을 볼 수 있다.

여기의 Dataset ID를 설정에 적으면 된다.


5. table

# 여기에는 BigQuery의 테이블명 적어주면 된다.

-> 테이블이 없다면 생성하고 싶은 테이블명을, 테이블이 존재한다면 존재하는 테이블의 이름을 적으면 된다.



이제, 설정이 완료되었다.


설정이 완료된 모습

이렇게 해서 전부 다 끝나면 다음과 같은 명령어를 입력하여 작업을 마무리 한다.

$ embulk run config.yml

Embulk로 BigQuery에 데이터를 로딩하는 화면

데이터가 잘 들어갔는지 확인해보자.

Embulk에서 제공하는 Sample데이터가 Cloud SQL에서 BigQuery로 잘 로드된 것을 볼 수 있다.



# Error


"error_description" : "Required parameter is missing: grant_type"

권한이 없다고 Embulk 실행할때 문제가 발생할 수 있다. 

IAM 및 관리자 -> IAM 에 들어가서 서비스 계정 ID를 넣어서 검색을 한다.

우측에 있는 역할을 눌러서 역할이 있는지 확인을 한다.

위와 같이 권한을 주면 보통 다 해결된다.


다음 포스팅에서는 BigQuery에 데이터 로드 시, 분할하여 로드하는 테스트를 해보겠다.

(다음챕터 : Embulk를 Bigquery 데이터 분할 로드)


# 궁금한점은 댓글 남겨주시면 부족한 지식이지만 답변 드리겠습니다.



참고자료 : 

1. Jungwoon Blog - Embulk로 BigQuery에 데이터 로딩하기 - https://jungwoon.github.io/bigdata/2017/09/01/Embulk_BigQuery/