Kudu コネクタを使用すると、Apache Kudu テーブルに格納されたデータのクエリ、挿入、および削除が可能です。
背景情報
Kudu コネクタでは、以下のトピックについて説明します。
前提条件
Trino クラスターおよび Kudu サービスを備えた Hadoop クラスターが作成されています。詳細については、「クラスターを作成する」をご参照ください。
制限事項
-
Kudu 1.10 以降。
-
Trino クラスターと Hadoop クラスター間のネットワーク接続性。
-
Kudu テーブル名および列名は小文字で指定する必要があります。
Kudu コネクタの構成を変更する
詳細については、「コネクタの構成」をご参照ください。
E-MapReduce (EMR) コンソールで、Trino サービスの Configure ページに移動します。Service Configuration エリアで、kudu.properties タブをクリックします。
|
パラメーター |
説明 |
|
kudu.client.master-addresses |
Kudu マスターアドレスのカンマ区切りリスト。 サポートされる形式:example.com、example.com:7051、192.0.2.1、192.0.2.1:7051、[2001:db8::1]、[2001:db8::1]:7051、2001:db8::1。 デフォルト値:localhost。 説明
Kudu テーブルへのデータ書き込みおよびデータクエリを行うには、デフォルト値を localhost から Kudu マスターノードの IP アドレスまたはホスト名(例:master-1-1)に変更してください。 |
|
kudu.schema-emulation.enabled |
スキーマエミュレーションを有効にするかどうかを指定します。
重要
この項目を追加するには、kudu.properties タブで Add Configuration Item をクリックします。手順については、「設定項目の追加」をご参照ください。 |
|
kudu.schema-emulation.prefix |
スキーマエミュレーションのプレフィックス。 重要
この設定項目は、 標準のプレフィックスは |
|
kudu.client.default-admin-operation-timeout |
テーブル作成やテーブル削除などの管理操作のデフォルトタイムアウト。 デフォルト値:30s。 |
|
kudu.client.default-operation-timeout |
ユーザー操作のデフォルトタイムアウト。 デフォルト値:30s。 |
|
kudu.client.default-socket-read-timeout |
ソケットからのデータ受信待ちのデフォルトタイムアウト。 デフォルト値:10s。 |
|
kudu.client.disable-statistics |
Kudu クライアントの統計情報収集を無効にするかどうかを指定します。
|
データのクエリ
Apache Kudu はネイティブでスキーマをサポートしていません。ただし、Kudu コネクタを構成してスキーマをエミュレートできます。
スキーマエミュレーション無効(デフォルト)
デフォルトでは、スキーマエミュレーションは無効です。この場合、すべての Kudu テーブルは default スキーマに配置されます。
たとえば、orders テーブルをクエリするには、SELECT * FROM kudu.default.orders を実行します。カタログおよびスキーマがそれぞれ kudu および default に設定されている場合は、クエリを SELECT * FROM orders と簡略化できます。
Kudu テーブル名には任意の文字を使用できます。名前に特殊文字が含まれる場合は、二重引用符(")で囲む必要があります。たとえば、special.table! テーブルをクエリするには、SELECT * FROM kudu.default."special.table!" を実行します。
例:
-
defaultスキーマにusersテーブルを作成します。CREATE TABLE kudu.default.users ( user_id int WITH (primary_key = true), first_name varchar, last_name varchar ) WITH ( partition_by_hash_columns = ARRAY['user_id'], partition_by_hash_buckets = 2 );説明テーブル作成時には、プライマリキー、列エンコードおよび圧縮形式、ハッシュまたはレンジパーティションなどの必須情報を指定する必要があります。
-
テーブル情報を表示します。
DESCRIBE kudu.default.users;コマンドの出力例は次のとおりです。
Column | Type | Extra | Comment ------------+---------+-------------------------------------------------+--------- user_id | integer | primary_key, encoding=auto, compression=default | first_name | varchar | nullable, encoding=auto, compression=default | last_name | varchar | nullable, encoding=auto, compression=default | (3 rows) -
データを挿入します。
INSERT INTO kudu.default.users VALUES (1, 'Donald', 'Duck'), (2, 'Mickey', 'Mouse'); -
データをクエリします。
SELECT * FROM kudu.default.users;
スキーマエミュレーション有効
コネクタの設定ファイル(etc/catalog/kudu.properties)でスキーマエミュレーションを有効にすると、命名規則に基づいてテーブルがスキーマにマッピングされます。
-
kudu.schema-emulation.enabled=trueかつkudu.schema-emulation.prefix=を設定した場合、テーブルは次のようにマッピングされます。Kudu テーブル名
Presto テーブル名
orderskudu.default.orderspart1.part2kudu.part1.part2x.y.zkudu.x."y.z"説明Kudu はネイティブでスキーマをサポートしていないため、Presto はスキーマを管理するために
$schemasという特別なテーブルを作成します。 -
kudu.schema-emulation.enabled=trueかつkudu.schema-emulation.prefix=presto::を設定した場合、テーブルは次のようにマッピングされます。Kudu テーブル名
Presto テーブル名
orderskudu.default.orderspart1.part2kudu.default."part1.part2"x.y.zkudu.default."x.y.z"presto::part1.part2kudu.part1.part2presto::x.y.zkudu.x."y.z"説明Kudu はネイティブでスキーマをサポートしていないため、Presto はスキーマを管理するために
presto::$schemasという特別なテーブルを作成します。
データ型マッピング
以下の表は、Presto と Kudu 間のデータ型マッピングを示しています。
|
Presto 型 |
Kudu 型 |
備考 |
|
BOOLEAN |
BOOL |
該当なし |
|
TINYINT |
INT8 |
|
|
SMALLINT |
INT16 |
|
|
INTEGER |
INT32 |
|
|
BIGINT |
INT64 |
|
|
REAL |
FLOAT |
|
|
DOUBLE |
DOUBLE |
|
|
VARCHAR |
STRING |
|
|
VARBINARY |
BINARY |
|
|
TIMESTAMP |
UNIXTIME_MICROS |
このマッピングにより、Kudu 列の精度がマイクロ秒(µs)からミリ秒(ms)に低下します。 |
|
DECIMAL |
DECIMAL |
Kudu 1.7.0 以降でのみサポートされます。 |
|
DATE |
該当なし |
サポートされていません。
|
|
CHAR |
該当なし |
サポートされていません。 |
|
TIME |
||
|
JSON |
||
|
TIME WITH TIME ZONE |
||
|
TIMESTAMP WITH TIME ZONE |
||
|
INTERVAL YEAR TO MONTH |
||
|
INTERVAL DAY TO SECOND |
||
|
ARRAY |
||
|
MAP |
||
|
IPADDRESS |
サポートされる Presto SQL ステートメント
ALTER SCHEMA ... RENAME TO ... ステートメントはサポートされていません。
|
ステートメント |
説明 |
|
|
なし。 |
|
|
なし。 |
|
|
なし。 |
|
|
なし。 |
|
|
スキーマエミュレーションが有効な場合のみ利用可能です。 |
|
|
スキーマエミュレーションが有効な場合のみ利用可能です。 |
|
|
テーブルを作成します。詳細については、「テーブルの作成」をご参照ください。 |
|
|
なし。 |
|
|
なし。 |
|
|
なし。 |
|
|
列を追加します。詳細については、「列の追加」をご参照ください。 |
|
|
これらのステートメントは、プライマリキーの一部ではない列にのみ適用されます。 |
|
|
|
|
|
なし。 |
|
|
なし。 |
|
|
なし。 |
|
|
なし。 |
|
|
このステートメントは |
|
|
レンジパーティションを追加します。詳細については、「レンジパーティション」をご参照ください。 |
|
|
レンジパーティションを削除します。詳細については、「レンジパーティション」をご参照ください。 |
テーブルの作成
テーブルを作成するには、列、データ型、およびパーティション情報を指定します。また、列エンコード形式や圧縮形式などの詳細も指定できます。以下に例を示します。
CREATE TABLE user_events (
user_id int WITH (primary_key = true),
event_name varchar WITH (primary_key = true),
message varchar,
details varchar WITH (nullable = true, encoding = 'plain')
) WITH (
partition_by_hash_columns = ARRAY['user_id'],
partition_by_hash_buckets = 5,
number_of_replicas = 3
);
この例では、プライマリキーは user_id 列および event_name 列で構成されています。user_id 列のハッシュ値に基づいて、テーブルは 5 つのパーティションに分割されています。number_of_replicas は 3 に設定されています。
テーブル作成時に注意すべき点は以下のとおりです。
-
プライマリキー列は先頭に記述する必要があります。パーティションキー列はプライマリキー列のサブセットである必要があります。
-
number_of_replicas:タブレットレプリカの数。奇数である必要があります。指定しない場合、Kudu Master の構成からデフォルト値が使用されます。 -
Kudu はハッシュパーティションおよびレンジパーティションをサポートしています。ハッシュパーティションはハッシュ値に基づいて行をバケットに分散させます。レンジパーティションは順序付きのレンジパーティションキーに基づいて行を分散させ、その具体的な範囲は明示的に作成する必要があります。Kudu はマルチレベルパーティショニングをサポートしています。テーブルには少なくとも 1 つのハッシュパーティションまたはレンジパーティションが必要です。複数のハッシュパーティションを設定できますが、レンジパーティションは最大で 1 つまでです。
列プロパティ
列名およびデータ型に加えて、以下の列プロパティを指定できます。
|
パラメーター |
型 |
説明 |
|
primary_key |
BOOLEAN |
true の場合、この列はプライマリキーの一部になります。 Kudu のプライマリキーは一意性制約を強制します。既存のプライマリキーと同じプライマリキーを持つ行を挿入すると、既存の行が更新されます。詳細については、「プライマリキー設計」をご参照ください。 |
|
nullable |
BOOLEAN |
true の場合、列に null 値を許可します。 重要
プライマリキー列には null 値を設定できません。 |
|
encoding |
VARCHAR |
列のエンコード形式。ストレージを削減し、クエリパフォーマンスを向上させます。 指定しない場合、Kudu は列のデータ型に基づいて自動的にエンコード形式を選択します。有効な値:auto、plain、bitshuffle、runlength、prefix、dictionary、group_varint。詳細については、「列エンコーディング」をご参照ください。 |
|
compression |
VARCHAR |
列の圧縮形式。 指定しない場合、Kudu はデフォルトの圧縮形式を使用します。有効な値: |
以下に例を示します。
CREATE TABLE mytable (
name varchar WITH (primary_key = true, encoding = 'dictionary', compression = 'snappy'),
index bigint WITH (nullable = true, encoding = 'runlength', compression = 'lz4'),
comment varchar WITH (nullable = true, encoding = 'plain', compression = 'default'),
...
) WITH (...);
パーティション設計
このセクションでは、ハッシュパーティションおよびレンジパーティションの定義方法について説明します。
-
ハッシュパーティション
-
1 つのパーティショングループの定義
partition_by_hash_columns および
partition_by_hash_bucketsテーブルプロパティを使用して、パーティションキー列およびパーティション数をそれぞれ指定します。すべてのパーティションキー列はプライマリキー列のサブセットである必要があります。以下に例を示します。CREATE TABLE mytable ( col1 varchar WITH (primary_key=true), col2 varchar WITH (primary_key=true), ... ) WITH ( partition_by_hash_columns = ARRAY['col1', 'col2'], partition_by_hash_buckets = 4 )説明この例では、
col1列およびcol2列に対してハッシュパーティションを定義し、データを 4 つのパーティションに分散させています。 -
2 つのパーティショングループの定義
2 つの独立したハッシュパーティショングループを定義するには、
partition_by_second_hash_columnsおよびpartition_by_second_hash_bucketsテーブルプロパティも指定する必要があります。以下に例を示します。CREATE TABLE mytable ( col1 varchar WITH (primary_key=true), col2 varchar WITH (primary_key=true), ... ) WITH ( partition_by_hash_columns = ARRAY['col1'], partition_by_hash_buckets = 2, partition_by_second_hash_columns = ARRAY['col2'], partition_by_second_hash_buckets = 3 )説明この例では、2 つのハッシュパーティショングループを定義しています。最初のグループは
col1列に基づいて行を 2 つのパーティションに分散させます。2 番目のグループはcol2列に基づいて行を 3 つのパーティションに分散させます。テーブルのパーティション総数は 6(2 × 3)になります。
-
-
レンジパーティション
Kudu テーブルには最大で 1 つのレンジパーティションを設定でき、
partition_by_range_columnsテーブルプロパティを使用して定義します。テーブル作成時にrange_partitionsテーブルプロパティを使用してパーティション範囲を定義できます。既存のテーブルに対するレンジパーティションの管理には、kudu.system.add_range_partitionおよびkudu.system.drop_range_partitionストアドプロシージャを使用します。以下に例を示します。CREATE TABLE events ( rack varchar WITH (primary_key=true), machine varchar WITH (primary_key=true), event_time timestamp WITH (primary_key=true), ... ) WITH ( partition_by_hash_columns = ARRAY['rack'], partition_by_hash_buckets = 2, partition_by_second_hash_columns = ARRAY['machine'], partition_by_second_hash_buckets = 3, partition_by_range_columns = ARRAY['event_time'], range_partitions = '[{"lower": null, "upper": "2018-01-01T00:00:00"}, {"lower": "2018-01-01T00:00:00", "upper": null}]' )説明この例では、2 つのハッシュパーティショングループと
event_time列に対する 1 つのレンジパーティションを持つテーブルを定義しています。範囲はタイムスタンプ2018-01-01T00:00:00で分割されています。 -
レンジパーティションの管理
以下の例は、パーティション操作を示しています。
-
レンジパーティションの追加
CALL kudu.system.add_range_partition(<YOUR_SCHEMA_NAME>, <YOUR_TABLE_NAME>, <range_partition_as_json_string>) -
レンジパーティションの削除
CALL kudu.system.drop_range_partition(<YOUR_SCHEMA_NAME>, <YOUR_TABLE_NAME>, <range_partition_as_json_string>)
パラメーター
説明
<YOUR_SCHEMA_NAME>テーブルが配置されているスキーマ。
<YOUR_TABLE_NAME>テーブル名。
<range_partition_as_json_string>レンジパーティションの上限および下限を JSON 文字列として指定します。形式は
'{"lower": <value>, "upper": <value>}'です。パーティションに複数の列がある場合は、形式は'{"lower": [<value_col1>,...], "upper": [<value_col1>,...]}'です。値の形式は列のデータ型によって異なります。以下のリストは、データ型と必要な JSON 文字列形式の対応関係を示しています。-
BIGINT:
'{"lower": 0, "upper": 1000000}' -
SMALLINT:
'{"lower": 10, "upper": null}' -
VARCHAR:
'{"lower": "A", "upper": "M"}' -
TIMESTAMP:
'{"lower": "2018-02-01T00:00:00.000", "upper": "2018-02-01T12:00:00.000"}' -
BOOLEAN:
'{"lower": false, "upper": true}' -
VARBINARY: Base64 エンコードされた文字列。
説明null値は、境界が無限であることを示します。以下に例を示します。
CALL kudu.system.add_range_partition('myschema', 'events', '{"lower": "2018-01-01", "upper": "2018-06-01"}')説明この例では、
myschemaスキーマ内のeventsテーブルにレンジパーティションを追加しています。パーティションの下限は2018-01-01(タイムスタンプ2018-01-01T00:00:00.000に対応)で、上限は2018-06-01です。既存のレンジパーティションを確認するには、
SHOW CREATE TABLEステートメントを使用します。この情報はrange_partitionsテーブルプロパティに表示されます。 -
列の追加
ALTER TABLE ... ADD COLUMN ... ステートメントを使用して、既存のテーブルに列を追加します。新しい列に対して列プロパティを指定することもできます。列プロパティの詳細については、「テーブルの作成」をご参照ください。
ALTER TABLE mytable ADD COLUMN extraInfo varchar WITH (nullable = true, encoding = 'plain')