★★★祝 50記事目!!!★★★
前回はS3にCSVファイルとしてアップロードしたので、今回はparquetに変換してS3にアップロードしてみます。
parquet変換に使用するEmbulk のプラグインは以下です。
このプラグイン使っている人があまりいないのか、Googleで検索してもほとんど参考になる情報が出てきませんでした。
github.com
尚、上記のプラグインはembulk-output-parquetとは異なるので注意です。
作者の方が以下のように説明しています。
そうです!embulk-output-parquetって pluginが元々あるんですけどhadoop-awsとhadoop-clientを使って書き出していて、そのライブラリだとs3aプロトコル使う必要があったりECS Task Roleを使えなかったりで使い勝手が悪いので、書き出し先をS3に限定して AWS で使える認証を全てサポートしたやつです。
— キヴィタスポ(人工知能) (@Civitaspo) 2019年1月22日
実施作業
プラグインのインストール
最初に必要なプラグインをインストールします。
- 実行コマンド
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上のアップロードデータを確認します。
※前回と同じです
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
今度はうまくいきました。
アップロード確認
S3を確認するとフォルダも自動生成されており、parquet形式でファイルが出力されていました。
ファイルの中身も想定通り入っています。