Hadoop外部データラッパーの設定¶
拡張機能と拡張機能を使用するデータベースオブジェクトを作成する前に、サポートライブラリの場所を指定して、Postgresホストを変更する必要があります。
Postgresのインストール後、次の場所にある
postgresql.confを変更します。/var/lib/edb/as_version/data選択したエディターで構成ファイルを変更し、構成ファイルの最後に
hdfs_fdw.jvmpathパラメーターを追加し、値を設定してJava仮想マシンの場所(libjvm.so)を指定します。アダプターが使用するJavaクラスファイルの場所を示すために、hdfs_fdw.classpathの値を設定します。各パス間の区切り文字としてコロン(:)を使用します。例:
hdfs_fdw.classpath= '/usr/edb/as12/lib/HiveJdbcClient-1.0.jar: /home/edb/Projects/hadoop_fdw/hadoop/share/hadoop/common/hadoop-common-2.6.4.jar: /home/edb/Projects/hadoop_fdw/apache-hive-1.0.1-bin/lib/hive-jdbc-1.0.1-standalone.jar'注釈
EDBAdvancedServerを使用していて、データベースに
DATE列がある場合、postgresql.confファイルにedb_redwood_date = OFFを設定する必要があります。
パラメータ値を設定した後、Postgresサーバーを再起動します。AdvancedServerホストでのサービスの制御の詳細については、次の場所にある『EDBPostgresAdvancedServerインストールガイド』を参照してください。
HadoopForeignDataWrapperを使用する前に、以下を行う必要があります。
:ref:`CREATEEXTENSION<create_extension>`コマンドを使用して、Postgresホストで拡張機能を作成します。
:ref:`CREATESERVER<create_server>`コマンドを使用して、Hadoopファイルシステムへの接続を定義します。
:ref:`CREATEUSERMAPPING<create_user_mapping>`コマンドを使用して、Postgresロールをサーバーに関連付けるマッピングを定義します。
:ref:`CREATEFOREIGNTABLE<create_foreign_table>`コマンドを使用して、Hadoopクラスターに存在するデータベースに対応するAdvancedServerデータベースのテーブルを定義します。
エクステンションを作成¶
CREATE EXTENSION コマンドを使用して hdfs_fdw 拡張機能を作成します。コマンドを呼び出すには、選択したクライアント(psqlなど)を使用して、HiveサーバーまたはSparkサーバーのクエリを実行するPostgresデータベースに接続し、コマンドを呼び出します。
CREATE EXTENSION [IF NOT EXISTS] hdfs_fdw [WITH] [SCHEMA schema_name];
パラメータ
IF NOT EXISTS
同じ名前の拡張子が既に存在する場合、エラーをスローする代わりに通知を発行するようにサーバーに指示する
IF NOT EXISTS句を含めます。
schema_name
オプションで、拡張機能のオブジェクトをインストールするスキーマの名前を指定します。
例
次のコマンドは hdfs_fdw hadoop外部データラッパーをインストールします。
CREATE EXTENSION hdfs_fdw;
外部データラッパー CREATE EXTENSION コマンドの使用の詳細については、以下を参照してください。
サーバーの作成¶
CREATE SERVER コマンドを使用して、外部サーバーへの接続を定義します。構文は次のとおりです。
CREATE SERVER server_name FOREIGN DATA WRAPPER hdfs_fdw
[OPTIONS (option 'value' [, ...])]
サーバーを定義する役割は、サーバーの所有者です。 ALTER SERVER コマンドを使用して、外部サーバーの所有権を再割り当てします。外部サーバーを作成するには、 CREATE SERVER コマンドで指定された外部データラッパーに対する USAGE 権限が必要です。
パラメータ
server_name
server_nameを使用して、外部サーバーの名前を指定します。サーバー名はデータベース内で一意である必要があります。
FOREIGN_DATA_WRAPPER
クラスターに接続するときにサーバーが
hdfs_fdw外部データラッパーを使用するように指定するには、FOREIGN_DATA_WRAPPER句を含めます。
OPTIONS
CREATE SERVERコマンドのOPTIONS節を使用して、外部サーバーの接続情報を指定します。以下を含めることができます。
オプション |
説明 |
|---|---|
host |
Hadoopクラスターのアドレスまたはホスト名。デフォルト値は``localhost``です。 |
port |
HiveThriftServerまたはSparkThriftServerのポート番号。デフォルトは`10000`です。 |
client_type |
クライアントタイプとしてhiveserver2またはsparkを指定します。SparkでANALYZEステートメントを使用するには、sparkの値を指定する必要があります。client_typeの値を指定しない場合、デフォルト値はhiveserver2です。 |
auth_type |
クライアントの認証タイプ。LDAPまたはNOSASLを指定します。auth_typeを指定しない場合、データラッパーはユーザーマッピングに基づいてauth_type値を決定します。
|
connect_timeout |
接続試行がタイムアウトするまでの時間。デフォルト値は``300``秒です。 |
fetch_size |
JDBCAPIsetFetchSizeのパラメーターとして提供されるユーザー指定の値。デフォルト値は``10,000``です。 |
log_remote_sql |
trueの場合、ログにはリモートHiveサーバーで実行されたSQLコマンドとスキャンが繰り返される回数が含まれます。デフォルトは``false``です。 |
query_timeout |
query_timeoutを使用して、リクエストがHiveサーバーによって満たされない場合にリクエストがタイムアウトするまでの秒数を指定します。クエリタイムアウトは、HiveJDBCドライバーではサポートされていません。 |
use_remote_estimate |
use_remote_estimateを含めて、処理コストを見積もるときにリモートサーバーでEXPLAINコマンドを使用するようにサーバーに指示します。デフォルトでは、use_remote_estimateはfalseであり、リモートテーブルには``1000``行があると想定されます。 |
例
次のコマンドは、 hdfs_fdw の外部データラッパーを使用して 170.11.2.148 のIPアドレスを持つホストに接続する、 hdfs_server という名前の外部サーバーを作成します。
CREATE SERVER hdfs_server FOREIGN DATA WRAPPER hdfs_fdw OPTIONS (host '170.11.2.148', port '10000', client_type 'hiveserver2', auth_type 'LDAP', connect_timeout '10000', query_timeout '10000');
外部サーバーは、Hadoopクラスター上のクライアントへの接続にデフォルトポート( 10000 )を使用します。接続はLDAPサーバーを使用します。
CREATE SERVER コマンドの使用の詳細については、以下を参照してください。
ユーザーマッピングの作成¶
CREATE USER MAPPING コマンドを使用して、Postgresロールを外部サーバーに関連付けるマッピングを定義します。
CREATE USER MAPPING FOR role_name SERVER server_name
[OPTIONS (option 'value' [, ...])];
そのサーバーのユーザーマッピングを作成するには、外部サーバーの所有者である必要があります。
注意:HadoopForeignDataWrapperはNOSASLおよびLDAP認証をサポートしています。LDAP認証を使用するサーバーのユーザーマッピングを作成する場合は、 OPTIONS 句を使用して、既存のLDAPユーザーの接続資格情報(ユーザー名とパスワード)を提供します。サーバーがNOSASL認証を使用する場合、ユーザーマッピングの作成時にOPTIONS句を省略します。
パラメータ
role_name
role_nameを使用して、外部サーバーに関連付けられるロールを指定します。
server_name
Hadoopクラスターへの接続を定義するサーバーの名前を指定するには、
server_nameを使用します。
OPTIONS
OPTIONS句を使用して、外部サーバーの接続情報を指定します。LDAP認証を使用している場合、以下を提供します。
username:LDAPサーバー上のユーザーの名前。
password:ユーザー名に関連付けられたパスワード。ユーザー名とパスワードを指定しない場合、データラッパーはNOSASL認証を使用します。
例
次のコマンドは、 enterprisedb という名前のロールのユーザーマッピングを作成します。マッピングは hdfs_server という名前のサーバーに関連付けられます:
CREATE USER MAPPING FOR enterprisedb SERVER hdfs_server;
データベースホストがLDAP認証を使用する場合、ユーザーマッピングの作成時に接続資格情報を提供します。
CREATE USER MAPPING FOR enterprisedb SERVER hdfs_server OPTIONS (username 'alice', password '1safepwd');
このコマンドは、 hdfs_server という名前のサーバーに関連付けられている enterprisedb という名前のロールのユーザーマッピングを作成します。LDAPサーバーに接続すると、HiveまたはSparkサーバーは alice として認証し、 1safepwd のパスワードを提供します。
CREATE USER MAPPING コマンドの詳細については、以下を参照してください。
外部テーブルの作成¶
外部テーブルは、Hadoopホストにあるテーブルへのポインターです。Postgresサーバーで外部テーブル定義を作成する前に、HiveまたはSparkサーバーに接続してテーブルを作成します。テーブルの列は、Postgresサーバーのテーブルの列にマップされます。次に、 CREATE FOREIGN TABLE コマンドを使用して、Hadoopホストに存在するテーブルに対応する列を持つPostgresサーバー上のテーブルを定義します。構文は次のとおりです。
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [
{ column_name data_type [ OPTIONS ( option 'value' [, ... ] ) ] [ COLLATE collation ] [ column_constraint [ ... ] ]
| table_constraint }
[, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
SERVER server_name [ OPTIONS ( option 'value' [, ... ] ) ]
ここで、 column_constraint は次のとおりです。
[ CONSTRAINT constraint_name ]
{ NOT NULL | NULL | CHECK (expr) [ NO INHERIT ] | DEFAULT default_expr }
そして table_constraint は:
[ CONSTRAINT constraint_name ] CHECK (expr) [ NO INHERIT ]
パラメータ
table_name
外部テーブルの名前を指定します。スキーマ名を含めて、外部テーブルが存在するスキーマを指定します。
IF NOT EXISTS
同じ名前のテーブルが既に存在する場合にエラーをスローしないようにサーバーに指示するには、
IF NOT EXISTS句を含めます。同じ名前のテーブルが存在する場合、サーバーは通知を発行します。
column_name
新しいテーブルの列の名前を指定します。各列は、HiveまたはSparkサーバーで説明されている列に対応する必要があります。
data_type
列のデータ型を指定します。可能であれば、PostgresサーバーとHiveまたはSparkサーバーの各列に同じデータ型を指定します。同じ名前のデータ型が利用できない場合、Postgresサーバーはデータ型をHiveまたはSparkサーバーと互換性のある型にキャストしようとします。サーバーが互換性のあるデータ型を識別できない場合、エラーを返します。
COLLATE collation
列に照合順序を割り当てるには、
COLLATE句を含めます。指定しない場合、列のデータ型のデフォルトの照合が使用されます。
INHERITS (parent_table [, ... ])
INHERITS句を含めて、新しい外部テーブルがすべての列を自動的に継承するテーブルのリストを指定します。親テーブルは、プレーンテーブルでも外部テーブルでもかまいません。
CONSTRAINT constraint_name
列制約または表制約のオプション名を指定します。指定しない場合、サーバーは制約名を生成します。
NOT NULL
カラムにヌル値を含めることが許可されていないことを示すために、
NOT NULLキーワードを含めます。
NULL
列にヌル値を含めることが許可されていることを示すために、
NULLキーワードを含めます。これがデフォルトです。
CHECK (expr) [NO INHERIT]
CHECK句を使用して、テーブルの各行が満たす必要のあるブール結果を生成する式を指定します。列制約として指定されたチェック制約はその列の値のみを参照する必要がありますが、表制約に表示される式は複数の列を参照できます。
CHECK式には、サブクエリを含めることも、現在の行の列以外の変数を参照することもできません。制約が子テーブルに伝播しないように指定するには、
NO INHERITキーワードを含めます。
DEFAULT default_expr
DEFAULT句を含めて、列定義が表示される列のデフォルトのデータ値を指定します。デフォルト式のデータ型は、列のデータ型と一致する必要があります。
SERVER server_name [OPTIONS (option 'value' [, ... ] ) ]
Hadoopファイルシステムにあるテーブルを照会できる外部テーブルを作成するには、
SERVER句を含め、Hadoopデータアダプターを使用する外部サーバーのserver_nameを指定します。
OPTIONS句を使用して、次のoptionsとそれに対応する値を指定します。
オプション |
説明 |
|---|---|
dbname |
Hiveサーバー上のデータベースの名前。データベース名が必要です。 |
table_name |
Hiveサーバー上のテーブルの名前。デフォルトは外部テーブルの名前です。 |
例
分散ファイルシステムに格納されているデータを使用するには、Hadoopテーブルの列をPostgresテーブルの列にマップするテーブルをPostgresホストに作成する必要があります。たとえば、次の定義を持つHadoopテーブルの場合:
CREATE TABLE weblogs (
client_ip STRING,
full_request_date STRING,
day STRING,
month STRING,
month_num INT,
year STRING,
hour STRING,
minute STRING,
second STRING,
timezone STRING,
http_verb STRING,
uri STRING,
http_status_code STRING,
bytes_returned STRING,
referrer STRING,
user_agent STRING)
row format delimited
fields terminated by '\t';
Postgresサーバーで同等のテーブルを作成するコマンドをPostgresサーバーで実行する必要があります。
CREATE FOREIGN TABLE weblogs
(
client_ip TEXT,
full_request_date TEXT,
day TEXT,
Month TEXT,
month_num INTEGER,
year TEXT,
hour TEXT,
minute TEXT,
second TEXT,
timezone TEXT,
http_verb TEXT,
uri TEXT,
http_status_code TEXT,
bytes_returned TEXT,
referrer TEXT,
user_agent TEXT
)
SERVER hdfs_server
OPTIONS (dbname 'webdata', table_name 'weblogs');
Hadoopファイルシステムに格納されているデータベースの名前( webdata )およびPostgresサーバーのテーブルに対応するテーブルの名前( weblogs )を指定するには、 SERVER 句を含めます。
CREATE FOREIGN TABLE コマンドの使用の詳細については、以下を参照してください。
データ型マッピング¶
外部データラッパーを使用する場合、HiveサーバーにあるテーブルをミラーリングするテーブルをPostgresサーバーに作成する必要があります。Hadoopデータラッパーは、次のHiveデータ型をターゲットPostgres型に自動的に変換します。
Hive |
Postgres |
|---|---|
BIGINT |
BIGINT/INT8 |
BOOLEAN |
BOOL/BOOLEAN |
BINARY |
BYTEA |
CHAR |
CHAR |
DATE |
DATE |
DOUBLE |
FLOAT8 |
FLOAT |
FLOAT/FLOAT4 |
INT/INTEGER |
INT/INTEGER/INT4 |
SMALLINT |
SMALLINT/INT2 |
STRING |
TEXT |
TIMESTAMP |
TIMESTAMP |
TINYINT |
INT2 |
VARCHAR |
VARCHAR |