はじめに
Verticaでは、CSVファイルを外部テーブルとして利用する事ができます。当記事では、複数台ノードで構成されたVerticaクラスタ構成で外部テーブル用に使用するCSVファイルを配置する場所についての注意点を紹介します。
外部テーブルの概要
Verticaで外部テーブルとは何か?については、以下の記事をご参照ください。CSVファイルを外部テーブルとして利用する方法
外部テーブルの概要を簡単におさらいします。
特定のCSVファイルをデータベース内の通常のテーブルと同様にひとつのテーブルとして参照できるようにするのが外部テーブルです。
SQLで外部テーブルをSELECT処理をすると、CSVファイルを参照します。
Verticaクラスタがシングルノード構成の場合は、配置場所についての考慮は必要ありません。
しかし、複数台ノードで構成された場合には注意が必要です。
注意点
外部テーブル用のCSVファイルは全ノードから参照できる必要があります。例えば、CSVファイルをある特定のノードのローカルディスクに配置してしまうと、そのノードがエグゼキュータとして動作する場合は問題なく処理をする事ができます。しかし、CSVファイルを持たないノードがエグゼキュータになった場合や、CSVファイルを持っているノードが障害などで停止した場合、CSVファイルはどのノードからも参照できなくなってしまいます。
そのため、CSVファイルを配置する場所は、全ノードから参照できるNFSサーバなどの共有可能な領域上に配置する事が推奨されています。
NFSサーバがすぐに用意できない場合は、各ノードのローカルディスクの同一パス上に同じファイル名のCSVファイルのコピーを配置する事で対処する事も可能です。
しかし、その場合はCSVファイルの内容を更新した際には、全ノードにコピーする事を忘れないようにしてください。
CSVファイルの内容がノードによって異なる場合、SQL結果も異なってしまいます。
(例)各ノードにあるCSVファイルの内容が異なった状態で外部テーブルを参照すると、以下のようにSQLの実行結果が異なってしまいます。
以下の例では、ロードバランス機能のラウンドロビンによって、エグゼキュータがノード1→ノード2→ノード3の順番に分散され、それによって各ノード上のCSVの内容が異なっている様子を示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ vsql -w password -C -c 'select * from ext1;' col1 | col2 ------+-------------------------------------- 1 | これはノード1にあるCSVファイルです。 2 | bbb 3 | ccc (3 rows) $ vsql -w password -C -c 'select * from ext1;' col1 | col2 ------+-------------------------------------- 1 | aaa 2 | これはノード2にあるCSVファイルです。 3 | ccc (3 rows) $ vsql -w password -C c 'select * from ext1;' col1 | col2 ------+-------------------------------------- 1 | aaa 2 | bbb 3 | これはノード3にあるCSVファイルです。 (3 rows) |
以上です。