해당 내용은 MAC에 설치한 것이며, JAVA기반으로 실행되는 것이니 리눅스 환경에서도 별 다르지 않을거라 생각한다.
embulk는 자바 1.8버전에서 실행되니 높은버전이라면 이것을 사용하기 위한 JAVA를 설치하거나 경로설정 하는 것을 추천한다.
참고로 버전이 맞지 않으면 다음과 같은 경고문을 자주 보게 되고 실행에 실패한다(내 컴퓨터는 12 버전이 기본값이다.)
OpenJDK 64-Bit Server VM warning: Ignoring option AggressiveOpts; support was removed in 12.0
또는
[WARN] Unrecognized Java version: openjdk full version "12.0.1+12"
실행할 때
OpenJDK 64-Bit Server VM warning: Ignoring option AggressiveOpts; support was removed in 12.0
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
2020-07-13 10:43:16.625 +0900: Embulk v0.9.23
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
at org.apache.bval.jsr303.ConfigurationImpl.parseValidationXml(ConfigurationImpl.java:268)
at org.apache.bval.jsr303.ConfigurationImpl.prepare(ConfigurationImpl.java:258)
at org.apache.bval.jsr303.ConfigurationImpl.doPrivBuildValidatorFactory(ConfigurationImpl.java:248)
at org.apache.bval.jsr303.util.SecureActions$5.run(SecureActions.java:131)
at org.apache.bval.jsr303.util.SecureActions$5.run(SecureActions.java:129)
at org.apache.bval.jsr303.ConfigurationImpl.run(ConfigurationImpl.java:337)
at org.apache.bval.jsr303.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:244)
at org.embulk.config.ModelManager.<init>(ModelManager.java:24)
at org.embulk.EmbulkEmbed$Bootstrap.<init>(EmbulkEmbed.java:52)
at org.embulk.cli.EmbulkRun.runSubcommand(EmbulkRun.java:409)
at org.embulk.cli.EmbulkRun.run(EmbulkRun.java:90)
at org.embulk.cli.Main.main(Main.java:64)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 12 more
Github을 찾아가면 아직 12버전은 지원하지 않는다고 되어있다.(2019.08.01 글 기준)
그러니 자바 8버전 설치를 추천한다.
https://github.com/embulk/embulk/issues/1168
이제 본격 설치 및 수행하는 것을 알아보자
여기서는 embulk 0.9.23 버전 설치를 다룬다.
아래 명령어는 다음 4가지를 수행한다
1) 최신버전 다운로드 (~/.embulk/bin/embulk 에 저장)
2) 실행권한 추가
3) 환경설정 추가
4) 변경된 환경설정 적용
curl --create-dirs -o ~/.embulk/bin/embulk -L "https://dl.embulk.org/embulk-latest.jar"
chmod +x ~/.embulk/bin/embulk
echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
mysql을 사용할 것이기에 관련 플러그인 설치한다(bigquery 등 다른걸 설치하면 거기에 맞는 플러그인을 찾아 설치하면 된다)
찾는방법은 다음과 같다.
embulk gem list|grep [설치할 플러그인]
mysql 을 검색하면 다음과 같은 결과가 출력된다
embulk gem list|grep mysql
...
embulk-input-mysql (0.10.1)
embulk-output-mysql (0.8.7)
...
이름 중간에 input과 output이 있는데, input은 가져올 곳 output은 저장할 곳을 의미한다.
(추후 설정파일을 만들때도 in은 데이터를 추출할 곳, out은 데이터를 저장할 것을 지정한다.)
그럼 mysql을 설치한다.
embulk gem install embulk-input-mysql
이제 embulk를 사용할 폴더를 만들자.
내 경우는 ~/tmp/embulk-example 에 넣어두었다.
설정파일을 생성한다.
여기선 파일명을 mysql-csv.yml 이라 지정했다
mkdir -p ~/tmp/embulk-example
cd ~/tmp/embulk-example
vi mysql-csv.yml
in:
type: mysql
host: [데이터베이스 IP]
user: [user]
password: [비밀번호]
database: [데이터베이스 명]
query: |
[쿼리]
options: {useLegacyDatetimeCode: false, serverTimezone: Asia/Seoul}
out:
type: file
path_prefix: "./csv/file_"
file_ext: csv
formatter:
charset: UTF-8
newline: LF
type: csv
delimiter: ","
quote: '"'
escape: '"'
null_string: 'NULL'
이제 명령을 수행해보자
embulk run mysql-csv.yml
2020-07-13 10:46:35.640 +0900: Embulk v0.9.23
2020-07-13 10:46:36.310 +0900 [WARN] (main): DEPRECATION: JRuby org.jruby.embed.ScriptingContainer is directly injected.
2020-07-13 10:46:38.243 +0900 [INFO] (main): Gem's home and path are set by default: "/Users/dgpark/.embulk/lib/gems"
2020-07-13 10:46:43.837 +0900 [INFO] (main): Started Embulk v0.9.23
...
2020-07-13 10:46:44.252 +0900 [INFO] (0001:transaction): Using local thread executor with max_threads=24 / output tasks 12 = input tasks 1 * 12
2020-07-13 10:46:44.270 +0900 [INFO] (0001:transaction): {done: 0 / 1, running: 0}
2020-07-13 10:46:44.299 +0900 [INFO] (0016:task-0000): Writing local file './csv/file_000.00.csv'
2020-07-13 10:46:44.302 +0900 [INFO] (0016:task-0000): Writing local file './csv/file_001.00.csv'
2020-07-13 10:46:44.304 +0900 [INFO] (0016:task-0000): Writing local file './csv/file_002.00.csv'
2020-07-13 10:46:44.305 +0900 [INFO] (0016:task-0000): Writing local file './csv/file_003.00.csv'
2020-07-13 10:46:44.306 +0900 [INFO] (0016:task-0000): Writing local file './csv/file_004.00.csv'
2020-07-13 10:46:44.308 +0900 [INFO] (0016:task-0000): Writing local file './csv/file_005.00.csv'
2020-07-13 10:46:44.310 +0900 [INFO] (0016:task-0000): Writing local file './csv/file_006.00.csv'
2020-07-13 10:46:44.311 +0900 [INFO] (0016:task-0000): Writing local file './csv/file_007.00.csv'
2020-07-13 10:46:44.313 +0900 [INFO] (0016:task-0000): Writing local file './csv/file_008.00.csv'
2020-07-13 10:46:44.314 +0900 [INFO] (0016:task-0000): Writing local file './csv/file_009.00.csv'
2020-07-13 10:46:44.316 +0900 [INFO] (0016:task-0000): Writing local file './csv/file_010.00.csv'
2020-07-13 10:46:44.317 +0900 [INFO] (0016:task-0000): Writing local file './csv/file_011.00.csv'
2020-07-13 10:46:44.334 +0900 [INFO] (0016:task-0000): Fetch size is 10000. Using server-side prepared statement.
...
2020-07-13 10:46:44.351 +0900 [INFO] (0016:task-0000): > 0.00 seconds
2020-07-13 10:46:44.393 +0900 [INFO] (0001:transaction): {done: 1 / 1, running: 0}
2020-07-13 10:46:44.396 +0900 [INFO] (main): Committed.
2020-07-13 10:46:44.396 +0900 [INFO] (main): Next config diff: {"in":{},"out":{}}
실행 결과 폴더를 보면 파일이 다음과같이 12개 생성되었다.
로그를 보면 input tasks와 output tasks 가 12개로 실행되었고, 때문에 파일이 12개나 생성되었다.
실제로 파일내 내용은 없는데도 불구하고 tasks의 갯수만큼 빈 파일이 생성된 것이다.(header는 있지만)
이 부분을 조절하려면 mysql-csv.xml에 다음을 추가한다.
exec:
max_threads: 16
min_output_tasks: 1
in:
type: mysql
host: [데이터베이스 IP]
user: [user]
password: [비밀번호]
database: [데이터베이스 명]
query: |
[쿼리]
options: {useLegacyDatetimeCode: false, serverTimezone: Asia/Seoul}
out:
type: file
path_prefix: "./csv/file_"
file_ext: csv
formatter:
charset: UTF-8
newline: LF
type: csv
delimiter: ","
quote: '"'
escape: '"'
null_string: 'NULL'
이제 파일을 지우고 다시 수행해보자.
파일이 1개만 생성된 걸 확인 가능하다.(파일 내 내용도 들어있는지 확인)
끝.
참조:
https://jungwoon.github.io/bigdata/2017/08/31/Embulk_Setup/
댓글