Talend Open Studio for Data Integration 6.2.0を触ってみた。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。
DI部で大変お世話になっているTalendの6.2.0が出たようなので、触ってみました。
Home - Talend Open Studio for Data Integration 6.2.1 - Release Notes (EN) - Talend Online Documentation & Knowledge Base *1

特に、AWS RedshiftやAWS S3関連の更新について取り上げてみたいと思います。

Java 8 環境で動くようになりました。

Talend 6.0系はOpenStudioを起動する際にJava7を要求していましたが、
Talend 6.2.0ではJava 8で動くようになったようです。
この記事を執筆している環境のJavaは以下のようになっております。

$ java -version
java version "1.8.0_92"
Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)

また、作成したJOBはJava 7でも動いています。
この記事を執筆した際に動かしたEC2に入っていたJAVAは下記になります。

[ec2-user@ip-172-31-32-175 ~]$ java -version
java version "1.7.0_101"
OpenJDK Runtime Environment (amzn-2.6.6.1.67.amzn1-x86_64 u101-b00)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)

Redshiftをつなぐ際に用いるDriverがAmazon Redshift JDBC ドライバーになりました。

リリースノートに以下のように記載がありました。

The Studio now allows you to specify additional JDBC parameters when creating a Redshift database connection 
using the official Amazon Redshift driver.

本当に、RedshiftのJDBCを使うようになったのか確認してみました。
まず、RedshiftのコンポーネントをTalendのジョブ上に配置してみます。
そうすると初回はJDBCのダウンロードを求められました。

RedshiftDriver_01

RedshiftDriver_02

次に、例外を起こして本当にRedshiftのJDBCドライバを使っているか確認してみます。
tRedshiftConnectionを配置し、何も設定しないで実行します。
その場合、当然接続先が設定されていないため接続エラーとなります。
Talend 6.2の接続失敗のエラーは以下のようになっていました。

Talend 6.2での接続失敗ログ

[statistics] connecting to socket on port 3617
[statistics] connected
Exception in component tRedshiftConnection_1
java.sql.SQLException: [Amazon](500150) Error setting/closing connection: Connection refused.
	at com.amazon.redshift.client.PGClient.connect(PGClient.java:537)
	at com.amazon.redshift.client.PGClient.<init>(PGClient.java:329)
	at com.amazon.redshift.core.PGJDBCConnection.connect(PGJDBCConnection.java:534)
	at com.amazon.jdbc.common.BaseConnectionFactory.doConnect(Unknown Source)
	at com.amazon.jdbc.common.AbstractDriver.connect(Unknown Source)
	at java.sql.DriverManager.getConnection(DriverManager.java:664)
	at java.sql.DriverManager.getConnection(DriverManager.java:247)
	at local_project.talendupdatecomponentcheck_0_1.TalendUpdateComponentCheck.tRedshiftConnection_1Process(TalendUpdateComponentCheck.java:313)
	at local_project.talendupdatecomponentcheck_0_1.TalendUpdateComponentCheck.runJobInTOS(TalendUpdateComponentCheck.java:579)
Caused by: com.amazon.support.exceptions.GeneralException: [Amazon](500150) Error setting/closing connection: Connection refused.
	... 9 more
[statistics] disconnected
Caused by: java.net.ConnectException: Connection refused
	at sun.nio.ch.Net.connect0(Native Method)
	at sun.nio.ch.Net.connect(Net.java:454)
	at sun.nio.ch.Net.connect(Net.java:446)
	at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:648)
	at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:96)
	at com.amazon.redshift.client.PGClient.connect(PGClient.java:504)
	at com.amazon.redshift.client.PGClient.<init>(PGClient.java:329)
	at com.amazon.redshift.core.PGJDBCConnection.connect(PGJDBCConnection.java:534)
	at com.amazon.jdbc.common.BaseConnectionFactory.doConnect(Unknown Source)
	at com.amazon.jdbc.common.AbstractDriver.connect(Unknown Source)
	at java.sql.DriverManager.getConnection(DriverManager.java:664)
	at java.sql.DriverManager.getConnection(DriverManager.java:247)
	at local_project.talendupdatecomponentcheck_0_1.TalendUpdateComponentCheck.tRedshiftConnection_1Process(TalendUpdateComponentCheck.java:313)
	at local_project.talendupdatecomponentcheck_0_1.TalendUpdateComponentCheck.runJobInTOS(TalendUpdateComponentCheck.java:579)
	at local_project.talendupdatecomponentcheck_0_1.TalendUpdateComponentCheck.main(TalendUpdateComponentCheck.java:436)
ジョブ TalendUpdateComponentCheck が 11:50 07/07/2016 に終了しました。 [終了コード=1]

5行目をみると、確かにRedshiftのJDBCを使っているようです。
比較として、Talend 6.0で同一のエラーを出した際の例外を掲載します。

Talend 6.0の接続失敗ログ

[statistics] connecting to socket on port 3728
[statistics] connected
Exception in component tRedshiftConnection_1
org.postgresql.util.PSQLException: 接続の試みは失敗しました。
	at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:150)
	at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
	at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125)
	at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)
	at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
	at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:30)
	at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
	at org.postgresql.Driver.makeConnection(Driver.java:393)
	at org.postgresql.Driver.connect(Driver.java:267)
	at java.sql.DriverManager.getConnection(DriverManager.java:571)
	at java.sql.DriverManager.getConnection(DriverManager.java:215)
	at local_project.redshiftcomponenttest_0_1.redshiftComponentTest.tRedshiftConnection_1Process(redshiftComponentTest.java:326)
[statistics] disconnected
	at local_project.redshiftcomponenttest_0_1.redshiftComponentTest.runJobInTOS(redshiftComponentTest.java:592)
	at local_project.redshiftcomponenttest_0_1.redshiftComponentTest.main(redshiftComponentTest.java:449)
Caused by: java.net.UnknownHostException: :
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:579)
	at java.net.Socket.connect(Socket.java:528)
	at java.net.Socket.<init>(Socket.java:425)
	at java.net.Socket.<init>(Socket.java:208)
	at org.postgresql.core.PGStream.<init>(PGStream.java:62)
	at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:76)
	... 13 more
ジョブ redshiftComponentTest が 11:50 07/07/2016 に終了しました。 [終了コード=1]

3行目でTalend6.2と同一のコンポーネントを使っていることはわかると思います。
しかし、4行目以降で使っているのがPostgresqlのドライバを用いています。
たしかに、Talend 6.2ではRedshiftのJDBCドライバを用いるようになった模様です。

S3に接続する際にIAM Roleを用いることが可能になりました。

TalendでS3にアクセスするジョブを実装すると、AccessKey と SecretKeyを埋め込む必要がありました。
こんなことをしていると社内の有力者からEC2を使っているのにAccessKeyとSecretKeyを埋め込むなんて〜と煽られること必至です。 IAMによるAWS権限管理運用ベストプラクティス (2)

ですが、このアップデートにて有力者に煽られることにビクビクする日もこれでおサバラです。

IAMRole

設定も簡単で、TalendのコンポーネントでS3の接続情報を設定する際に
'Inherit credentials from AWS role'にチェックを入れることで、
Credentialを埋め込むのではなくIAM Roleの権限を用いることが可能になります。

あとは作ったジョブをエクスポートし、AWSに配置して実行すればS3に対してアクセスができます。
下記は上記のジョブを動かした結果です。
AccessKey SecretKeyの埋め込み無しでEC2でS3のバケット一覧が取得できています。

[ec2-user@ip-172-31-32-175 ~]$ ./TalendUpdateComponentCheck_run.sh
log4j:WARN No appenders could be found for logger (com.amazonaws.AmazonWebServiceClient).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
cm-kajiwara-ageimo-site
cm-kajiwara-image
cm-kajiwara-redshift-copy

ようやくジョブにAccessKeyとSecretKeyを埋め込まずにすんだと思ったのですが、一点だけ問題が有ります。
それは、上記の設定では内部的にはEC2 metadata serviceを参照して、
Credentialを設定しているといった挙動になります。
そのため、ローカルで開発している際は該当の箇所を動かそうとするとエラーとなってしまい、
ローカルで動かす際はAccessKey SecretKeyの埋め込みがやっぱり必要となってしまいます。

この箇所の挙動としては引数なしのコンストラクタでインスタンスを作った時と同じ挙動にしてもらえると、
ジョブ内にAccessKey SecretKeyを埋め込む必要がなくなって良いのになぁと思う次第です。

小ネタ

リリースノートに記載してあるとおりなのですが、third-party libraryを取得後に再起動を要求されなくなりました。

脚注

  1. Talend 6.2.0 のページから遷移するRelease Notesが6.2.1となっておりました。 ちなみにOpen Studioのバージョンは6.2.0 どういうことなのだろうか。