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

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

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

★★★祝 50記事目!!!★★★


前回はS3にCSVファイルとしてアップロードしたので、今回はparquetに変換してS3にアップロードしてみます。

parquet変換に使用するEmbulk のプラグインは以下です。
このプラグイン使っている人があまりいないのか、Googleで検索してもほとんど参考になる情報が出てきませんでした。
github.com

尚、上記のプラグインはembulk-output-parquetとは異なるので注意です。
作者の方が以下のように説明しています。


実施作業

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

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

  • 実行コマンド
embulk gem install embulk-output-s3_parquet
  • 実行結果
PS C:\Users\Administrator> embulk gem install embulk-output-s3_parquet
2020-03-26 19:28:34.098 +0900: Embulk v0.9.23

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

Fetching: embulk-output-s3_parquet-0.2.0.gem (100%)
Successfully installed embulk-output-s3_parquet-0.2.0
1 gem installed



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

  • 実行コマンド
embulk gem list
  • 実行結果
PS C:\Users\Administrator> embulk gem list
2020-03-26 18:38:20.583 +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-parquet (0.6.0)
embulk-output-s3 (1.5.0)
embulk-output-s3_parquet (0.2.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ファイルを作成します。(キーはダミーです)

in:
  type: sqlserver
  driver_path: C:\drivers\sqljdbc_7.2\jpn\mssql-jdbc-7.2.2.jre8.jar
  host: EC2AMAZ-L2BKFDH
  user: dbuser
  password: "******"
  database: TESTDB
  schema: dbo
  table: Employee
  incremental: true
  incremental_columns:
    - No
    - RegDate
out:
  type: s3_parquet
  bucket: test-tmp-20200326
  path_prefix: test_parquet/TESTDB_dbo_Employee
  file_ext: snappy.parquet
  compression_codec: snappy
  default_timezone: Asia/Tokyo
  access_key_id: AbCxYz123aBcXyZ123
  secret_access_key: AbCxYz123aBcXyZ123


Embulk guessコマンド実行

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

  • 実行コマンド
embulk guess .\try1\sqlserver_incremental_to_s3_parquet.yml -o .\config_inc_to_s3_parquet.yml
  • 実行結果
PS C:\Users\Administrator> embulk guess .\try1\sqlserver_incremental_to_s3_parquet.yml -o .\config_inc_to_s3_parquet.yml

2020-03-26 18:51:47.993 +0900: Embulk v0.9.23
2020-03-26 18:51:50.274 +0900 [WARN] (main): DEPRECATION: JRuby org.jruby.embed.ScriptingContainer is directly injected.
2020-03-26 18:51:58.078 +0900 [INFO] (main): Gem's home and path are set by default: "C:\Users\Administrator\.embulk\lib
\gems"
2020-03-26 18:52:00.430 +0900 [INFO] (main): Started Embulk v0.9.23
2020-03-26 18:52:00.728 +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-L2BKFDH
  user: dbuser
  password: ******
  database: TESTDB
  schema: dbo
  table: Employee
  incremental: true
  incremental_columns: ['No', RegDate]
out: {type: s3_parquet, bucket: test-tmp-20200326, path_prefix: test_parquet/TESTDB_dbo_Employee,
  file_ext: snappy.parquet, compression_codec: snappy, default_timezone: Asia/Tokyo,
  access_key_id: AbCxYz123aBcXyZ123, secret_access_key: AbCxYz123aBcXyZ123}

Created '.\config_inc_to_s3_parquet.yml' file.



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

PS C:\Users\Administrator> cat .\config_inc_to_s3_parquet.yml
in:
  type: sqlserver
  driver_path: C:\drivers\sqljdbc_7.2\jpn\mssql-jdbc-7.2.2.jre8.jar
  host: EC2AMAZ-L2BKFDH
  user: dbuser
  password: ******
  database: TESTDB
  schema: dbo
  table: Employee
  incremental: true
  incremental_columns: ['No', RegDate]
out: {type: s3_parquet, bucket: test-tmp-20200326, path_prefix: test_parquet/TESTDB_dbo_Employee,
  file_ext: snappy.parquet, compression_codec: snappy, default_timezone: Asia/Tokyo,
  access_key_id: AbCxYz123aBcXyZ123, secret_access_key: AbCxYz123aBcXyZ123}


Embulk runコマンド実行

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

  • 実行コマンド
embulk run .\config_inc_to_s3_parquet.yml -c .\embulk_sql_inc_s3_parquet.diff.yaml
  • 実行結果
Error: java.lang.RuntimeException: java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.
home.dir are unset. -see https://wiki.apache.org/hadoop/WindowsProblems



エラーが出て失敗しました。
Hadoopの設定が足りていないようでしたので、以下のURLを参考に設定してみます。

yomon.hatenablog.com


またエラーが出ました。

org.embulk.exec.PartialExecutionException: com.amazonaws.SdkClientException: Unable to load AWS credentials from any provider in the chain: [EnvironmentVariableCredentialsProvider: Unable to load AWS credentials from environment variables (AWS_ACCESS_KEY_ID (or AWS_ACCESS_KEY) and AWS_SECRET_KEY (or AWS_SECRET_ACCESS_KEY)), SystemPropertiesCredentialsProvider: Unable to load AWS credentials from Java system properties (aws.accessKeyId and aws.secretKey), WebIdentityTokenCredentialsProvider: You must specify a value for roleArn and roleSessionName, com.amazonaws.auth.profile.ProfileCredentialsProvider@3a843c77: profile file cannot be null, com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper@187c9e25: The requested metadata is not found at http://169.254.169.254/latest/meta-data/iam/security-credentials/]

以下のReadmeを読む限り、設定ファイルでauth_methodパラメータが設定されていない場合は、デフォルトで環境変数にキーがないか確認しにいくようで、そのパラメータをyamlファイル内に記載したキーを見るように設定します。
github.com


修正後のyamlファイルは以下になります。
このファイルでrunコマンドを実行してみます。

in:
  type: sqlserver
  driver_path: C:\drivers\sqljdbc_7.2\jpn\mssql-jdbc-7.2.2.jre8.jar
  host: EC2AMAZ-L2BKFDH
  user: dbuser
  password: "******"
  database: TESTDB
  schema: dbo
  table: Employee
  incremental: true
  incremental_columns:
    - No
    - RegDate
out:
  type: s3_parquet
  bucket: test-tmp-20200326
  path_prefix: test_parquet/TESTDB_dbo_Employee
  file_ext: snappy.parquet
  compression_codec: snappy
  default_timezone: Asia/Tokyo
  auth_method: basic
  access_key_id: AbCxYz123aBcXyZ123
  secret_access_key: AbCxYz123aBcXyZ123



今度はうまくいきました。
f:id:live-your-life-dd18:20200327174903p:plain

アップロード確認

S3を確認するとフォルダも自動生成されており、parquet形式でファイルが出力されていました。
f:id:live-your-life-dd18:20200327174933p:plain


ファイルの中身も想定通り入っています。
f:id:live-your-life-dd18:20200327175045p:plain

感想及び所感

プラグインのReadmeにはHadoopをインストールしておくとは書いていなかったのですが、とりあえず環境変数にないと言われているので、インストールしたらよいかと思って実施したらエラーが解決できたのでよかったです。
仕組み的なところはあまり理解できていないので、ソースの読み込みなどはしていこうと思います。