Topik ini menjelaskan cara membuat tabel eksternal Hologres menggunakan pernyataan CREATE EXTERNAL TABLE, serta menentukan detail seperti sumber data Hologres, informasi autentikasi STS, mode tanda tangan ganda, tabel tujuan yang dipetakan, dan informasi driver Java Database Connectivity (JDBC).
Pengenalan Fungsi
Hologres adalah gudang data analisis interaktif real-time yang kompatibel dengan protokol PostgreSQL dan terintegrasi secara mulus dengan MaxCompute. Dengan membuat tabel eksternal Hologres di MaxCompute, Anda dapat mengkueri data dari sumber data Hologres menggunakan driver JDBC PostgreSQL dan informasi autentikasi STS. Metode ini memungkinkan pengkuerian data secara langsung tanpa penyimpanan berlebih atau impor/ekspor data, sehingga hasil kueri dapat diperoleh dengan cepat.
Penerapan
Operasi data (DML)
MaxCompute tidak mendukung operasi UPDATE atau DELETE pada tabel eksternal Hologres.
Operasi INSERT OVERWRITE tidak didukung untuk tabel eksternal Hologres.
Untuk menimpa data di Hologres dengan data dari MaxCompute, Anda dapat menggunakan semantik INSERT OVERWRITE milik Hologres. Dari Hologres, Anda dapat membaca tabel eksternal yang memetakan ke tabel MaxCompute. Untuk informasi selengkapnya, lihat INSERT OVERWRITE.
Risiko penulisan data
Saat menulis sejumlah besar data ke tabel eksternal Hologres, beberapa proses menulis data secara paralel. Dalam kasus langka, proses penulisan dapat menulis ulang data, yang menyebabkan duplikasi data.
Partisi
Tabel partisi di Hologres tidak dipetakan secara langsung ke tabel partisi di MaxCompute. Tabel eksternal Hologres tidak mendukung partisi. Namun, saat menggunakan mode baca langsung untuk mengkueri tabel eksternal MaxCompute yang memetakan ke tabel induk partisi di Hologres, pemangkasan partisi dapat dipicu jika kondisi kueri mencakup kolom kunci partisi dari tabel anak.
Tabel eksternal Hologres tidak mendukung properti kluster.
Tabel eksternal Hologres tidak dapat dipetakan ke tabel dinamis Hologres.
Tipe data yang didukung
Batasan tipe DECIMAL:
Untuk tabel eksternal Hologres yang dibuat di MaxCompute, tipe data
DECIMALsecara default ditetapkan sebagaidecimal(38,18)dan tidak dapat diubah. Jika tabel sumber memiliki presisi lebih rendah, Anda dapat mendefinisikan kolom tersebut sebagai tipeSTRINGdi tabel eksternal MaxCompute, lalu menggunakan fungsiCASTuntuk mengonversi tipe saat mengkueri kolom tersebut.Batasan tipe kompleks:
Tabel eksternal Hologres yang dibuat di MaxCompute tidak mendukung tipe data kompleks seperti
Array,Map, atauStruct.Tipe tidak kompatibel lainnya:
Tipe data di Hologres seperti
MONEYtidak memiliki padanan di MaxCompute dan tidak didukung.
Tabel berikut memberikan rincian lengkap:
Tipe data Hologres | Tipe data MaxCompute | JDBC read | JDBC write | Baca langsung (odps.table.api.enable.holo.table=true) | Deskripsi |
INTEGER (alias: INT atau INT4) | INT |
|
|
| Bilangan bulat bertanda 32-bit. |
TEXT | STRING, VARCHAR |
|
|
| Tipe string. Batas panjang saat ini adalah 8 MB. |
SMALLINT | SMALLINT |
|
|
| Bilangan bulat bertanda 16-bit. |
INT2 | SMALLINT |
|
|
| Bilangan bulat bertanda 16-bit. |
BIGINT (alias: INT8) | BIGINT |
|
|
| Bilangan bulat bertanda 64-bit. |
BYTEA | BINARY |
|
|
| Tipe data biner. Batas panjang saat ini adalah 8 MB. Ukuran maksimum tipe |
REAL (alias: FLOAT4) | FLOAT |
|
|
| Tipe floating-point biner 32-bit. |
DOUBLE PRECISION (alias: FLOAT8) | DOUBLE |
|
|
| Tipe floating-point biner 64-bit. |
BOOLEAN (alias: BOOL) | BOOLEAN |
|
|
| Tipe BOOLEAN. |
TIMESTAMP | TIMESTAMP_NTZ |
|
|
| Presisi penyimpanan adalah nanodetik. Kesalahan zona waktu mungkin terjadi. Tipe TIMESTAMP di Hologres tidak mencakup zona waktu dan memiliki presisi penyimpanan mikrodetik. |
TIMESTAMP WITH TIME ZONE (alias: TIMESTAMPTZ) | TIMESTAMP |
|
|
| Tipe timestamp dengan presisi nanodetik. Formatnya adalah MaxCompute dan Hologres melakukan konversi presisi di lapisan dasar. Output MaxCompute tidak mencakup format zona waktu. |
DECIMAL (alias: NUMERIC) | DECIMAL(presisi,skala) |
|
|
| Tipe numerik eksak basis-10.
Jika Anda tidak menentukan presisi untuk tipe DECIMAL di MaxCompute, nilai default-nya adalah |
CHAR(n) | CHAR(n) |
|
|
| Di MaxCompute, Ukuran maksimum |
VARCHAR(n) | VARCHAR(n) |
|
|
| Di MaxCompute, Ukuran maksimum |
DATE | DATE |
|
|
| Tipe tanggal. Formatnya adalah |
INT4[] | ARRAY<INT> |
|
|
| Tipe kompleks ARRAY. |
INT8[] | ARRAY<BIGINT> |
|
|
| |
FLOAT4[] | ARRAY<FLOAT> |
|
|
| |
FLOAT8[] | ARRAY<DOUBLE> |
|
|
| |
BOOLEAN[] | ARRAY<BOOLEAN> |
|
|
| |
TEXT[] | ARRAY<STRING> |
|
|
| |
JSONB | JSON |
|
|
| Tipe kompleks JSON. Didukung dalam mode baca langsung. |
JSON | STRING |
|
|
| Tipe string. Batas panjang saat ini adalah 8 MB. Mode JDBC mendukung tipe JSON Hologres. |
SERIAL (urutan auto-increment) | INT |
|
|
| Untuk bidang urutan auto-increment di Hologres, Anda dapat menggunakan tipe INT di MaxCompute untuk menerima data. Namun, fitur auto-increment tidak tersedia saat menulis data. |
RoaringBitmap | Tidak didukung |
|
|
| Tidak ada tipe yang sesuai di MaxCompute. |
RoaringBitmap64 | Tidak didukung |
|
|
| Tidak ada tipe yang sesuai di MaxCompute. |
BIT(n) | Tidak didukung |
|
|
| Tidak ada tipe yang sesuai di MaxCompute. |
VARBIT(n) | Tidak didukung |
|
|
| Tidak ada tipe yang sesuai di MaxCompute. |
INTERVAL | Tidak didukung |
|
|
| Tidak ada tipe yang sesuai di MaxCompute. |
TIMETZ | Tidak didukung |
|
|
| Tidak ada tipe yang sesuai di MaxCompute. |
TIME | Tidak didukung |
|
|
| Tidak ada tipe yang sesuai di MaxCompute. |
INET | Tidak didukung |
|
|
| Tidak ada tipe yang sesuai di MaxCompute. |
MONEY | Tidak didukung |
|
|
| Tidak ada tipe yang sesuai di MaxCompute. |
OID | Tidak didukung |
|
|
| Tidak ada tipe yang sesuai di MaxCompute. |
UUID | Tidak didukung |
|
|
| Tidak ada tipe yang sesuai di MaxCompute. |
Buat tabel eksternal Hologres
Anda dapat membuat tabel eksternal Hologres dalam mode STS atau mode tanda tangan ganda.
Catatan
Spesifikasi pembuatan tabel eksternal
Jika Anda mengaktifkan fitur daftar putih alamat IP untuk Hologres, buat tabel eksternal Hologres dalam mode tanda tangan ganda. Jika dibuat dalam mode STS, akses dari MaxCompute ke Hologres akan diblokir oleh daftar putih alamat IP.
Anda dapat memetakan tabel induk maupun tabel anak di Hologres ke tabel eksternal MaxCompute dengan menentukan nama tabel dalam pernyataan CREATE EXTERNAL TABLE. Namun, tabel induk bersifat read-only.
Saat menulis data ke tabel eksternal Hologres, mekanisme INSERT ON CONFLICT (UPSERT) Hologres tidak didukung. Jika tabel sumber Hologres memiliki kunci primer, pastikan data yang ditulis tidak bertentangan dengan kunci primer tersebut.
Nama tabel dan nama bidang tidak peka huruf besar/kecil. Anda tidak dapat memaksa konversi huruf besar/kecil saat membuat atau mengkueri tabel dan bidang.
Kompatibilitas skema
Jika skema tabel sumber Hologres tidak konsisten dengan skema tabel eksternal:
Jumlah kolom tidak konsisten: Jika tabel sumber Hologres memiliki lebih sedikit kolom daripada DDL tabel eksternal, kesalahan akan dilaporkan saat membaca data dari Hologres, misalnya
column "xxx" does not exist. Jika tabel sumber memiliki lebih banyak kolom, kolom tambahan tersebut akan diabaikan.Tipe kolom tidak konsisten: MaxCompute tidak mendukung pemetaan tipe INT ke kolom STRING di tabel sumber Hologres. Anda dapat menggunakan tipe STRING untuk memetakan ke kolom INT, tetapi hal ini tidak disarankan.
Sintaks
Saat membuat tabel eksternal, Anda harus menentukan StorageHandler dalam pernyataan DDL CREATE EXTERNAL TABLE, serta mengonfigurasi informasi autentikasi STS (atau menggunakan mode tanda tangan ganda) dan titik akhir JDBC dari sumber data Hologres.
Buat tabel eksternal Hologres dalam mode STS
Untuk contoh kode, lihat Buat tabel eksternal Hologres (mode STS).
CREATE EXTERNAL TABLE [IF NOT EXISTS] <table_name>(
<col1_name> <data_type>,
<col2_name> <data_type>,
......
)
stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
WITH serdeproperties (
'odps.properties.rolearn'='<ram_arn>')
location '<jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/>'
tblproperties (
'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
'odps.federation.jdbc.target.db.type'='holo',
'odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...'
);Buat tabel eksternal Hologres dalam mode tanda tangan ganda
Untuk contoh kode, lihat Buat tabel eksternal Hologres (mode tanda tangan ganda).
Tabel eksternal Hologres dengan tanda tangan ganda memungkinkan pengguna RAM yang sama mengakses tabel yang diotorisasi di MaxCompute dan Hologres tanpa otorisasi manual. Mode ini juga mendukung fitur daftar putih alamat IP Hologres, yang menyederhanakan konfigurasi keamanan.
-- Aktifkan sakelar tanda tangan ganda.
SET odps.sql.common.table.planner.ext.hive.bridge=true;
-- Buat tabel eksternal.
CREATE EXTERNAL TABLE [IF NOT EXISTS] <table_name>(
<col1_name> <data_type>,
<col2_name> <data_type>,
......
)
STORED BY '<com.aliyun.odps.jdbc.JdbcStorageHandler>'
LOCATION '<jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/>'
tblproperties (
'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
'odps.federation.jdbc.target.db.type'='holo',
['odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...']
);Parameter
Parameter | Wajib | Deskripsi |
odps.sql.common.table.planner.ext.hive.bridge | Ya | Menentukan apakah akan membuat tabel eksternal Hologres dalam mode tanda tangan ganda. Tetapkan nilai ke |
Tidak | Anda tidak perlu menentukan parameter ini jika membuat tabel eksternal Hologres dalam mode STS. | |
IF NOT EXISTS | Tidak |
|
table_name | Ya | Nama tabel eksternal Hologres yang ingin Anda buat di MaxCompute. |
col_name | Ya | Nama kolom dalam tabel eksternal Hologres. |
data_type | Ya | Tipe data kolom dalam tabel eksternal Hologres. |
STORED BY | Ya | Menentukan StorageHandler, yang mendefinisikan cara mengkueri tabel eksternal Hologres. Nilainya tetap |
ram_arn | Ya | Diperlukan saat membuat tabel eksternal Hologres dalam mode STS. Menentukan ARN peran RAM untuk autentikasi STS saat membuat tabel eksternal.
|
Tidak | Anda tidak perlu menentukan parameter ini jika membuat tabel eksternal Hologres dalam mode tanda tangan ganda. | |
LOCATION | Ya | Titik akhir JDBC instans Hologres. Berisi parameter berikut:
|
tblproperties | Ya |
|
Contoh
Persiapkan data
Jika Anda sudah memiliki database Hologres, tabel Hologres, dan data uji, Anda dapat melewati langkah ini.
Buat database Hologres
Login ke Konsol Manajemen Hologres, lalu pilih wilayah di pojok kiri atas.
Di panel navigasi sebelah kiri, pilih Instances.
Jika belum memiliki instans, Anda harus terlebih dahulu membeli instans Hologres.
Di halaman Instances, klik nama instans yang dituju.
Di halaman detail instans, klik Connect To Instance.
Klik tab Metadata Management di atas.
Klik Create Database. Pada kotak dialog yang muncul, masukkan Database Name dan biarkan pengaturan parameter lainnya tetap pada nilai default.
Buat tabel Hologres
Di halaman detail instans, klik Connect To Instance.
Klik tab SQL Editor di atas.
Masukkan pernyataan berikut:
CREATE TABLE IF NOT EXISTS holo ( id INT PRIMARY KEY, name TEXT ); INSERT INTO holo (id, name) VALUES (1, 'kate'), (2, 'mary'), (3, 'bob'), (4, 'tom'), (5, 'lulu'), (6, 'mark'), (7, 'haward'), (8, 'lilei'), (9, 'hanmeimei'), (10, 'lily'), (11, 'lucy'); SELECT * FROM holo ORDER BY id;
Buat tabel eksternal Hologres (mode STS)
Prasyarat
Proyek MaxCompute tujuan tersedia untuk membuat tabel eksternal Hologres.
Untuk informasi tentang cara membuat proyek MaxCompute, lihat Buat proyek MaxCompute.
Buat dan berikan izin ke peran RAM
Hologres tidak mendukung penambahan peran RAM dari akun Alibaba Cloud yang berbeda ke instans database. Oleh karena itu, dalam mode STS, Hologres hanya mendukung otorisasi untuk peran RAM yang termasuk dalam akun yang sama.
Demikian pula, saat MaxCompute mengakses tabel eksternal atau skema eksternal Hologres, hanya peran RAM dari akun yang sama yang didukung.
Buat peran RAM
Buat peran RAM untuk mendapatkan ARN-nya. ARN digunakan untuk autentikasi STS saat membuat tabel eksternal. Pilih jenis entitas tepercaya untuk peran RAM sesuai kebutuhan. Dalam contoh ini, entitas tepercayanya adalah akun Alibaba Cloud.
Akun Alibaba Cloud: Pengguna RAM di bawah akun Alibaba Cloud dapat mengasumsikan peran RAM untuk mengakses sumber daya cloud. Untuk informasi selengkapnya, lihat Buat peran RAM untuk akun Alibaba Cloud tepercaya.
Penyedia identitas: Anda dapat mengatur single sign-on (SSO) untuk login ke Konsol Manajemen Alibaba Cloud dari sistem identitas lokal Anda. Ini berguna bagi perusahaan yang memerlukan autentikasi login pengguna terpadu. Untuk informasi selengkapnya, lihat Buat peran RAM untuk IdP tepercaya.
Lakukan langkah-langkah berikut:
Login ke Konsol Resource Access Management (RAM).
Di panel navigasi sebelah kiri, pilih .
Di halaman Roles, klik Create Role.
Di halaman Create Role, atur Principal Type ke Cloud Account.
Ubah kebijakan kepercayaan
Di halaman Roles, klik Role Name yang dituju untuk membuka halaman detailnya.
Di tab Trust Policy, klik Edit Trust Policy. Di halaman Edit Trust Policy, klik tab JSON.
Perbarui kebijakan kepercayaan dengan konten berikut.
Ubah kebijakan kepercayaan berdasarkan konten berikut. Konfigurasi kebijakan kepercayaan bervariasi tergantung pada jenis entitas tepercaya yang Anda pilih.
<UID>dalam kebijakan adalah ID akun Alibaba Cloud, yang dapat Anda temukan di halaman Informasi Pengguna.Jenis entitas tepercaya adalah akun Alibaba Cloud
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::<UID>:root" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "<UID>@odps.aliyuncs.com" ] } } ], "Version": "1" }Jenis entitas tepercaya adalah penyedia identitas
{ "Statement": [ { "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "saml:recipient": "https://signin.aliyun.com/saml-role/sso" } }, "Effect": "Allow", "Principal": { "Federated": [ "acs:ram::<UID>:saml-provider/IDP" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "<UID>@odps.aliyuncs.com" ] } } ], "Version": "1" }
Tambahkan peran RAM ke instans Hologres dan berikan izin
Peran RAM memerlukan izin developer pada instans Hologres. Secara default, peran RAM tidak dapat melihat atau mengoperasikan instans di konsol Hologres. Oleh karena itu, akun Alibaba Cloud harus memberikan izin yang diperlukan kepada peran RAM. Anda dapat menambahkan peran RAM ke instans Hologres dan memberikan izin menggunakan salah satu metode berikut:
Berikan izin di konsol Hologres
Login ke Konsol Manajemen Hologres, lalu pilih wilayah di pojok kiri atas.
Di panel navigasi sebelah kiri, pilih Instances.
Di halaman Instances, klik nama instans yang dituju.
Di halaman detail instans, klik Connect To Instance.
Klik tab Security Center di atas.
Di panel navigasi sebelah kiri, pilih User Management.
Di tab Database Authorization, berikan izin developer kepada peran RAM untuk instans tersebut.
Jika kebijakan akses database diatur ke Expert Mode, Anda perlu mengubah tipe peran menjadi SuperUser di halaman User Management. Setelah perubahan ini, Anda tidak perlu memberikan izin database secara terpisah.
Berikan izin di konsol RAM
Jika pengguna RAM mengasumsikan peran RAM, pengguna RAM tersebut tidak memiliki izin pada konsol Hologres secara default. Akun Alibaba Cloud harus memberikan izin AliyunRAMReadOnlyAccess kepada pengguna RAM di konsol RAM. Jika tidak, pengguna RAM tidak dapat melakukan operasi apa pun di konsol Hologres. Untuk informasi selengkapnya, lihat Berikan izin kepada pengguna RAM.
Login ke Konsol Resource Access Management (RAM).
Di panel navigasi sebelah kiri, pilih .
Di halaman Roles, di kolom Actions untuk Role Name yang dituju, klik Grant Permission.
Pilih kebijakan AliyunRAMReadOnlyAccess untuk memberikan izin kepada peran saat ini.
Berikan izin menggunakan pernyataan SQL
Untuk memberikan izin menggunakan pernyataan SQL, lihat model izin Hologres.
Buat tabel eksternal di MaxCompute
Login ke klien MaxCompute dan beralih ke proyek MaxCompute tujuan.
Jalankan perintah berikut untuk membuat tabel eksternal Hologres.
Informasi instans Hologres yang disiapkan dalam langkah Persiapkan data adalah sebagai berikut:
Nama database Hologres:
holo_external_test.Skema database Hologres:
public.Nama tabel Hologres:
holo.Titik akhir jaringan klasik database Hologres:
hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80.
CREATE EXTERNAL TABLE IF NOT EXISTS my_table_holo_jdbc ( id bigint, name string ) stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::139699392458****:role/<role name>') location 'jdbc:postgresql://hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute¤tSchema=public&useSSL=true&table=<table name>/' tblproperties ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo', 'odps.federation.jdbc.colmapping'='id:id,name:name' );Jalankan perintah berikut untuk mengkueri informasi tabel sumber Hologres menggunakan tabel eksternal Hologres yang baru dibuat.
-- Tambahkan properti berikut untuk mengakses tabel eksternal Hologres. SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; SET odps.table.api.enable.holo.table=true; -- Aktifkan mode baca langsung JDBC. -- Kueri data dari tabel eksternal Hologres. SELECT * FROM my_table_holo_jdbc limit 10; -- Hasil berikut dikembalikan. +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 8 | lilei | | 10 | lily | | 1 | kate | | 6 | mark | | 11 | lucy | +------------+------------+Lakukan pertukaran data dan analisis gabungan dengan Hologres menggunakan tabel eksternal Hologres.
Anda dapat menulis data yang diproses oleh MaxCompute ke Hologres menggunakan tabel eksternal untuk mempercepat analisis dan layanan online. Perintah contoh berikut menunjukkan contohnya.
-- Tambahkan properti berikut untuk mengakses tabel eksternal Hologres. SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; SET odps.table.api.enable.holo.table=true; -- Aktifkan mode baca langsung JDBC. -- Masukkan data ke tabel eksternal Hologres. INSERT INTO my_table_holo_jdbc VALUES (12,'alice'); -- Kueri data dari tabel eksternal Hologres. SELECT * FROM my_table_holo_jdbc; -- Hasil berikut dikembalikan. +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 12 | alice | | 8 | lilei | | 10 | lily | | 1 | kate | | 11 | lucy | | 6 | mark | | 3 | bob | +------------+------------+Anda dapat menyimpan tabel dimensi yang sering diperbarui di Hologres untuk memenuhi persyaratan pembaruan real-time. MaxCompute kemudian dapat mengakses tabel dimensi ini menggunakan tabel eksternal dan melakukan analisis asosiasi dengan tabel fakta yang disimpan di MaxCompute. Perintah contoh berikut menunjukkan contohnya.
-- Tambahkan properti berikut untuk mengakses tabel eksternal Hologres. SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; -- Buat tabel internal MaxCompute. CREATE TABLE holo_test AS SELECT * FROM my_table_holo_jdbc; -- Lakukan analisis asosiasi pada tabel internal MaxCompute dan tabel eksternal Hologres. SELECT * FROM my_table_holo_jdbc t1 INNER JOIN holo_test t2 ON t1.id=t2.id; -- Hasil berikut dikembalikan. +------------+------------+------------+------------+ | id | name | id2 | name2 | +------------+------------+------------+------------+ | 9 | hanmeimei | 9 | hanmeimei | | 4 | tom | 4 | tom | | 7 | haward | 7 | haward | | 2 | mary | 2 | mary | | 5 | lulu | 5 | lulu | | 12 | alice | 12 | alice | | 8 | lilei | 8 | lilei | | 10 | lily | 10 | lily | | 1 | kate | 1 | kate | | 11 | lucy | 11 | lucy | | 6 | mark | 6 | mark | | 3 | bob | 3 | bob | +------------+------------+------------+------------+
Buat tabel eksternal Hologres (mode tanda tangan ganda)
Tanda tangan ganda adalah protokol autentikasi dan otorisasi yang dikembangkan bersama oleh MaxCompute dan Hologres. Setelah informasi login ditandatangani di sisi MaxCompute, data autentikasi diteruskan ke sisi Hologres. Hologres melakukan autentikasi dan otorisasi berdasarkan protokol dasar yang disepakati dengan MaxCompute. Hal ini memungkinkan pengguna dengan nama akun yang sama di MaxCompute dan Hologres untuk mengakses tabel eksternal tanpa pengaturan autentikasi tambahan.
Prasyarat
Proyek MaxCompute tujuan tersedia untuk membuat tabel eksternal Hologres.
Untuk informasi tentang cara membuat proyek MaxCompute, lihat Buat proyek MaxCompute.
Akun dengan nama yang sama dengan akun MaxCompute ada di Hologres, dan akun ini memiliki izin baca dan tulis pada tabel yang sesuai di Hologres.
Hanya Hologres V1.3 dan versi yang lebih baru yang mendukung pembuatan tabel eksternal Hologres dalam mode tanda tangan ganda di MaxCompute. Saat ini, mode tanda tangan ganda hanya mendukung pembacaan data dari tabel eksternal Hologres, bukan penulisan data ke dalamnya.
Buat tabel eksternal di MaxCompute
Login ke klien MaxCompute dan beralih ke proyek MaxCompute tujuan.
Jalankan perintah berikut untuk membuat tabel eksternal Hologres.
Informasi instans Hologres yang disiapkan dalam langkah Persiapkan data adalah sebagai berikut:
Nama database Hologres:
holo_external_test.Skema database Hologres:
public.Nama tabel Hologres:
holo.Titik akhir jaringan klasik database Hologres:
hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80.
-- Buat tabel eksternal. CREATE EXTERNAL TABLE IF NOT EXISTS holo_mc_external_dbl ( id int, name string ) STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' location 'jdbc:postgresql://hgpostcn-cn-****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute¤tSchema=public&preferQueryMode=simple&useSSL=false&table=<table name>/' TBLPROPERTIES ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo', 'odps.federation.jdbc.colmapping'='id:id,name:name' );Kueri tabel eksternal.
-- Kueri tabel eksternal (harus dijalankan bersama perintah untuk mengaktifkan sakelar tanda tangan ganda). SET odps.sql.common.table.planner.ext.hive.bridge=true; SELECT * FROM holo_mc_external_dbl; -- Hasil berikut dikembalikan. +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 12 | alice | | 8 | lilei | | 10 | lily | | 1 | kate | | 11 | lucy | | 6 | mark | | 3 | bob | +------------+------------+
Aktifkan fitur baca langsung untuk tabel eksternal Hologres
MaxCompute membaca data dari tabel eksternal Hologres dalam mode JDBC. MaxCompute juga mendukung pembacaan langsung dari lapisan penyimpanan Hologres, yang memberikan manfaat berikut:
Mengurangi latensi pembacaan tabel secara signifikan dan meningkatkan kecepatan kueri data.
Mengurangi jumlah koneksi ke frontend (FE) Hologres secara drastis. Sebagian besar kueri hanya memerlukan satu koneksi.
Batasan
Saat mode baca langsung Hologres diaktifkan, batasan berikut berlaku. Jika kondisi tidak terpenuhi, sistem akan kembali ke mode JDBC.
Persyaratan versi
Instans Hologres harus V1.3.34 atau lebih baru. Versi sebelum V1.3.34 tidak mendukung fitur baca langsung.
Batasan jenis tabel
Membaca langsung tabel penyimpanan dingin Hologres tidak didukung.
Membaca langsung tabel berorientasi baris Hologres tidak didukung.
Batasan pemetaan tipe data
Saat MaxCompute menggunakan tipe Timestamp untuk memetakan tipe Timestamp With Time Zone di Hologres dalam mode baca langsung, kesalahan waktu kecil mungkin terjadi. Perbedaan spesifiknya adalah sebagai berikut:
Kesalahan nilai waktu
Jika waktu dalam kolom Timestamp With Time Zone di Hologres sebelum
1900-12-31 15:54:15, waktu yang dikueri oleh MaxCompute akan 5 menit 44 detik lebih awal.Jika waktu dalam kolom Timestamp With Time Zone di Hologres antara
1900-12-31 15:54:16dan1969-12-31 23:59:58, waktu yang dikueri oleh MaxCompute akan 1 detik lebih awal.Jika waktu dalam kolom Timestamp With Time Zone di Hologres setelah
1969-12-31 23:59:59, waktu yang dikueri oleh MaxCompute sama dengan waktu di Hologres.
Offset zona waktu
Jika zona waktu MaxCompute adalah UTC+8 dan waktu dalam kolom Timestamp With Time Zone di Hologres adalah
2000-01-01 00:00:00, waktu yang dikueri oleh MaxCompute adalah2000-01-01 08:00:00.Jika zona waktu MaxCompute adalah UTC+8 dan waktu dalam kolom Timestamp With Time Zone di Hologres adalah
1969-01-01 00:00:00, waktu yang dikueri oleh MaxCompute adalah1969-01-01 08:00:01.
Batasan wilayah yang sama
Karena batasan konektivitas jaringan, MaxCompute hanya dapat mengakses instans Hologres di wilayah yang sama. Akses lintas wilayah akan menghasilkan kesalahan:
FAILED: ODPS-0010000:System internal error - fuxi job failed, caused by: Pangu request failed with error code 3.Jika Hologres dikonfigurasi dengan arsitektur primer/sekunder, Anda hanya dapat mengonfigurasi URL koneksi instans primer. Instans sekunder tidak didukung.
Batasan tambahan untuk mode Foreign Server: Sakelar sintaks tingkat skema harus diaktifkan untuk proyek MaxCompute.
Cara mengaktifkan
Tambahkan parameter berikut sebelum pernyataan SQL saat Anda mengkueri tabel eksternal Hologres di MaxCompute.
SET odps.table.api.enable.holo.table=true;Tetapkan sakelar baca langsung tingkat proyek.
-- Sakelar baca langsung dan sakelar untuk menonaktifkan fallback ke JDBC keduanya dapat diatur pada tingkat proyek.
-- Aktifkan sakelar baca langsung pada tingkat proyek:
setproject odps.table.api.enable.holo.table=true; --true untuk mengaktifkan | false untuk menonaktifkan
-- Nonaktifkan sakelar fallback default ke JDBC:
setproject odps.table.api.allow.fallback.jdbc=false; --true untuk fallback | false untuk tidak fallbackVerifikasi baca langsung
Anda dapat memeriksa log di Logview untuk menentukan apakah kueri menggunakan mode baca langsung. Untuk informasi selengkapnya tentang penggunaan Logview, lihat Gunakan Logview 2.0 untuk melihat informasi eksekusi pekerjaan.
Di tab Summary Logview, temukan bidang external holo tables untuk melihat propertinya. Format properti adalah sebagai berikut:
<project_name>.<table_name>:<access_mode>[<(fallback_reason)>]Parameter:
Parameter | Deskripsi |
project_name | Nama proyek. |
table_name | Nama tabel. |
Access mode | Mode akses tabel eksternal. Nilai valid:
|
Fallback reason | Jika access mode adalah
|
Tugas yang berjalan dalam mode baca langsung mungkin kembali ke mode JDBC jika menghadapi batasan baca langsung. Jika beban bisnis tinggi, fallback ini dapat mengonsumsi banyak sumber daya kolam koneksi Hologres. Selain itu, efisiensi transfer data dalam mode JDBC jauh lebih rendah daripada mode baca langsung, dan sumber daya dilepaskan lebih lambat.
Perhatikan bahwa fallback ke mode JDBC dapat memberikan tekanan pada instans Hologres. Dalam kasus ekstrem, banyak pekerjaan fallback dapat memengaruhi layanan lain yang mengakses instans Hologres. Untuk mencegah hal ini, Anda dapat menonaktifkan fallback otomatis dengan menambahkan parameter eksekusi set odps.table.api.allow.fallback.jdbc=false; ke tugas baca langsung untuk menghindari dampak tak terduga.
Impor dan ekspor data Hologres
FAQ
Bagaimana cara mengatasi kesalahan ODPS-0130071 yang terjadi saat saya membaca data Hologres secara langsung dari MaxCompute?
Gejala
Saat membaca data Hologres secara langsung, kesalahan
ODPS-0130071 Failed to split to equal size...max count: 7777dilaporkan. Misalnya:ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777Penyebab
Saat MaxCompute membaca data secara langsung dari Hologres, kebijakan pemisahan Mapper default digunakan (volume data masukan / ukuran split 256 MB). Hal ini menyebabkan jumlah tugas Mapper yang dihasilkan oleh pekerjaan melebihi batas maksimum 7777.
CatatanBatasan ini mencegah pengguna mengirimkan pekerjaan yang menghasilkan banyak tugas Mapper, yang dapat memengaruhi stabilitas file Hologres atau koneksi jaringan.
Solusi
Anda dapat menyetel parameter berikut untuk mengatasi kesalahan.
SET odps.external.holo.mapper.instances=10000; -- Tingkatkan batas konkurensi. Nilai maksimum adalah 10000. SET odps.sql.mapper.split.size=512; -- Sesuaikan konkurensi tugas. Nilai maksimum adalah 512 MB.
Mengapa pekerjaan SQL lambat saat dijalankan pada tabel eksternal Hologres dan bagaimana cara memperbaikinya?
Kueri pada tabel eksternal MaxCompute lambat saat Anda menggunakan SDK.
Gejala
Pekerjaan SQL yang mengkueri tabel eksternal MaxCompute menggunakan SDK berjalan lambat.
Solusi
Tabel eksternal hanya mendukung pemindaian tabel penuh, yang lambat. Kami menyarankan Anda menggunakan tabel internal MaxCompute sebagai gantinya.
Bagaimana cara mengatasi kesalahan yang terjadi saat kata kunci digunakan sebagai nama kolom di Hologres?
Gejala
Jika kata kunci digunakan sebagai nama kolom di Hologres tanpa konfigurasi khusus, kesalahan berikut terjadi:
ODPS-0123131:User defined function exception - SQLException in nextKeyValueCaused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near ","Solusi
Tambahkan parameter
odps.federation.jdbc.colmappinguntuk memetakan bidang antara tabel sumber Hologres dan tabel eksternal Hologres.Sebagai contoh, jika tabel sumber Hologres berisi bidang kata kunci
"offset", Anda harus menambahkan parameter'odps.federation.jdbc.colmapping'='offset:"offset"'saat membuat tabel eksternal Hologres.
Referensi
Untuk jawaban atas pertanyaan umum tentang tabel eksternal Hologres, lihat Data lakehouse/FAQ tabel eksternal.

