아파치 스쿱(Apache Sqoop)-RDB와 하둡(hadoop)을 연결해보자

업데이트:

아파치 스쿱(Apache Sqoop)이란?

관련링크
하둡에 대해 알아보자

일을 하다보면 관계형데이터베이스(RDB)에서 하둡으로 테이블을 보내거나, 반대로 하둡에서 RDB로 테이블을 보내야 할 때가 있습니다. 아파치 스쿱은 RDB와 하둡 사이에서 둘 사이의 연결을 도와주는 명령 줄 인터페이스(Command-Line Interface) 애플리케이션 입니다.

image1

이런 형태로 스쿱이 RDB와 하둡의 중간에 위치한다고 볼 수 있습니다. 명령어는 크게 import와 export로 구성 되어있습니다.

  • import : RDB -> HDFS (RDB에서 HDFS로 데이터를 가져옵니다.)
  • export : HDFS -> RDB (HDFS에서 RDB로 데이터를 가져옵니다.)

import 예시

$ sqoop import --connect \"URL\" --username \"USERNAME\" --password \"PASSWORD\" --table \"QUERY\" --target-dir \"PATH\" --as-parquetfile --m 1

잘라서 가져오기

sql 문장을 실행했을때 나오는 데이터가 아주 큰 경우에는 잘라서 가져올 필요가 있습니다. 그럴때는 import 하는 sql문에 $CONDITIONS 를 포함해야 합니다. 프리스타일 sql문을 사용하는 경우(쌍따옴표 안에 sql문을 넣을 경우)에는 \$CONDITIONS 를 추가해야합니다. 또한 어느 열을 기준으로 자를지를 결정하는 –split-by 또한 포함해야 합니다.

Sqoop can also import the result set of an arbitrary SQL query. Instead of using the –table, –columns and –where arguments, you can specify a SQL statement with the –query argument.

When importing a free-form query, you must specify a destination directory with –target-dir.

If you want to import the results of a query in parallel, then each map task will need to execute a copy of the query, with results partitioned by bounding conditions inferred by Sqoop. Your query must include the token $CONDITIONS which each Sqoop process will replace with a unique condition expression. You must also select a splitting column with –split-by.

For example:

$ 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
Alternately, the query can be executed once and imported serially, by specifying a single map task with -m 1:

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