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=falseUntuk 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
Buat tabel bernama
usersdi skemadefault: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).
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)Sisipkan baris:
INSERT INTO kudu.default.users VALUES (1, 'Donald', 'Duck'), (2, 'Mickey', 'Mouse');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 Kudu | Nama tabel Trino |
|---|---|
orders | kudu.default.orders |
part1.part2 | kudu.part1.part2 |
x.y.z | kudu.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 Kudu | Nama tabel Trino |
|---|---|
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" |
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 Trino | Tipe Kudu | Catatan |
|---|---|---|
| BOOLEAN | BOOL | |
| TINYINT | INT8 | |
| SMALLINT | INT16 | |
| INTEGER | INT32 | |
| BIGINT | INT64 | |
| REAL | FLOAT | |
| DOUBLE | DOUBLE | |
| VARCHAR | STRING | Panjang maksimum hilang saat menggunakan CREATE TABLE ... AS .... |
| VARBINARY | BINARY | |
| TIMESTAMP | UNIXTIME_MICROS | Kudu menyimpan presisi mikrodetik, tetapi menguranginya menjadi resolusi milidetik. |
| DECIMAL | DECIMAL | Memerlukan server Kudu versi 1.7.0 atau lebih baru. |
| DATE | N/A | Tidak ada tipe Kudu yang sesuai. Dikonversi ke STRING saat menggunakan CREATE TABLE ... AS .... |
| CHAR | N/A | Tidak 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:
SELECTINSERT INTO ... VALUESINSERT INTO ... SELECT ...DELETECREATE TABLE— lihat Create a tableCREATE TABLE ... ASDROP TABLEALTER TABLE ... RENAME TO ...ALTER TABLE ... ADD COLUMN ...— lihat Add a columnALTER TABLE ... RENAME COLUMN ...— hanya didukung untuk kolom non-primary-keyALTER TABLE ... DROP COLUMN ...— hanya didukung untuk kolom non-primary-keyCREATE SCHEMA— hanya didukung saat emulasi skema diaktifkanDROP SCHEMA— hanya didukung saat emulasi skema diaktifkanSHOW SCHEMASSHOW TABLESSHOW CREATE TABLESHOW COLUMNS FROMDESCRIBE— setara denganSHOW COLUMNS FROMCALL kudu.system.add_range_partition— lihat Manage range partitionsCALL 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_iddanevent_nameadalah kolom kunci primer.Tabel dipartisi hash berdasarkan
user_idke dalam 5 bucket.number_of_replicasdiatur 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_replicasbersifat 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 kolom | Tipe data | Deskripsi |
|---|---|---|
primary_key | BOOLEAN | Menandai 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. |
nullable | BOOLEAN | Mengizinkan kolom berisi nilai null. Kolom kunci primer tidak boleh nullable. |
encoding | VARCHAR | Format encoding kolom. Default mengikuti encoding berbasis tipe Kudu. Nilai yang valid: auto, plain, bitshuffle, runlength, prefix, dictionary, group_varint. Lihat Column Encoding. |
compression | VARCHAR | Format 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:
| Parameter | Deskripsi |
|---|---|
<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 data | Contoh |
|---|---|
| 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 | String 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.