すべてのプロダクト
Search
ドキュメントセンター

E-MapReduce:Kuduコネクタ

最終更新日:Jan 11, 2025

Kuduコネクタを使用すると、Kuduテーブルのデータのクエリ、データの挿入、およびデータの削除を実行できます。

背景情報

このトピックでは、Kuduコネクタと実行できる操作に関する以下の情報について説明します。

前提条件

Kuduサービスを含むHadoopクラスタとTrinoクラスタが作成されていること。詳細については、「クラスタの作成」をご参照ください。

制限事項

  • Kuduコネクタを使用して接続できるのは、Kudu 1.10以降のみです。

  • TrinoクラスタとHadoopクラスタ間にネットワーク接続を確立する必要があります。

  • Kuduテーブルと列の名前には、小文字のみを使用できます。

Kuduコネクタの構成の変更

Kuduコネクタの構成を変更できます。詳細については、「コネクタの構成」をご参照ください。

E-MapReduce(EMR)コンソールにログインし、Trinoサービスページの [構成] タブに移動します。 [構成] タブで、[kudu.properties] をクリックします。ビジネス要件に基づいて、次の表に示す構成項目を変更または追加します。

構成項目

説明

kudu.client.master-addresses

Kuduマスターアドレス。複数の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

スキーマエミュレーション機能を有効にするかどうかを指定します。有効な値:

  • false(デフォルト)

  • true

重要

[kudu.properties] タブで [構成項目の追加] をクリックして、この構成項目を追加できます。構成項目の追加方法の詳細については、「構成項目の追加」をご参照ください。

kudu.schema-emulation.prefix

スキーマエミュレーション機能のプレフィックス。

重要

kudu.schema emulation.enabled 構成項目を true に設定する場合は、このパラメータを構成する必要があります。

標準のプレフィックスは 'presto::` です。このパラメータは空のままにすることができます。

kudu.client.default-admin-operation-timeout

テーブルの作成や削除などの管理操作のデフォルトのタイムアウト期間。

デフォルト値:30。単位:秒。

kudu.client.default-operation-timeout

ユーザー操作のデフォルトのタイムアウト期間。

デフォルト値:30。単位:秒。

kudu.client.default-socket-read-timeout

ソケットからのデータを待機するデフォルトのタイムアウト期間。

デフォルト値:10。単位:秒。

kudu.client.disable-statistics

Kuduクライアントが統計情報を収集できるようにするかどうかを指定します。有効な値:

  • false(デフォルト値)

  • true

データのクエリ

Apache Kuduはスキーマをサポートしていません。ただし、スキーマをエミュレートするようにKuduコネクタを構成できます。

スキーマエミュレーション無効(デフォルト)

デフォルトでは、スキーマエミュレーション機能は無効になっています。この場合、すべてのKuduテーブルは default スキーマに存在します。

たとえば、SELECT * FROM kudu.default.orders ステートメントを実行して、orders テーブルからデータをクエリできます。 kudu をカタログとして、default をスキーマとして指定すると、SELECT * FROM orders ステートメントを実行して orders テーブルからデータをクエリできます。

Kuduテーブルの名前には、任意の文字を含めることができます。テーブル名に特殊文字が含まれている場合は、名前を二重引用符(")で囲む必要があります。たとえば、special.table! テーブルからデータをクエリするには、SELECT * FROM kudu.default."special.table!" ステートメントを実行します。

例:

  1. users という名前のテーブルを default スキーマに作成します。

    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
    );
    // プライマリキー、列のエンコード形式または圧縮形式、ハッシュパーティションまたは範囲パーティションなど、必要なテーブル情報を指定する必要があります。
    
    説明

    テーブルを作成するときは、プライマリキー、列のエンコード形式または圧縮形式、ハッシュパーティションまたは範囲パーティションなど、必要なテーブル情報を指定する必要があります。

  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)
  3. テーブルにデータを挿入します。

    INSERT INTO kudu.default.users VALUES (1, 'Donald', 'Duck'), (2, 'Mickey', 'Mouse');
  4. テーブルからデータをクエリします。

    SELECT * FROM kudu.default.users;

スキーマエミュレーション有効

etc/catalog/ディレクトリのKuduコネクタの kudu.properties 構成ファイルでスキーマエミュレーション機能を有効にすると、Kuduテーブルは命名規則に基づいてスキーマにマッピングされます。

  • kudu.schema-emulation.enabled=truekudu.schema-emulation.prefix= を構成すると、次の表にリストされているマッピングが優先されます。

    Kuduテーブル名

    Prestoテーブル名

    orders

    kudu.default.orders

    part1.part2

    kudu.part1.part2

    x.y.z

    kudu.x."y.z"

    説明

    Kuduはスキーマをサポートしていません。Prestoは、スキーマを管理するために $schemas という名前の特別なテーブルを作成します。

  • kudu.schema-emulation.enabled=truekudu.schema-emulation.prefix=presto:: を構成すると、次の表にリストされているマッピングが優先されます。

    Kuduテーブル名

    Prestoテーブル名

    orders

    kudu.default.orders

    part1.part2

    kudu.default."part1.part2"

    x.y.z

    kudu.default."x.y.z"

    presto::part1.part2

    kudu.part1.part2

    presto::x.y.z

    kudu.x."y.z"

    説明

    Kuduはスキーマをサポートしていません。Prestoは、スキーマを管理するために presto::$schemas という名前の特別なテーブルを作成します。

データ型マッピング

次の表に、Prestoデータ型とKuduデータ型のマッピングを示します。

TINYINTSMALLINTINTEGERBIGINTREALDOUBLEVARBINARYTIMEN/AJSONN/ATIME WITH TIMEZONEN/ATIMESTAMP WITH TIME ZONEN/AINTERVAL YEAR TO MONTHN/AINTERVAL DAY TO SECONDN/AARRAYN/AMAPN/AIPADDRESSN/A

Prestoデータ型

Kuduデータ型

備考

BOOLEAN

BOOL

なし。

INT8

なし。

INT16

なし。

INT32

なし。

INT64

なし。

FLOAT

なし。

DOUBLE

なし。

VARCHAR

STRING

CREATE TABLE ... AS ... ステートメントを実行して既存のPrestoテーブルからKuduテーブルを作成する場合、VARCHARの最大長は失われます。

BINARY

なし。

TIMESTAMP

UNIXTIME_MICROS

このデータ型のKudu列の精度は、µsからmsに低下します。

DECIMAL

DECIMAL

このデータ型は、バージョン 1.7.0 以降のKuduサーバーでのみサポートされています。

DATE

N/A

Kuduには、このデータ型に一致するデータ型がありません。

CREATE TABLE ... AS ... ステートメントを実行して既存のPrestoテーブルからKuduテーブルを作成する場合、列のDATE型はSTRING型に変換されます。

CHAR

N/A

Kuduには、このデータ型に一致するデータ型がありません。

Kuduには、このデータ型に一致するデータ型がありません。

Kuduには、このデータ型に一致するデータ型がありません。

Kuduには、このデータ型に一致するデータ型がありません。

Kuduには、このデータ型に一致するデータ型がありません。

Kuduには、このデータ型に一致するデータ型がありません。

Kuduには、このデータ型に一致するデータ型がありません。

Kuduには、このデータ型に一致するデータ型がありません。

Kuduには、このデータ型に一致するデータ型がありません。

Kuduには、このデータ型に一致するデータ型がありません。

サポートされているPresto SQLステートメント

説明

ALTER SCHEMA ... RENAME TO ... ステートメントはサポートされていません。

これらのステートメントは、名前変更または削除する列がプライマリキー列でない場合にのみサポートされます。

ステートメント

備考

SELECT

なし。

INSERT INTO ... VALUES

なし。

INSERT INTO ... SELECT ...

なし。

DELETE

なし。

DROP SCHEMA

このステートメントは、スキーマエミュレーションが有効になっている場合にのみサポートされます。

CREATE SCHEMA

このステートメントは、スキーマエミュレーションが有効になっている場合にのみサポートされます。

CREATE TABLE

テーブルの作成方法については、「テーブルの作成」をご参照ください。

CREATE TABLE ... AS

なし。

DROP TABLE

なし。

ALTER TABLE ... RENAME TO ...

なし。

ALTER TABLE ... ADD COLUMN ...

列の追加方法については、「列の追加」をご参照ください。

ALTER TABLE ... RENAME COLUMN ...

これらのステートメントは、名前変更または削除する列がプライマリキー列でない場合にのみサポートされます。

ALTER TABLE ... DROP COLUMN ...

SHOW SCHEMAS

なし。

SHOW TABLES

なし。

SHOW CREATE TABLE

なし。

SHOW COLUMNS FROM

なし。

DESCRIBE

このステートメントは SHOW COLUMNS FROM と同等です。

CALL kudu.system.add_range_partition

このステートメントは、範囲パーティションを追加するために使用されます。詳細については、「範囲パーティション」をご参照ください。

CALL kudu.system.drop_range_partition

このステートメントは、範囲パーティションを削除するために使用されます。詳細については、「範囲パーティション」をご参照ください。

テーブルの作成

テーブルを作成するときは、列、データ型、およびパーティション情報を指定する必要があります。ビジネス要件に基づいて、列のエンコード形式または圧縮形式を指定することもできます。例:

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_idevent_name はプライマリキー列です。テーブルは、user_id 列のハッシュ値に基づいて 5 つのパーティションに分割されます。 number_of_replicas の値は 3 です。

CREATE TABLEステートメントのパラメータを構成する場合は、次の項目に注意してください。

  • プライマリキー列は他の列の前に指定する必要があり、プライマリキー列のみをパーティションキー列として構成できます。

  • number_of_replicas パラメータはオプションです。このパラメータは、タブレットレプリカの数を指定し、奇数に設定する必要があります。このパラメータを構成しない場合は、Kuduマスター構成のデフォルトのレプリケーション係数が使用されます。

  • 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はデフォルトの圧縮形式を使用します。有効な値:default、no、lz4、snappy、および zlib。詳細については、「列の圧縮」を参照してください。

例:

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 (...);
// col1とcol2の列はハッシュパーティションキー列として定義され、データは4つのパーティションに分散されます。
// この例では、2つのハッシュパーティショングループが定義されています。最初のハッシュパーティショングループでは、行はcol1列に基づいて2つのパーティションに分散されます。2番目のハッシュパーティショングループでは、行はcol2列に基づいて3つのパーティションに分散されます。この場合、テーブル内のパーティションの総数は6(2×3)です。
// この例では、2つのハッシュパーティショングループと1つの範囲パーティションが定義されています。テーブルはevent_timeフィールドで範囲パーティション化され、データは2018-01-01T00:00:00に基づいて分割されます。
// この例では、myschemaスキーマのeventsテーブルに範囲パーティションが追加されます。パーティションの下限は2018-01-01で、正確な値は2018-01-01T00:00:00.000です。パーティションの上限は2018-06-01です。

パーティション設計

テーブルには、範囲パーティションは 1 つだけ、またはハッシュパーティションは少なくとも 1 つ含めることができます。

  • ハッシュパーティションの定義

    • 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_columnspartition_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_partitionkudu.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 つのハッシュパーティショングループと 1 つの範囲パーティションが定義されています。テーブルは event_time フィールドで範囲パーティション化され、データは 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>

    範囲パーティションの上限と下限。このパラメータは、'{"lower": <value>, "upper": <value>}' JSON形式で構成する必要があります。パーティションに複数の列がある場合は、このパラメータを '{"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')