6.1.6 横分割表にデータをロードする場合(パラレルローディング機能)
パラレルローディング機能とは,一つの入力データファイルから横分割表を構成する複数のRDエリアに対してデータロードを並列実行する機能です。pdparaloadコマンドを実行することで,複数のRDエリアに対するデータロードを一度に実行できます。
パラレルローディング機能の概要を次の図に示します。
|
- 〔説明〕
-
ユーザがpdparaloadコマンドを実行すると,横分割表を構成するRDエリアの数だけpdloadコマンドが自動的に実行されます。このとき,pdparaloadコマンドがpdloadコマンドの制御文ファイルを生成します。
各pdloadコマンドが入力データファイルを参照し,該当するデータを抽出してRDエリア内の横分割表に格納します。
- 〈この項の構成〉
(1) 効果
パラレルローディング機能を使うことで得られる効果は,次の二つです。
-
データロードに掛かる処理時間を短縮できます。
pdparaloadを実行すると複数のpdloadコマンドが並列で実行されます。そのため,一つのpdloadコマンドで実行する表単位データロードと比べ,データロードに掛かる処理時間が短くなります。
-
一つの入力データファイルと1回のコマンド入力で済むため,運用が容易です。
分割入力データファイルを使用したRDエリア単位のデータロードの場合でもpdloadコマンドの並列実行はできますが,その際,入力データファイルを分割したり,pdloadコマンドを複数回入力したりと,運用が煩雑です。パラレルローディング機能を使う場合,入力データファイルをRDエリア単位に分割する必要はありません。また,コマンドの入力も1回で済みます。
このように,パラレルローディング機能は,RDエリア単位データロードの高速処理性能と,表単位データロードの運用容易性という両方の長所を併せ持った機能です。
(2) コマンド実行前に準備しておくこと
パラレルローディングを実行する前に,次の準備をしてください。
(a) リソース使用量の見積もり
パラレルローディングでは,複数のpdloadコマンドを並列実行します。例えば,表を三つのRDエリアに分割して格納する場合,三つのpdloadコマンドが同時に実行されるため,リソースも三つ分必要になります。これを考慮して必要なリソース使用量を見積もってください。
(b) 入力データの準備
表に入力するデータを入力データファイルとして準備します。pdparaloadコマンドの入力データファイルは一つです。
(3) 運用手順
パラレルローディングの運用手順を次の図に示します。
|
- 注※1
-
この手順は,データベースの更新ログ取得方式(-lオプション)の指定によって,必要かどうかが異なります。
- 注※2
-
この手順は,インデクスの作成方法(-iオプション)にn(インデクス情報出力モード),又はx(インデクス情報出力抑止モード)を指定した場合に必要です。また,c(インデクス一括作成モード)を指定している場合でも,非分割キーインデクスを定義しているときには必要になります。
(4) 制限事項
パラレルローディング機能を使用してデータロードをする場合の制限事項を次に示します。
-
フレキシブルハッシュ分割を定義している表はデータロードできません。
-
同期点指定のデータロードはできません。
-
パラレルローディングを実行中の表に対して,NOWAIT検索はできません。
-
LOB列構成基表とLOBデータを別々にロードすることはできません。
-
テープ装置を媒体とする入力データファイルは使用できません。
pdparaloadコマンドのオプションや制御文には,pdloadコマンドのオプションや制御文と同様の指定ができますが,一部指定できないものもあります。指定可否の詳細については,マニュアル「HiRDB Version 9 コマンドリファレンス」の「pdparaload」を参照してください。
(5) 性能に影響を及ぼす条件
パラレルローディング機能の性能は,入力データのデータ配置など,データロードの実行環境に左右されます。そのため,実行環境によっては,パラレルローディング機能を使用してもデータロードに掛かる時間が短縮されないことがあります。したがって,実際に運用を開始する前に,一度パラレルローディング機能を使用して,データロードに掛かる時間を計測してください。その結果,パラレルローディング機能を使用することでデータロードに掛かる時間が短縮された場合に,パラレルローディング機能を使用してください。期待する処理性能が得られなかった場合は,表単位のデータロード,又は入力データファイルを分割してRDエリア単位のデータロードを行ってください。分割入力データファイルの作成については,「横分割表にデータをロードする場合(分割入力データファイルの作成)」を参照してください。
パラレルローディング機能の性能に影響を及ぼす条件について以降で説明します。
(a) サーバ間横分割
パラレルローディング機能は,サーバ間横分割をしている場合に効果が得られます。サーバ内横分割をしている表にもパラレルローディングは実行できます。しかし,サーバが分かれている方が,データを格納するときに一つのpdloadコマンドの処理がサーバを占有できるため,その分早くデータロードできます。
(b) 入力データのデータ配置
パラレルローディングを実行すると,複数のpdloadコマンドが一つの入力データファイルからデータを読み込みます。このとき,読み込み処理が効率良くできるようなデータ配置にしておくと,処理時間が短くなります。次の図に示すように,入力データが分割キーに対して均等に配置されていると,効率良く読み込み処理ができます。
|
なお,サーバ内横分割をしている表のデータをpdrorgコマンドで一つのファイルにアンロードした場合,アンロードデータファイルは図の「偏ったデータ配置の例」のようになります。そのため,これを入力データファイルとしてパラレルローディングを実行する場合も性能が低下するおそれがあります。
(c) 入力データのデータ形式
パラレルローディング機能では,pdloadコマンドでデータロードできるすべてのデータ形式でデータロードできます。ただし,大量のデータを扱う場合には,入力データのデータ形式をバイナリ形式にすることをお勧めします。DAT形式や固定長データ形式の場合,データベースにデータを格納する際にデータ形式の変換処理が必要になります。これによって,CPU使用率が上がり,データロードの並列処理の性能が低下するおそれがあるためです。
(d) LOB作成種別
処理対象の表にLOB列やLOBパラメタを持つ抽象データ型の列を定義している場合は,データロードのLOB作成種別(-kオプション)にfを指定することをお勧めします。fを指定したデータロードの場合,LOB入力ファイルとしてLOBデータごとにファイルを用意します。そのため,データロードを並列実行する際にLOBデータを重複して読み込むことがなく,入出力を削減できます。
LOB作成種別にdを指定する場合,入力データファイル中にすべてのLOBデータを格納します。そうすると,各RDエリア単位のデータロードで,処理対象外のLOBデータを読み飛ばすという処理が発生するため,性能低下の原因になります。
(6) 運用例
ここでは,パラレルローディングの運用例について説明します。
-
運用例1はLOB列の定義がある場合について説明します。
-
運用例2は非分割キーインデクスの定義がある場合について説明します。
運用例のデータロードの条件を次の表に示します。
運用例 |
表定義 |
インデクス定義 |
入力データの形式 |
インデクス作成方法 |
ログ取得方式 |
||
---|---|---|---|---|---|---|---|
横分割 |
LOB列 |
分割キーインデクス |
非分割キーインデクス |
||||
○ |
○ |
○ |
× |
バイナリ形式 |
インデクス一括作成モード |
更新前ログ取得モード |
|
○ |
× |
○ |
○ |
バイナリ形式 |
インデクス一括作成モード |
更新前ログ取得モード |
- (凡例)
-
○:定義します。
×:定義しません。
(a) 運用例1(LOB列の定義がある場合)
LOB列を定義した表2にパラレルローディング機能を使用してデータロードします。LOB作成種別(-kオプション)にfを指定して,LOBデータごとにファイルを作成します。
- ●表定義とインデクス定義
-
- 表定義
create table "表2"( col001 int not null, col002 varchar(20), col003 blob(1M) in ((LOB01),(LOB02),(LOB03)), col004 decimal(10,3) ) fix hash hashf by col001 in (RDUSER11,RDUSER21,RDUSER31);
- インデクス定義
create index "インデクス2" on "表2"(col001,col002) in ((RDUSER12),(RDUSER22),(RDUSER32));
- ●データロードの手順
-
-
pdholdコマンドでデータロード対象のRDエリアを閉塞します。
pdhold -r LOB01,LOB02,LOB03,RDUSER11,RDUSER21,RDUSER31,RDUSER12,RDUSER22,RDUSER32
-
pdparaloadコマンドの制御文ファイルを作成します。
source:サーバ名,入力データファイル,エラー情報ファイルを指定します。HiRDB/パラレルサーバの場合は,サーバ名を必ず指定してください。
lobdata:LOB入力ファイルを指定します。
idxwork:インデクス情報ファイルの格納ディレクトリを指定します。
sort:ソート用ワークファイルの格納ディレクトリを指定します。
report:処理結果ファイル名を指定します。
source fes01:c:\users\data\input_file error=c:\users\rep\error_file lobdata c:\users\data\lob idxwork bes01 c:\users\work idxwork bes02 c:\users\work idxwork bes03 c:\users\work sort bes01 c:\users\work sort bes02 c:\users\work sort bes03 c:\users\work report file=c:\users\rep\result_file
-
pdparaloadコマンドでデータロードを行います。
-d:作成モードでデータロードします。
-b:バイナリ形式の入力データファイルを使用します。
-k:LOB作成種別を指定します。LOBデータごとにファイルを作成します(f)。
-i:インデクス一括作成モード(c)を指定します。
-l:更新前ログ取得モード(p)を指定します。
pdparaload -d -b -k f -i c -l p "表2" c:\users\cntl\control_file
-
pdcopyコマンドでRDエリアのバックアップを取得します。
pdcopy -m c:\users\rdarea\mast\mast01 -M r -p c:\users\pdcopy\list\list01 -b c:\users\pdcopy\backup\backup01 -r LOB01,LOB02,LOB03,RDUSER11,RDUSER21,RDUSER31,RDUSER12,RDUSER22,RDUSER32
-
pdrelsコマンドでRDエリアの閉塞を解除します。
pdrels -r LOB01,LOB02,LOB03,RDUSER11,RDUSER21,RDUSER31,RDUSER12,RDUSER22,RDUSER32
-
(b) 運用例2(非分割キーインデクスの定義がある場合)
非分割キーインデクスを定義した表3にパラレルローディング機能を使用してデータロードします。非分割キーインデクスを定義しているため,pdparaloadコマンド実行後に,pdrorgコマンドでインデクスの一括作成をする必要があります。インデクスの一括作成時には,pdparaloadコマンドで出力されたインデクス情報ファイルを指定します。
- ●表定義とインデクス定義
-
- 表定義
create table "表3"( col001 int not null, col002 varchar(20), col003 char(32), col004 decimal(10,3) ) partitioned by col001 in ((RDUSER11) 10000000, (RDUSER21) 20000000, (RDUSER31));
- インデクス定義(分割キーインデクス)
create index "インデクス3" on "表3"(col001,col002) in ((RDUSER12),(RDUSER22),(RDUSER32));
- インデクス定義(非分割キーインデクス)
create index "インデクス4" on "表3"(col003) in ((RDUSER13));
- ●データロードの手順
-
-
pdholdコマンドでデータロード対象のRDエリアを閉塞します。
pdhold -r RDUSER11,RDUSER21,RDUSER31,RDUSER12,RDUSER22,RDUSER32,RDUSER13
-
pdparaloadコマンドの制御文ファイルを作成します。
source:入力データファイル,エラー情報ファイルを指定します。HiRDB/パラレルサーバの場合は,サーバ名を必ず指定してください。
idxwork:インデクス情報ファイルの格納ディレクトリを指定します。データロード後は,ここに作成されたインデクス情報ファイルを使ってインデクスの一括作成をします。
sort:ソート用ワークファイルの格納ディレクトリを指定します。
report:処理結果ファイル名を指定します。
source c:\users\data\input_file error=c:\users\rep\error_file idxwork c:\users\work sort c:\users\work report file=c:\users\rep\result_file
-
pdparaloadコマンドでデータロードを行います。
-d:作成モードでデータロードします。
-b:バイナリ形式の入力データファイルを使用します。
-i:インデクス一括作成モード(c)を指定します。
-l:更新前ログ取得モード(p)を指定します。
pdparaload -d -b -i c -l p "表3" c:\users\cntl\control_file
-
pdrorgコマンドの制御文ファイルを作成します。
index文に,pdparaloadコマンドで出力されたインデクス情報ファイルを指定します。
index "インデクス4" RDUSER13 "c:\users\work\INDEX-インデクス4-RDUSER13-faaG4MnMf" index "インデクス4" RDUSER13 "c:\users\work\INDEX-インデクス4-RDUSER13-caa34EnEc" index "インデクス4" RDUSER13 "c:\users\work\INDEX-インデクス4-RDUSER13-caa06MnMc" sort c:\users\work report file=c:\users\rep\result_file2
-
pdrorgコマンドでインデクスの一括作成をします。
pdrorg -k ixmk -l p -t "表3" c:\users\cntl\control_rorg
-
pdcopyコマンドでRDエリアのバックアップを取得します。
pdcopy -m c:\users\rdarea\mast\mast01 -M r -p c:\users\pdcopy\list\list01 -b c:\users\pdcopy\backup\backup01 -r RDUSER11,RDUSER21,RDUSER31,RDUSER12,RDUSER22,RDUSER32,RDUSER13
-
pdrelsコマンドでRDエリアの閉塞を解除します。
pdrels -r RDUSER11,RDUSER21,RDUSER31,RDUSER12,RDUSER22,RDUSER32,RDUSER13
-
(7) コマンドエラーが発生した場合の運用
pdparaloadコマンドの実行時に発生するエラーと対処には,大きく分けて次の二つがあります。
-
RDエリア単位データロード(pdloadコマンド)実行中のエラー
この場合,一部のRDエリアへのデータロードに失敗しています。エラーになったそれぞれのRDエリアについてエラーの対処をした後,pdloadコマンドでRDエリア単位のデータロードを再実行します。
-
RDエリア単位データロード(pdloadコマンド)開始前のエラー
この場合,すべてのRDエリアへのデータロードに失敗しています。エラーに対処した後,pdparaloadコマンドを再実行します。
pdparaloadコマンドの実行時に発生するエラーと対処の詳細について説明します。まず最初に,pdparaloadコマンドの実行でエラーが発生した場合の対処の流れを次に示します。
|
- 注
-
図中の(a)から(e)は,以降の(a)から(e)と対応しています。
(a) エラー発生のタイミングを特定します
エラー発生のタイミングを特定します。次の両方のメッセージが出力されているかどうかを確認してください。
-
KFPL00791-Iメッセージ
-
KFPL00792-Iメッセージ
- ≪両方のメッセージが出力されている場合≫
-
RDエリア単位データロードの実行中にエラーが発生しています。これによって,一部のRDエリアへのデータロードに失敗しています。この場合は,(b)以降の手順に従ってエラーに対処してください。その後,pdloadコマンドでRDエリア単位のデータロードを再実行してください。
- ≪どちらかのメッセージが出力されていない場合≫
-
RDエリア単位データロードの開始前にエラーが発生しています。つまり,すべてのRDエリアへのデータロードに失敗しています。この場合は,KFPL00794-Iメッセージの直前に出力されたエラーメッセージに従って対処してください。その後,pdparaloadコマンドを再実行してください。
(b) 対処が必要なRDエリアを特定します
pdparaloadコマンドを実行したコマンドプロンプト又はイベントログに出力されたメッセージからKFPL00793-Iメッセージを抽出し,対処が必要なRDエリアを特定します。メッセージを抽出する際には,次の項目を検索キーにしてください。
-
メッセージID(KFPL00793-I)
-
認可識別子
-
表識別子
- メッセージ抽出例
KFPL00793-I Pdload execution abnormal terminated, table=user1."T1", RDAREA=RDAREA1, return code=8, pdload process id=1385412 (1212478) : KFPL00793-I Pdload execution abnormal terminated, table=user1."T1", RDAREA=RDAREA2, return code=8, pdload process id=1385433 (1212478)
- [説明]
-
認可識別子(user1)と表識別子(T1)を基に,KFPL00793-Iメッセージを抽出します。これによって,データロードに失敗したRDエリア(RDAREA1,RDAREA2)を特定できます。
特定したRDエリアに対して,KFPL00793-Iメッセージのリターンコードによって,次の対処をしてください。
- ≪リターンコードが4の場合≫
-
pdloadコマンドが出力したエラー情報ファイルを参照して,エラーに対処してください。エラー情報ファイルは,pdparaloadコマンドのsource文のerrorオプションで指定しています(ファイル名には自動的にRDエリア名称が付加されます)。指定を省略した場合は,次のディレクトリとファイル名称で作成されます。
-
エラー情報ファイルの格納ディレクトリ
1. pd_tmp_directoryオペランドで指定したディレクトリ
2. 1.の指定がない場合,システム環境変数TMPで指定したディレクトリ
3. 2.の指定がない場合,%PDDIR%\tmpディレクトリ
-
エラー情報ファイルの名称
(c)で特定するプロセスIDとメッセージID(KFPL00793-I)が含まれるファイル名
エラーに対処したら,(e)の手順に従って,RDエリア単位のデータロードを再実行してください。
-
- ≪リターンコードが8の場合≫
-
(c),(d)の手順に従って,エラーの内容を特定し,対処してください。
その後,(e)の手順に従って,RDエリア単位のデータロードを再実行してください。
(c) 実行していたプロセスのIDを特定します
メッセージログファイルから,pdparaloadコマンドが実行したpdload制御プロセスとサーバプロセスのIDを特定します。次の手順でプロセスIDを抽出してください。
-
pdcatコマンドで,pdparaloadコマンドの実行開始(KFPL00791-Iメッセージ)から終了(KFPL00794-Iメッセージ)までの間のメッセージログをファイルに出力します。
-
1.で出力した内容からプロセスの開始を示すKFPL00711-Iメッセージを抽出します。メッセージを抽出する際には,次の項目を検索キーにしてください。
-
メッセージID(KFPL00711-I)
-
認可識別子
-
表識別子
-
(b)で特定したRDエリア名
-
- メッセージ抽出例
1572976 2010/11/04 15:55:48 0mload1 lod KFPL00711-I pdloadm started, table=user1."T1", RDAREA=RDAREA1 1728690 2010/11/04 15:55:48 bes1 lod KFPL00711-I pdbes started, table=user1."T1", RDAREA=RDAREA1
- [説明]
-
認可識別子(user1)と表識別子(T1)とRDエリア名(RDAREA1)を基に,KFPL00711-Iメッセージを抽出します。これによって,エラーが発生したプロセスのID(1572976,1728690)を特定できます。
この場合,それぞれのIDは次のプロセスを示しています。
-
1572976は,プロセス名がpdloadmであるため,pdload制御プロセスです。
-
1728690は,プロセス名がpdbesであるため,バックエンドサーバプロセスです。
-
(d) エラーの内容を特定します
メッセージログファイルから,エラーの内容を特定します。(c)で特定したプロセスIDを検索キーにして,(c)の手順1.で取得したメッセージログファイルから対処が必要なエラーメッセージを抽出してください。
- メッセージ抽出例(pdload制御プロセス)
1572976 2010/11/04 15:55:48 0mload1 lod KFPL00711-I pdloadm started, table=user1."T1", RDAREA=RDAREA1 1572976 2010/11/04 15:55:48 0mload1 lod KFPL00704-I Pdload terminated, return code=8
- メッセージ抽出例(バックエンドサーバプロセス)
1728690 2010/11/04 15:55:48 bes1 lod KFPL00711-I pdbes started, table=user1."T1", RDAREA=RDAREA1 1728690 2010/11/04 15:55:48 bes1 lod KFPL00709-I Error information file was created, file=c:/tmp/ERROR-4cd258f41728690 1728690 2010/11/04 15:55:48 bes1 lod KFPL00709-I Lobmid file was created, file=c:/tmp/LOBMID-T1-4cd258f41728690 1728690 2010/11/04 15:55:48 bes1 lod KFPL00702-I Pdload started, table=user1."T1", generation=0 1728690 2010/11/04 15:55:48 bes1 lod KFPL00710-I Index information file assigned, index=user1."T1NX", RDAREA="USER01", file=c:/tmp/INDEX-T1NX-USER01-GN0-daan_ylid 1728690 2010/11/04 15:55:48 bes1 lod KFPL00723-I 0 rows loaded, table=user1."T1", RDAREA="USER01" 1728690 2010/11/04 15:55:48 bes1 lod KFPLxxxxx-E YYYYYY
- [説明]
-
プロセスID(1572976,1728690)を基に,メッセージを抽出します。この場合,バックエンドサーバプロセスでエラーメッセージ(KFPLxxxxx-E)が出力されていることが分かります。このエラーメッセージに従って,対処します。
エラーに対処したら,(e)の手順に従って,RDエリア単位のデータロードを再実行してください。
(e) RDエリア単位のデータロード(pdloadコマンド)を再実行します
pdloadコマンドでRDエリア単位のデータロードを再実行します。この際,pdparaloadコマンドが生成したpdloadコマンドの制御文を再利用することをお勧めします。pdparaloadコマンドが生成したpdloadコマンドの制御文ファイルの格納ディレクトリとファイル名を次に示します。これを基にpdloadの制御文ファイルを作成してください。
-
pdload制御文の格納ディレクトリ
1. pd_tmp_directoryオペランドで指定したディレクトリ
2. 1.の指定がない場合,システム環境変数TMPで指定したディレクトリ
3. 2.の指定がない場合,%PDDIR%\tmpディレクトリ
-
pdload制御文のファイル名
LOD_CTL_認可識別子_表識別子_RDエリアID
- 注意事項
-
RDエリア単位のデータロードを再実行する際には,pdloadのoption文でdivermsg=offを指定してください。
RDエリア単位にデータロードする場合,入力データ中にRDエリアの格納条件と一致しない行データがあると,エラーデータ情報を出力し,pdloadコマンドはリターンコード4で終了します。divermsg=offを指定すると,このエラーデータ情報の出力が抑止され,pdloadコマンドをリターンコード0で終了できます。
RDエリア単位データロードを再実行する場合の,pdloadコマンドの制御文とコマンドラインの例を次に示します。
- 制御文の例
option divermsg=off source "RDUSER02" fes01:c:\users\data\input_file error=\users\rep\error_file_RDUSER02_101 lobdata c:\users\data\lob idxwork bes02 c:\users\work sort bes02 c:\users\work report file=c:\users\rep\result_file_RDUSER02_101
[説明]
-
option文にdivermsg=offを指定することによって,エラーデータ情報の出力を抑止します。
-
RDエリア単位データロードのため,source文には対象とするRDエリア名称を指定します。
-
- コマンドラインの例
pdload -d -b -k f -i c -l p "表2" "c:\users\tmp\LOD_CTL_USER02_表2_101"