All Products
Search
Document Center

E-MapReduce:Kudu connector

Last Updated:Mar 26, 2026

Gunakan Kudu connector dengan Trino untuk melakukan kueri, menyisipkan, dan menghapus data di tabel Apache Kudu.

Prasyarat

Sebelum memulai, pastikan Anda memiliki:

  • Kluster Hadoop dengan layanan Kudu (versi 1.10 atau lebih baru)

  • Kluster Trino dengan konektivitas jaringan ke kluster Hadoop

Untuk membuat kluster tersebut, lihat Create a cluster.

Batasan

  • Kudu connector memerlukan Kudu versi 1.10 atau lebih baru.

  • Nama tabel Kudu dan nama kolom hanya boleh berisi huruf kecil.

  • Harus terdapat koneksi jaringan antara kluster Trino dan kluster Hadoop.

Konfigurasi Kudu connector

Di Konsol E-MapReduce (EMR), buka tab Configure pada halaman layanan Trino dan klik kudu.properties. Ubah atau tambahkan item konfigurasi sesuai kebutuhan Anda.

Untuk referensi lengkap tentang konfigurasi connector, lihat Configure a connector.

Berikut adalah templat lengkap kudu.properties yang mencakup semua item konfigurasi yang didukung:

connector.name=kudu

## Wajib: alamat master Kudu. Pisahkan beberapa alamat dengan koma.
## Format yang didukung: example.com, example.com:7051, 192.0.2.1, 192.0.2.1:7051,
##                    [2001:db8::1], [2001:db8::1]:7051, 2001:db8::1
## Ganti localhost dengan alamat IP atau hostname node master Kudu Anda (misalnya, master-1-1).
kudu.client.master-addresses=localhost

## Emulasi skema memungkinkan Trino memetakan tabel Kudu ke skema menggunakan konvensi penamaan.
## Secara default, semua tabel muncul di skema "default".
#kudu.schema-emulation.enabled=false

## Awalan yang digunakan saat emulasi skema diaktifkan. Awalan standar adalah "presto::". Awalan kosong juga valid.
## Diperlukan hanya jika kudu.schema-emulation.enabled=true.
#kudu.schema-emulation.prefix=

## Konfigurasi lanjutan klien Java Kudu

## Timeout untuk operasi administratif (misalnya, CREATE TABLE, DROP TABLE). Default: 30s.
#kudu.client.default-admin-operation-timeout=30s

## Timeout untuk operasi pengguna. Default: 30s.
#kudu.client.default-operation-timeout=30s

## Timeout untuk menunggu data dari soket. Default: 10s.
#kudu.client.default-socket-read-timeout=10s

## Apakah akan menonaktifkan pengumpulan statistik klien Kudu. Default: false.
#kudu.client.disable-statistics=false
Penting

Untuk menambahkan item konfigurasi yang tidak tersedia secara default di kudu.properties, klik Add Configuration Item pada tab kudu.properties. Untuk detailnya, lihat Add configuration items.

Kueri data

Apache Kudu tidak mendukung skema secara native, tetapi Kudu connector dapat mengemulasikannya melalui konvensi penamaan.

Emulasi skema dinonaktifkan (default)

Dengan emulasi skema dinonaktifkan, semua tabel Kudu muncul di skema default.

Lakukan kueri terhadap tabel orders menggunakan nama lengkapnya:

SELECT * FROM kudu.default.orders;

Jika Anda menetapkan kudu sebagai katalog dan default sebagai skema, kueri menjadi lebih sederhana:

SELECT * FROM orders;

Jika nama tabel berisi karakter khusus, bungkus dengan tanda kutip ganda:

SELECT * FROM kudu.default."special.table!";

Contoh cepat: buat dan kueri tabel

  1. Buat tabel bernama users di skema 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
    );
    Saat membuat tabel, tentukan kunci primer, format encoding atau kompresi kolom, serta informasi partisi (hash atau range).
  2. Periksa skema tabel:

    DESCRIBE kudu.default.users;

    Output yang diharapkan:

       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. Sisipkan baris:

    INSERT INTO kudu.default.users VALUES (1, 'Donald', 'Duck'), (2, 'Mickey', 'Mouse');
  4. Kueri data:

    SELECT * FROM kudu.default.users;

Emulasi skema diaktifkan

Aktifkan emulasi skema dengan menyetel kudu.schema-emulation.enabled=true di etc/catalog/kudu.properties. Tabel Kudu kemudian dipetakan ke skema Trino berdasarkan nama mereka.

Pemetaan dengan awalan kosong (kudu.schema-emulation.prefix=)

Nama tabel KuduNama tabel Trino
orderskudu.default.orders
part1.part2kudu.part1.part2
x.y.zkudu.x."y.z"
Kudu tidak mendukung skema. Trino membuat tabel khusus bernama $schemas untuk mengelolanya.

Pemetaan dengan awalan standar (kudu.schema-emulation.prefix=presto::)

Nama tabel KuduNama tabel Trino
orderskudu.default.orders
part1.part2kudu.default."part1.part2"
x.y.zkudu.default."x.y.z"
presto::part1.part2kudu.part1.part2
presto::x.y.zkudu.x."y.z"
Dengan awalan standar, Trino membuat tabel khusus bernama presto::$schemas untuk mengelola skema.

Pemetaan tipe data

Trino ke Kudu

Saat menulis data dari Trino ke Kudu, pemetaan tipe berikut berlaku:

Tipe TrinoTipe KuduCatatan
BOOLEANBOOL
TINYINTINT8
SMALLINTINT16
INTEGERINT32
BIGINTINT64
REALFLOAT
DOUBLEDOUBLE
VARCHARSTRINGPanjang maksimum hilang saat menggunakan CREATE TABLE ... AS ....
VARBINARYBINARY
TIMESTAMPUNIXTIME_MICROSKudu menyimpan presisi mikrodetik, tetapi menguranginya menjadi resolusi milidetik.
DECIMALDECIMALMemerlukan server Kudu versi 1.7.0 atau lebih baru.
DATEN/ATidak ada tipe Kudu yang sesuai. Dikonversi ke STRING saat menggunakan CREATE TABLE ... AS ....
CHARN/ATidak ada tipe Kudu yang sesuai.

Tipe Trino berikut tidak didukung: TIME, JSON, TIME WITH TIMEZONE, TIMESTAMP WITH TIME ZONE, INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND, ARRAY, MAP, IPADDRESS.

Pernyataan SQL yang didukung

Connector ini mendukung akses baca dan tulis ke data Kudu. Pernyataan SQL berikut didukung:

  • SELECT

  • INSERT INTO ... VALUES

  • INSERT INTO ... SELECT ...

  • DELETE

  • CREATE TABLE — lihat Create a table

  • CREATE TABLE ... AS

  • DROP TABLE

  • ALTER TABLE ... RENAME TO ...

  • ALTER TABLE ... ADD COLUMN ... — lihat Add a column

  • ALTER TABLE ... RENAME COLUMN ... — hanya didukung untuk kolom non-primary-key

  • ALTER TABLE ... DROP COLUMN ... — hanya didukung untuk kolom non-primary-key

  • CREATE SCHEMA — hanya didukung saat emulasi skema diaktifkan

  • DROP SCHEMA — hanya didukung saat emulasi skema diaktifkan

  • SHOW SCHEMAS

  • SHOW TABLES

  • SHOW CREATE TABLE

  • SHOW COLUMNS FROM

  • DESCRIBE — setara dengan SHOW COLUMNS FROM

  • CALL kudu.system.add_range_partition — lihat Manage range partitions

  • CALL kudu.system.drop_range_partition — lihat Manage range partitions

ALTER SCHEMA ... RENAME TO ... tidak didukung.

Buat tabel

Setiap tabel Kudu memerlukan kolom dengan tipe data, kunci primer, dan informasi partisi. Encoding dan kompresi kolom bersifat opsional.

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

Dalam contoh ini:

  • user_id dan event_name adalah kolom kunci primer.

  • Tabel dipartisi hash berdasarkan user_id ke dalam 5 bucket.

  • number_of_replicas diatur ke 3, yang mengontrol jumlah replika tablet.

Aturan utama saat membuat tabel:

  • Kolom kunci primer harus dicantumkan sebelum semua kolom lainnya.

  • Hanya kolom kunci primer yang dapat berfungsi sebagai kolom kunci partisi.

  • number_of_replicas bersifat opsional dan harus berupa angka ganjil. Jika dihilangkan, faktor replikasi default master Kudu akan diterapkan.

  • Tabel harus memiliki setidaknya satu partisi hash atau range. Tabel dapat memiliki beberapa partisi hash tetapi hanya satu partisi range.

Properti kolom

Tentukan properti kolom dalam klausa WITH:

Properti kolomTipe dataDeskripsi
primary_keyBOOLEANMenandai kolom sebagai kunci primer. Kudu memberlakukan keunikan pada kunci primer; penyisipan baris dengan kunci primer duplikat akan memperbarui baris yang sudah ada. Lihat Primary Key Design.
nullableBOOLEANMengizinkan kolom berisi nilai null. Kolom kunci primer tidak boleh nullable.
encodingVARCHARFormat encoding kolom. Default mengikuti encoding berbasis tipe Kudu. Nilai yang valid: auto, plain, bitshuffle, runlength, prefix, dictionary, group_varint. Lihat Column Encoding.
compressionVARCHARFormat kompresi kolom. Default mengikuti kompresi default Kudu. Nilai yang valid: default, no, lz4, snappy, zlib. Lihat Column compression.

Contoh dengan encoding dan kompresi eksplisit:

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

Desain partisi

Kudu mendukung partisi hash dan partisi range. Tabel harus memiliki setidaknya satu partisi dari salah satu jenis tersebut.

Tentukan partisi hash

Tentukan partition_by_hash_columns (kolom kunci partisi) dan partition_by_hash_buckets (jumlah bucket). Kolom kunci partisi harus merupakan subset dari kolom kunci primer.

Satu grup partisi hash:

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 dan col2 adalah kolom kunci partisi hash. Baris didistribusikan ke 4 bucket.

Dua grup partisi hash independen:

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

Grup pertama mendistribusikan baris berdasarkan col1 ke 2 bucket; grup kedua mendistribusikan berdasarkan col2 ke 3 bucket. Total jumlah partisi adalah 6 (2 x 3).

Tentukan partisi range

Gunakan partition_by_range_columns untuk menentukan kolom partisi range dan range_partitions untuk menentukan batas partisi awal.

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}]'
);

Tabel ini memiliki dua grup partisi hash dan satu partisi range pada event_time, dibagi pada 2018-01-01T00:00:00.

Manajemen partisi range

Tambahkan atau hapus partisi range pada tabel yang sudah ada menggunakan prosedur tersimpan:

-- Tambahkan partisi range
CALL kudu.system.add_range_partition(<schema_name>, <table_name>, <range_partition_as_json_string>)

-- Hapus partisi range
CALL kudu.system.drop_range_partition(<schema_name>, <table_name>, <range_partition_as_json_string>)

Parameter:

ParameterDeskripsi
<schema_name>Skema yang berisi tabel tersebut.
<table_name>Nama tabel.
<range_partition_as_json_string>Batas partisi dalam format JSON: '{"lower": <value>, "upper": <value>}'. Untuk kunci range multi-kolom, gunakan array: '{"lower": [<col1_value>, ...], "upper": [<col1_value>, ...]}'. Atur salah satu batas ke null untuk partisi tak terbatas.

Format nilai JSON berdasarkan tipe data:

Tipe dataContoh
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}'
VARBINARYString yang di-encode Base64

Contoh: Tambahkan partisi range ke tabel events di skema myschema, mencakup catatan dari 2018-01-01 hingga 2018-06-01:

CALL kudu.system.add_range_partition('myschema', 'events', '{"lower": "2018-01-01", "upper": "2018-06-01"}')

Batas bawah "2018-01-01" diinterpretasikan sebagai 2018-01-01T00:00:00.000.

Untuk melihat semua partisi range yang ada pada tabel, jalankan SHOW CREATE TABLE. Properti range_partitions dalam output mencantumkan batas partisi saat ini.

Tambahkan kolom

Gunakan ALTER TABLE ... ADD COLUMN ... untuk menambahkan kolom ke tabel yang sudah ada. Properti kolom seperti nullable dan encoding didukung.

ALTER TABLE mytable ADD COLUMN extraInfo varchar WITH (nullable = true, encoding = 'plain')

Untuk properti kolom yang tersedia, lihat Column properties.