Initial configuration

拡張機能と、拡張機能を使用するデータベースオブジェクトを作成する前に、Postgresホストを変更して、サポートライブラリの場所を提供する必要があります。

Postgresをインストールした後、次の場所にあるpostgresql.conf を変更します。

/var/lib/edb/as_version/data

構成ファイルを変更し、 hdfs_fdw.jvmpath パラメーターを構成ファイルの最後に追加し、値を設定してJava仮想マシン(libjvm.so )の場所を指定します。 hdfs_fdw.classpath の値を設定して、アダプターが使用するJavaクラスファイルの場所を示します。各パス間の区切り文字としてコロン(:)を使用します。例:

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

注釈

jarファイル(hive-jdbc-1.0.1-standalone.jar および`hadoop-common-2.6.4.jar` )を、HiveおよびHadoopのソースまたはWebサイトからHadoop Foreign Data WrapperがインストールされているPostgreSQLインスタンスにコピーします。

EDB Postgres Advanced Serverを使用していて、データベースにDATE 列がある場合は、 postgresql.conf ファイルにedb_redwood_date = OFF を設定する必要があります。

パラメーター値を設定したら、Postgresサーバーを再起動します。 EDB Postgres Advanced Serverホストでのサービスの制御の詳細については、

EDB Postgres Advanced Server documentation を参照してください。

Hadoop Foreign Data Wrapperを使用する前に:

  1. 拡張機能を作成する コマンドを使用して、Postgresホストで拡張機能を作成します。

  1. サーバーを作成する コマンドを使用して、Hadoopファイルシステムへの接続を定義します。

  2. ユーザーマッピングを作成する コマンドを使用して、Postgresロールをサーバーに関連付けるマッピングを定義します。

  3. 外国のテーブルを作成する コマンドを使用して、Hadoopクラスターにあるデータベースに対応するEDB

Postgres Advanced Serverデータベースにテーブルを定義します。

拡張機能を作成する

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 Foreign Data Wrapperをインストールします。

CREATE EXTENSION hdfs_fdw;

外部データラッパー CREATE EXTENSION コマンドの使用の詳細については、[PostgreSQLドキュメント](https://www.postgresql.org/docs/current/static/sql-createextension.html)を参照してください。

サーバーを作成する

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

FOREIGN_DATA_WRAPPER 句を含めて、サーバーがクラスターに接続するときにhdfs_fdw 外部データラッパーを使用するように指定します。

OPTIONS

CREATE SERVER コマンドのOPTIONS 句を使用して、外部サーバーの接続情報を指定します。次を含めることができます。

Option

Description

host

Hadoop クラスターのアドレスまたはホスト名。デフォルト値は`localhost`です。

port

Hive ThriftサーバーまたはSpark Thriftサーバーのポート番号。デフォルトは`10000`です。

client_type

クライアントタイプは`hiveserver2`または`spark`を指定します。 Sparkで`ANALYZE`ステートメントを使用するには、 `spark`の値を指定する必要があります。デフォルト値は`hiveserver2`です。

auth_type<br />

クライアントの認証タイプ。 `LDAP`または`NOSASL`を指定します。 `auth_type`を指定しない場合、データラッパーはユーザーマッピングに基づいて`auth_type`値を決定します。ユーザーマッピングにユーザー名とパスワードが含まれる場合、データラッパーはLDAP認証を使用します。ユーザーマッピングにユーザー名とパスワードが含まれていない場合、データラッパーはNOSASL認証を使用します。

connect_timeout

接続試行がタイムアウトするまでの時間。デフォルト値は300秒です

enable_join_pushdown

テーブルレベルのオプションに似ていますが、サーバーレベルで構成されます。 true`の場合、両方のテーブルのすべての行をフェッチしてローカルで結合を実行する代わりに、同じ外部サーバーから2つの外部テーブル間の結合をプッシュします。このオプションを個々のテーブルに設定することもできます。結合に関係するテーブルのいずれかでオプションが `false に設定されている場合、結合はプッシュダウンされません。オプションのテーブルレベルの値は、サーバーレベルのオプション値よりも優先されます。デフォルトは`true`です。

fetch_size

JDBC API `setFetchSize`へのパラメーターとして提供されます。デフォルト値は`10,000`です。

log_remote_sql

`true`の場合、ログにはリモートHiveサーバーで実行されたSQLコマンドとスキャンが繰り返された回数が含まれます。デフォルトは`false`です。

query_timeout

`query_timeout`を使用して、Hiveサーバーが要求を満たさない場合にタイムアウトするまでの秒数を提供します。クエリのタイムアウトは、Hive JDBCドライバーでサポートされていません。

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 コマンドの使用の詳細については、 PostgreSQL documentation を参照してください。

ユーザーマッピングを作成する

CREATE USER MAPPING コマンドを使用して、Postgresロールを外部サーバーに関連付けるマッピングを定義します。

CREATE USER MAPPING FOR role_name SERVER server_name
       [OPTIONS (option value [, ...])];

そのサーバーのユーザーマッピングを作成するには、そのサーバーの所有者である必要があります。

注釈

Hadoop Foreign Data WrapperはNOSASLおよびLDAP認証をサポートしています。 LDAP認証を使用するサーバーのユーザーマッピングを作成している場合は、 OPTIONS 句を使用して、既存のLDAPユーザーの接続資格情報(ユーザー名とパスワード)を指定します。サーバーがNOSASL認証を使用する場合、ユーザーマッピングを作成するときに`OPTIONS` 句を省略します。

パラメーター

role_name

role_name を使用して、外部サーバーに関連付けるロールを指定します。

server_name

server_name を使用して、Hadoopクラスターへの接続を定義するサーバーの名前を指定します。

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 コマンドの詳細については、 PostgreSQL documentation を参照してください。

外国のテーブルを作成する

外部テーブルは、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

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 句を使用して、次のオプションとそれに対応する値を指定します。

Option

Value

dbname

The name of the database on the Hive server. The database name is required.

table_name

The name of the table on the Hive server. The default is the name of the foreign table.

enable_join_pushdown

Similar to the server-level option but configured at table level. If true, pushes the join between two foreign tables from the same foreign server instead of fetching all the rows for both the tables and performing a join locally. You can also set this option for an individual table. If any of the tables involved in the join has set the option to false, then the join isn't pushed down. The table-level value of the option takes precedence over the server-level option value. Default is true.

例

分散ファイルシステムに保存されているデータを使用するには、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サーバーで同等のテーブルを作成するコマンドを実行します。

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);

SERVER 句を含めて、Hadoopファイルシステム(webdata )の名前とPostgresサーバー上のテーブルに対応するテーブルの名前(weblogs )を指定します。

CREATE FOREIGN TABLE コマンドの使用の詳細については、 PostgreSQL documentation を参照してください。

データ型のマッピング

外部データラッパーを使用する場合、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

ドロップエクステンション

DROP EXTENSION コマンドを使用して、拡張機能を削除します。コマンドを呼び出すには、選択したクライアント(たとえば、 psql)を使用して、Hadoopサーバーを削除するPostgresデータベースに接続し、コマンドを実行します。

DROP EXTENSION [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ];

パラメーター

IF EXISTS

IF EXISTS 句を含めて、指定された名前の拡張機能が存在しない場合にエラーを返す代わりに通知を発行するようにサーバーに指示します。

name

必要に応じて、インストールされている拡張機能の名前を指定します。

CASCADE

拡張機能に依存するオブジェクトを自動的にドロップします。他のすべての依存オブジェクトも削除します。

RESTRICT

同じ DROP コマンドにリストされているメンバーオブジェクトと拡張機能以外のオブジェクトが依存している場合、拡張機能を削除しないでください。

例

次のコマンドは、既存のデータベースから拡張機能を削除します。

DROP EXTENSION hdfs_fdw;

外部データラッパー DROP EXTENSION コマンドの使用の詳細については、

PostgreSQL documentation を参照してください。

ドロップサーバー

DROP SERVER コマンドを使用して、外部サーバーへの接続を削除します。構文は次のとおりです。

DROP SERVER [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

サーバーを削除するロールはサーバーの所有者です。 ALTER SERVER コマンドを使用して、外部サーバーの所有権を再割り当てします。外部サーバーを削除するには、 DROP SERVER コマンドで指定された外部データラッパーに対するUSAGE 権限が必要です。

パラメーター

IF EXISTS

IF EXISTS 句を含めて、指定された名前のサーバーが存在しない場合にエラーを返す代わりに通知を発行するようにサーバーに指示します。

name

オプションで、インストールされたサーバーの名前を指定します。

CASCADE

サーバーに依存するオブジェクトを自動的に削除します。他のすべての依存オブジェクトも削除します。

RESTRICT

サーバーに依存しているオブジェクトがある場合は、サーバーを削除しないでください。

例

次のコマンドは、hdfs_server という名前の外部サーバーを削除します。

DROP SERVER hdfs_server;

DROP SERVER コマンドの使用の詳細については、 PostgreSQL documentation を参照してください。

DROPユーザーマッピング

DROP USER MAPPING コマンドを使用して、Postgresロールを外部サーバーに関連付けるマッピングを削除します。そのサーバーのユーザーマッピングを削除するには、そのサーバーの所有者である必要があります。

DROP USER MAPPING [ IF EXISTS ] FOR { user_name | USER | CURRENT_USER | PUBLIC } SERVER server_name;

パラメーター

IF EXISTS

ユーザーマッピングが存在しない場合にエラーを返す代わりに通知を発行するようにサーバーに指示するには、 IF EXISTS 句を含めます。

user_name

マッピングのユーザー名を指定します。

server_name

Hadoopクラスターへの接続を定義するサーバーの名前を指定します。

例

次のコマンドは、enterprisedb という名前のロールのユーザーマッピングを削除します。マッピングはhdfs_server という名前のサーバーに関連付けられています。

DROP USER MAPPING FOR enterprisedb SERVER hdfs_server;

DROP USER MAPPING コマンドの詳細については、 PostgreSQL documentation を参照してください。

外国のテーブルをドロップ

外部テーブルは、Hadoopホストにあるテーブルへのポインターです。 DROP FOREIGN TABLE コマンドを使用して、外部テーブルを削除します。外部テーブルの所有者のみが削除できます。

DROP FOREIGN TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

パラメーター

IF EXISTS

IF EXISTS 句を含めて、指定された名前の外部テーブルが存在しない場合にエラーを返す代わりに通知を発行するようにサーバーに指示します。

name

外部テーブルの名前を指定します。

CASCADE

外部テーブルに依存するオブジェクトを自動的に削除します。他のすべての依存オブジェクトも削除します。

RESTRICT

オブジェクトが依存している場合、外部テーブルを削除しないでください。

例

DROP FOREIGN TABLE warehouse;

DROP FOREIGN TABLE コマンドの使用の詳細については、 PostgreSQL documentation を参照してください。