IICSでS3から複数ファイル読み込み
IICS(Informatica Intelligent Cloud Services)のデータ統合機能で、S3から複数ファイルを読み込む必要があったので、その際に調べた方法をまとめたものです。また後でわかったことですが、有償版であれば「一括取り込み」機能でもっと簡単に実装できるようです。
IICSとは
IICS(Informatica Intelligent Cloud Services)は、Informatica社が提供するクラウド型のデータ統合ソリューションです。SaaS型のETLツールといってもよいかもしれません。
一般的なETLとしての、各種データソースからのデータ抽出、統合処理、ロードまでをGUIで実装できます。
前提条件
IICSは、公式サイトより30日間の無償トライアルを利用できます。一部機能は制限されますが、基本的なデータ統合処理を試すことは可能です。
IICSでは、ランタイム環境として提供される「Secure Agent」をサーバーにインストールすることで、データを外部に出すことなく処理を実行できます。
今回は下記の環境を用意しました。EC2上にSecure Agentをインストールしています。
EC2へのSecure Agentのインストールは、クラスメソッド様の記事が参考になります。
IICS Secure AgentをWindows環境にインストールしてみる | DevelopersIO
処理概要
IICSで下記の手順を実施します。
1.データソースとの接続を作成
2.マニフェストファイルを作成
3.ジョブの作成
ソースにS3、ターゲットにはRedshiftを使用します。
また、事前に下記のようなデータファイルを作成し、S3の所定の階層にアップロードしておきます。
S3の階層は<バケット名>/informatica/sample
としています。
・サンプルデータ(data-01.csv)
id | val | file |
---|---|---|
1 | 41 | file1 |
2 | 36 | file1 |
3 | 10 | file1 |
1ファイル10行のデータを、10ファイルに分割し配置(合計100行のデータ)。列「file」にはファイル番号を入力。
データソースとの接続を作成
ここから、IICSでの作業に入ります。まずはデータソースに使うS3とRedshiftの接続を作成します。
IICSの管理者画面より「新しい接続」を作成します。
- S3
下記の通り設定しました。「Use EC2 Role to Assume Role」にチェックを入れることで、EC2に付与したS3への読み取り権限をIICSでも使用しています。
- Redshift
こちらは直接接続情報を入力しています。JDBCURLを使用することに注意してください。
マニフェストファイルの作成
S3から複数ファイルを読み込むには、マニフェストファイルを作成します。詳細はマニュアルに記載があり、雛形としても使用できます。(PowerCenterのマニュアルですが同様の設定で問題ありませんでした。)
今回は、すべてのファイルが同じ階層にあるので、下記のように設定しました。マニュフェストファイルを作成したら、同じS3バケットにアップロードしておきます。
{ "fileLocations": [{ "WildcardURIs": [ "informatica/sample/data_*.csv" ] }, { "URIPrefixes": [ "<バケット名>/" ] }], "settings": { "stopOnFail": "true" } }
ジョブの作成
新規のマッピングタスクを起動し、ジョブを作成します。今回のジョブは下図の通りです。データを左から右に流すシンプルなつくりです。
- ソースの設定
ソースのプロパティは下記のように設定しました。
オブジェクトの設定では、先程作成したマニュフェストファイルを指定します。
形式には「フラットファイル」を指定します。オプションで区切り文字やヘッダーの有無を指定します。
また、今回は、スキーマを別ファイルで作成しインポートしています。
IICSで各種データを読み込む際は、データのスキーマを定義する必要があります。ソースがデータベースであればスキーマ情報を取得できますが、ファイルの場合、全項目が「String」型として扱われます。
列数が少ない際は、「フィールド」設定からGUIで編集しても良いですが、列が多い場合はミスの原因となります。
json形式で定義したスキーマ情報を適用することができるので、この場で指定しています。
スキーマは下記のように定義しました。
{"Columns": [ {"Name":"id","Type":"number","Precision":"316","Scale":"0"}, {"Name":"val","Type":"number","Precision":"316","Scale":"0"}, {"Name":"file","Type":"string","Precision":"316","Scale":"0"} ] }
ファイルを適用後、スキーマ情報が更新されていることを確認します。
- ターゲットの設定
ターゲットの設定は下記の通りです。publicスキーマに、「informatica_out」という新規テーブルを作成することとしました。
IICSでターゲットをRedshiftとする際は、ターゲットの詳細設定の「S3 Bucket Name」を指定しなければいけないので、今回使用するバケット名を記入しておきます。
また「Copy Options」に下記を記述し、インサート時にはコピーコマンドが呼び出されるようにしておきます。(事前にRedshiftへS3に対する権限は付与しておきます。)
「Copy Options」欄にコピーコマンドのオプションを記述する際のオプションの区切りにはセミコロンを使用することに注意してください。マニュアルでは、ロールARNの区切り文字にもセミコロンが使用されていますが、この部分はコロンでないとエラーとなります。
DELIMITER=,;AWS_IAM_ROLE=<iam role arn>
また、Redshiftのコピーコマンドの実行時は、Secure Agentに下記の設定を済ませておくことを推奨します。
テーブルの確認
上述の設定後、ジョブを実行します。問題無く実行出来たら、Redshift側でテーブルを確認します。
まとめ
有償版の「一括取り込み」機能であればもっと簡単に実装できるようですが、データ統合機能のみでも複数ファイル読み込みが実行できることを確認できました。この場合、Informaticaの機能というよりは、Redshiftの機能を呼び出すことになるのですが、複雑な処理を実装しようとすると、ツール以外のリソースの機能もある程度抑えておく必要がありそうです。
今回は以上になります。