カピバラ好きなエンジニアブログ

興味ある技術とか検証した内容を赴くままに書いていきます。カピバラの可愛さこそ至高。

EmbulkでSQL ServerのデータをS3にアップロードしてみた

今回は今までSQL Serverから取得していたデータをS3にアップロードしてみます。

使用するEmbulk のプラグインは以下です。
github.com


実施作業

プラグインのインストール

最初に必要なプラグインをインストールします。

  • 実行コマンド
embulk gem install embulk-output-s3
  • 実行結果
PS C:\Users\Administrator> embulk gem install embulk-output-s3
2020-03-26 16:57:48.685 +0900: Embulk v0.9.23

Gem plugin path is: C:\Users\Administrator\.embulk\lib\gems

Fetching: embulk-output-s3-1.5.0.gem (100%)
Successfully installed embulk-output-s3-1.5.0
1 gem installed



正常にインストールできたか確認を行います。

  • 実行コマンド
embulk gem list
  • 実行結果
PS C:\Users\Administrator> embulk gem list
2020-03-26 17:49:17.921 +0900: Embulk v0.9.23

Gem plugin path is: C:\Users\Administrator\.embulk\lib\gems


*** LOCAL GEMS ***

bundler (1.16.0)
did_you_mean (default: 1.0.1)
embulk (0.9.23 java)
embulk-input-sqlserver (0.10.1)
embulk-output-s3 (1.5.0)
embulk-output-sqlserver (0.8.7)
jar-dependencies (default: 0.3.10)
jruby-openssl (0.9.21 java)
jruby-readline (1.2.0 java)
json (1.8.3 java)
liquid (4.0.0)
minitest (default: 5.4.1)
msgpack (1.1.0 java)
net-telnet (default: 0.1.1)
power_assert (default: 0.2.3)
psych (2.2.4 java)
rake (default: 10.4.2)
rdoc (default: 4.2.0)
test-unit (default: 3.1.1)



SQL Server上のアップロードデータを確認します。
f:id:live-your-life-dd18:20200326175317p:plain

yamlファイル作成

次にconfigファイルを生成するためのyamlファイルを作成します。
これはSQL ServerのものとGitHubのサンプルを参考にしました。(キーはダミーです)

in:
  type: sqlserver
  driver_path: C:\drivers\sqljdbc_7.2\jpn\mssql-jdbc-7.2.2.jre8.jar
  host: EC2AMAZ-JGN0VFT
  user: dbuser
  password: "******"
  database: TESTDB
  schema: dbo
  table: Employee
  incremental: true
  incremental_columns:
    - No
    - RegDate
out:
  type: s3
  path_prefix: test/TESTDB_dbo_Employee
  file_ext: .csv
  bucket: test-tmp-20200326
  endpoint: s3-ap-northeast-1.amazonaws.com
  access_key_id: ABCXYZ123ABCXYZ123
  secret_access_key: AbCxYz123aBcXyZ123
  formatter:
    type: csv

ここの設定の中でS3のアップロード先のパス(path_prefix)を設定していますが、最後のスラッシュ以降はアップロードしたときの名前になるので注意が必要です。

あとパスで指定したフォルダ構成は、S3上に存在しなければアップロード時に自動で作成してくれるようです。

Embulk guessコマンド実行

まず以下のguessコマンドを実行して、configファイルを生成します。

  • 実行コマンド
embulk guess .\try1\sqlserver_incremental_to_s3.yml -o .\config_inc_to_s3.yml
  • 実行結果
PS C:\Users\Administrator> embulk guess .\try1\sqlserver_incremental_to_s3.yml -o .\config_inc_to_s3.yml
2020-03-26 18:07:06.894 +0900: Embulk v0.9.23
2020-03-26 18:07:09.262 +0900 [WARN] (main): DEPRECATION: JRuby org.jruby.embed.ScriptingContainer is directly injected.
2020-03-26 18:07:16.610 +0900 [INFO] (main): Gem's home and path are set by default: "C:\Users\Administrator\.embulk\lib
\gems"
2020-03-26 18:07:18.753 +0900 [INFO] (main): Started Embulk v0.9.23
2020-03-26 18:07:19.005 +0900 [INFO] (0001:guess): Loaded plugin embulk-input-sqlserver (0.10.1)
in:
  type: sqlserver
  driver_path: C:\drivers\sqljdbc_7.2\jpn\mssql-jdbc-7.2.2.jre8.jar
  host: EC2AMAZ-JGN0VFT
  user: dbuser
  password: ******
  database: TESTDB
  schema: dbo
  table: Employee
  incremental: true
  incremental_columns: ['No', RegDate]
out:
  type: s3
  path_prefix: test/TESTDB_dbo_Employee
  file_ext: .csv
  bucket: test-tmp-20200326
  endpoint: s3-ap-northeast-1.amazonaws.com
  access_key_id: AbCxYz123aBcXyZ123
  secret_access_key: AbCxYz123aBcXyZ123
  formatter: {type: csv}

Created '.\config_inc_to_s3.yml' file.



以下のconfigファイルが作成されます。

in:
  type: sqlserver
  driver_path: C:\drivers\sqljdbc_7.2\jpn\mssql-jdbc-7.2.2.jre8.jar
  host: EC2AMAZ-JGN0VFT
  user: dbuser
  password: ******
  database: TESTDB
  schema: dbo
  table: Employee
  incremental: true
  incremental_columns: ['No', RegDate]
out:
  type: s3
  path_prefix: test/TESTDB_dbo_Employee
  file_ext: .csv
  bucket: test-tmp-20200326
  endpoint: s3-ap-northeast-1.amazonaws.com
  access_key_id: AbCxYz123aBcXyZ123
  secret_access_key: AbCxYz123aBcXyZ123
  formatter: {type: csv}


Embulk runコマンド実行

configファイルができたら、それを指定してrunコマンドを実行します。
yamlファイル、configファイルに間違いがなければ処理は正常に終了するはずです。

  • 実行コマンド
embulk run .\config_inc_to_s3.yml -c .\embulk_sql_inc_s3.diff.yaml
  • 実行結果
PS C:\Users\Administrator> embulk run .\config_inc_to_s3.yml -c .\embulk_sql_inc_s3.diff.yaml
2020-03-26 18:17:54.694 +0900: Embulk v0.9.23
2020-03-26 18:17:58.722 +0900 [WARN] (main): DEPRECATION: JRuby org.jruby.embed.ScriptingContainer is directly injected.
2020-03-26 18:18:18.144 +0900 [INFO] (main): Gem's home and path are set by default: "C:\Users\Administrator\.embulk\lib
\gems"
2020-03-26 18:18:25.243 +0900 [INFO] (main): Started Embulk v0.9.23
2020-03-26 18:18:26.321 +0900 [INFO] (0001:transaction): Loaded plugin embulk-input-sqlserver (0.10.1)
2020-03-26 18:18:26.694 +0900 [INFO] (0001:transaction): Loaded plugin embulk-output-s3 (1.5.0)
2020-03-26 18:18:27.206 +0900 [INFO] (0001:transaction): Connecting to jdbc:sqlserver://EC2AMAZ-JGN0VFT:1433 options {us
er=dbuser, password=***, applicationName=embulk-input-sqlserver, databaseName=TESTDB, loginTimeout=300, socketTimeout=18
00000}
2020-03-26 18:18:29.165 +0900 [INFO] (0001:transaction): Using JDBC Driver 7.2.2.0
2020-03-26 18:18:29.822 +0900 [INFO] (0001:transaction): Using local thread executor with max_threads=2 / tasks=1
2020-03-26 18:18:30.093 +0900 [INFO] (0001:transaction): {done:  0 / 1, running: 0}
2020-03-26 18:18:31.694 +0900 [INFO] (0014:task-0000): Writing S3 file 'test/TESTDB_dbo_Employee.000.00.csv'
2020-03-26 18:18:31.823 +0900 [INFO] (0014:task-0000): Connecting to jdbc:sqlserver://EC2AMAZ-JGN0VFT:1433 options {user
=dbuser, password=***, applicationName=embulk-input-sqlserver, databaseName=TESTDB, loginTimeout=300, socketTimeout=1800
000}
2020-03-26 18:18:32.284 +0900 [INFO] (0014:task-0000): SQL: SELECT * FROM "dbo"."Employee" ORDER BY "No", "RegDate"
2020-03-26 18:18:32.322 +0900 [INFO] (0014:task-0000): > 0.02 seconds
2020-03-26 18:18:33.784 +0900 [INFO] (0001:transaction): {done:  1 / 1, running: 0}
2020-03-26 18:18:33.925 +0900 [INFO] (main): Committed.
2020-03-26 18:18:33.956 +0900 [INFO] (main): Next config diff: {"in":{"last_record":[100,"2020-03-26 17:43:51.3266667"]}
,"out":{}}


アップロード確認

S3を確認すると指定した名前でフォルダとファイルが作成されていることがわかります。
f:id:live-your-life-dd18:20200326181957p:plain

ついでにファイルの中身も見てみます。
f:id:live-your-life-dd18:20200326182155p:plain

SQL Serverから取得したデータが1ファイルに設定されていることがわかりました。
f:id:live-your-life-dd18:20200326182227p:plain

感想及び所感

次回はparquetに変換するプラグインを使用して、S3上に指定したファイル形式でアップロードしてみます。