bulkアダプタの使用方法を教えてください

Four Stars

bulkアダプタの使用方法を教えてください

基本的な操作に関する質問で恐縮ですが、bulkアダプタの使用方法がわからず、ご教授いただきたい次第です。

想定としては100万件のデータをDBにsend、ならびにoutputで取得する動作を行いたいです。

よろしくお願いいたします。
Moderator

Re: bulkアダプタの使用方法を教えてください

nakanaka さん

 

bulk アダプタとは、例えば、OracleでしたらtOracleBulkExecコンポーネント等の使い方を指してますでしょうか?

---
Have fun!
Four Stars

Re: bulkアダプタの使用方法を教えてください

そうです!

 

今回はOracle(12c)との接続を想定しています。

 

マニュアルを熟読するとtOracleOutputBulkプロパティ等で「tOracleOutputBulk および tOracleBulkExec コンポーネントは、組み合わせて使用され~」という記述をよく見かけますが、

変換処理を行わずデータをそのままの形でOracleへ挿入、取得時もコンポーネントを2つ使用しなければならないのか?じゃあtOracleOutputBulkExec1つでエラーになる理由は?等々疑問点が多く、質問させていただいたしだいです。

 

下図は作成中の「Oracleに100万件データ(csv)を挿入する」スクリプトの現状です。こいつを動く形にするには何が必要なのか教えていただけると幸いです。

 

よろしくお願い致します。

キャプチャ.PNG

Moderator

Re: bulkアダプタの使用方法を教えてください

nakanaka さん

 

Talendは、DBMS向けのバルクロード用コンポーネントとして、3種類のコンポーネントを標準的には提供します。まず、これらの使い分けを。

 

i) tDBMSBulkExec

DBMSが提供するバルクローダー(Oracleであれば、SQL Loader)を起動・実行します。つまり、バルクロード用ファイルは既に用意されている前提です。

ii) tDBMSOutputBulk

バルクロード用ファイルを作成します。つまりファイル生成までしかやらないので、DBへは何も書き込みされません。あくまでバルクロード用ファイルの生成までです。

iii) tDBMSOutputBulkExec

上i) ii) を一気に行います。ローカルにバルクロード用ファイルを一旦生成して、その後、DBMSが提供するバルクローダーを起動して、DBへ反映するまでの一連の動作を行います。

 

一般的には、上iii)だけ用意されていれば良いかもしれないです。

 

i) ii) が用意されている理由は、例えばこんなユースケースです。

- ソースデータが準備出来た段階で五月雨式にターゲットDBへのバルクロード用ファイルをバッチウィンドウを待たずに上i)のコンポーネントで生成までしておく。

- 例えば、夜間のバッチウィンドウ開始とともに準備済みのバルクロード用ファイルを上ii)のコンポーネントを使ったジョブでターゲットDBへ実際に反映する。

 

このような運用を考えて、上の3種類のコンポーネントを用意していますので、必要に応じて使い分けして頂ければ。

 

また、Oracleからデータ抽出する際は、これらのコンポーネントではなく「tOracleInput」コンポーネントをお使い下さい。tOracleInputからは、SQLを発行して任意のデータを抽出できます。

 

 

---
Have fun!
Four Stars

Re: bulkアダプタの使用方法を教えてください

ご説明ありがとうございます。


つまり私が今回想定していた内容では

・iii)のパターンで実行する。

・ファイルが生成されるがバルクロード用のファイルのため無視していい。

という認識でよろしいでしょうか。

 

ご説明いただいた内容でジョブを作成してみたところ、i),ii)、iii)のどちらも指定されたファイルがないというエラーになってしまいました。

 

これはバルクロード用のファイルがないという意味で発生しているエラーでしょうか。

 

また、データ抽出はBulkでの取得は不可という認識でよろしいでしょうか。

 

よろしくお願い致します。無題.png無題2.png

Moderator

Re: bulkアダプタの使用方法を教えてください

nakanakさん

 

エラーでは、"sqlldr"が見つからにと言われてます。Studio起動ユーザーで、sqlldr.exeが問題なく動作できるか確認してみて下さい。また、バルクロード用には、データファイルと共に.ctlファイルも必要となります。tOracleBulkExecとtOracleOutputBulkExecは、任意の場所にある既存の.ctlファイル指定可能です。

 

データ抽出については、ご理解のとおりです。

 

 

 

---
Have fun!
Four Stars

Re: bulkアダプタの使用方法を教えてください

そもそも「sqlldrがない」というエラーが出てくる意味もよくわかりません。。。

Studio起動ユーザでsqlldr.exeは問題なく動作します。Bulkコンポーネントを使わず、通常のtOracleOutputコンポーネントを使用した場合のデータの転送、抽出も問題なく行えています。

 

また、「tOracleBulkExecとtOracleOutputBulkExecは、任意の場所にある既存の.ctlファイル指定可能です。」とは下図のような指定の仕方でよろしいでしょうか。

 

たびたび申し訳ございませんが、よろしくお願い致します。

 

キャプチャ.PNG

Moderator

Re: bulkアダプタの使用方法を教えてください

naknakaさん

 

■ SQLローダーをキックするJavaコードは、以下のように組立てられています。

-----

String command_tOracleBulkExec_1 = "sqlldr '"
+ dbUser_tOracleBulkExec_1 + "/"
+ dbPwd_tOracleBulkExec_1 + "@"
+ serviceUrl_tOracleBulkExec_1 + "' CONTROL='"
+ ctlf_tOracleBulkExec_1 + "' LOG='"
+ logf_tOracleBulkExec_1 + "'";

.....

----

ので、"sqlldr"でSQLローダーをキックできれば、問題なく動くのではと思うのですが、、、。

 

■ 既存の.ctlファイルを指定する場合、コンポーネントのプロパティタブで[詳細設定]->[既存の制御ファイルを使用]にチェックし、[.ctlファイル名]を明示的に指定して下さい。

 bulkproperty.jpg

 

 

 

 

 

---
Have fun!
Four Stars

Re: bulkアダプタの使用方法を教えてください

もしかしてtOracleOutputコンポーネントとtOracleOutputBulk,tOracleBulkExec,tOracleOutputBulkExecコンポーネントでは、

根本的な仕様が違うのでしょうか?tOracleOutputコンポーネントもsqlldr.exeを使用していると思っているのは私の誤認でしょうか?

 

また、話が変わってしまい申し訳ないのですが、tOracleOutputBulkExecコンポーネントを使用する際、

.ctlファイルは事前に作成されている必要があるように感じますが、これはどのように対応すればよろしいのでしょうか。

 

よろしくお願いいたします。

Moderator

Re: bulkアダプタの使用方法を教えてください

nakanakaさん

 

i) ご理解のとおりです、必要とされる事前の準備環境が異なります。

tOracleOutput:type4のOracle JDBC Driverが、ジョブを稼働する環境に設定されている必要があります。恐らく、これは問題なく設定されていると思われます。

tOracleBulkExec, tOracleOutputBulkExec:OracleネィティブクライアントとSQL Loaderが、ジョブを稼働する環境に設定されている必要があります。こちらの入手・導入についてはOracle社のガイドを参考にして下さい。

 

ii) .ctlファイルについて

事前準備済みの.ctlファイルを明示的に指定する方法と動的にコンポーネントで生成する必要がありますので、利便性の良い方をご選択して下さい。.ctlファイルの事前作成は、Oracle社のガイドをご参考に頂ければ。

 

 

 

 

---
Have fun!