Hadoop外部データラッパーの設定

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

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

    /var/lib/edb/as_version/data

  2. 選択したエディターで構成ファイルを変更し、構成ファイルの最後に 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 を設定する必要があります。

  1. パラメータ値を設定した後、Postgresサーバーを再起動します。AdvancedServerホストでのサービスの制御の詳細については、次の場所にある『EDBPostgresAdvancedServerインストールガイド』を参照してください。

HadoopForeignDataWrapperを使用する前に、以下を行う必要があります。

  1. :ref:`CREATEEXTENSION<create_extension>`コマンドを使用して、Postgresホストで拡張機能を作成します。

  2. :ref:`CREATESERVER<create_server>`コマンドを使用して、Hadoopファイルシステムへの接続を定義します。

  3. :ref:`CREATEUSERMAPPING<create_user_mapping>`コマンドを使用して、Postgresロールをサーバーに関連付けるマッピングを定義します。

  4. :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値を決定します。

  • ユーザーマッピングにユーザー名とパスワードが含まれる場合、データラッパーはLDAP認証を使用します。

  • ユーザーマッピングにユーザー名とパスワードが含まれていない場合、データラッパーはNOSASL認証を使用します。

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