All Products
Search
Document Center

Hologres:Impor Near Real-time Menggunakan Stage Penyimpanan Sementara

Last Updated:Mar 06, 2026

Hologres V4.1 dan versi yang lebih baru mendukung impor data near real-time menggunakan Stage penyimpanan sementara internal. Pendekatan ini menyeimbangkan throughput dan penggunaan resource sambil memberikan latensi tingkat menit. Topik ini mencakup kemampuan Stage, operasi manajemen—seperti create, delete, dan query—serta pola penggunaan—termasuk menulis ke Stage dan memuat data dari Stage ke tabel internal—dan pemetaan tipe data Arrow.

Ikhtisar

Hologres menyediakan dua mode impor data utama, masing-masing cocok untuk skenario bisnis yang berbeda:

  • Fixed Plan Real-time Streaming Write: Dirancang untuk beban kerja penulisan streaming dengan latensi end-to-end rendah—biasanya dalam milidetik—sehingga cocok untuk aplikasi yang memiliki persyaratan real-time ketat. Namun, mode ini menimbulkan overhead resource penulisan yang relatif tinggi.

  • Bulkload Offline Batch Import: Dioptimalkan untuk pemuatan data berskala besar dengan throughput tinggi, seperti sinkronisasi gudang data offline T+1. Mode ini memiliki latensi end-to-end tinggi sehingga hanya memenuhi kebutuhan bisnis offline.

Jika bisnis Anda memerlukan pemrosesan near real-time tingkat menit, impor batch offline tidak dapat memenuhi persyaratan ketepatan waktu tersebut. Meskipun penulisan streaming real-time mampu memenuhi kebutuhan tersebut, hal ini menimbulkan overhead resource penulisan yang signifikan. Mulai Hologres V4.1, impor data near real-time diimplementasikan menggunakan Stage penyimpanan sementara internal. Pendekatan ini secara efektif menyeimbangkan ketepatan waktu dan efisiensi resource.

Pengenalan Tahap

Stage adalah lapisan penyimpanan sementara internal berkinerja tinggi milik Hologres. Atribut utamanya meliputi hal-hal berikut:

  • Hosting internal: Dikelola secara otomatis oleh Hologres tanpa memerlukan konfigurasi atau operasi penyimpanan eksternal.

  • Cache terstruktur: Mengorganisasi data sesuai skema tabel target untuk memastikan konsistensi tipe dan format.

  • Keamanan transaksi: Mendukung semantik ACID guna menjamin keandalan dan konsistensi selama penulisan.

  • Komit gabungan otomatis: Konektor seperti Spark secara otomatis menulis data dari penyimpanan sementara ke penyimpanan utama dalam batch yang dioptimalkan, sehingga meningkatkan efisiensi.

Implementasikan impor near real-time menggunakan Stage melalui alur berikut:

  • Tulis data eksternal ke Stage.

  • Kelompokkan data yang disimpan di Stage, lalu tulis ke Tabel internal.

  • Data yang ditulis ke tabel internal langsung tersedia untuk kueri.

Keunggulan Tahap

  • Menyeimbangkan latensi dan throughput: Data dapat dikueri dalam hitungan menit setelah ingestion—jauh lebih cepat daripada impor batch offline—dan mendukung kapasitas throughput yang jauh lebih tinggi dibandingkan penulisan streaming real-time.

  • Menyederhanakan tautan data: Tulis data langsung ke Stage internal Hologres tanpa ketergantungan pada sistem eksternal. Integrasi didukung melalui sintaksis SQL COPY dan INSERT standar serta konektor resmi.

  • Meningkatkan efisiensi resource: Stage secara otomatis menggabungkan file kecil untuk meningkatkan performa baca-tulis selanjutnya. Stage juga mendukung Serverless Computing dan virtual warehouse independen guna mengisolasi resource penulisan Stage, sehingga meningkatkan stabilitas sistem.

  • Mendukung berbagai skenario: Penulisan near real-time ke Stage didukung oleh Spark Connector, Flink Connector, dan Holo Client.

Syarat

Impor near real-time ke Hologres melalui Stage hanya mendukung format Arrow. Untuk pemetaan tipe data antara format Arrow dan Hologres, lihat pemetaan tipe data.

Izin

  1. SPM atau SLPM:

    • Create Stage: Anda harus memiliki izin writer atau lebih tinggi, atau menjadi Superuser.

    • Write, delete, atau read Stage: Anda harus merupakan pembuat Stage terkait dan memiliki izin writer atau lebih tinggi, atau menjadi Superuser.

  2. Model Otorisasi PostgreSQL Standar:

    • Create Stage: Anda harus memiliki izin role pg_operate_internal_stages, atau menjadi Superuser.

    • Write, delete, atau read Stage: Anda harus merupakan pembuat Stage terkait dan memiliki izin role pg_operate_internal_stages, atau menjadi Superuser.

Berikan izin role pg_operate_internal_stages kepada pengguna dengan perintah berikut:

-- Berikan izin operasi Stage kepada pengguna yang ditentukan
-- Ganti variabel: <user_name> dengan username sebenarnya (misalnya nama sub-akun RAM)
GRANT pg_operate_internal_stages TO "<user_name>";

Manage Stage

Create Stage

Sintaksis perintah:

-- Buat Internal Stage
-- Ganti variabel:
--   <internal_stage_name>: Nama Stage, wajib, maksimal 128 karakter
--   <group_name>: Nama grup, opsional, default-nya internal_stage_name
--   <ttl_in_seconds>: TTL (detik), opsional, default-nya 7200, maksimal 864000
CALL HOLOGRES.HG_CREATE_INTERNAL_STAGE(
  '<internal_stage_name>', 
  ['<group_name>'],
  ['<ttl_in_seconds>']
);

Deskripsi parameter:

Nama Parameter

Wajib

Deskripsi

internal_stage_name

Wajib

Nama Internal Stage. Mendukung huruf (case-sensitive), angka, garis bawah, dan tanda hubung. Panjang maksimum 128 karakter.

group_name

Opsional

Grup tempat Stage berada, digunakan untuk klasifikasi data. Default-nya internal_stage_name.

ttl_in_seconds

Opsional

TTL Stage, dalam detik. Diukur sejak last_modified_time (dapat dilihat dari tabel sistem hologres.hg_internal_stages). Default-nya 7200 (2 jam), maksimal 864000 (10 hari). Sistem membersihkannya secara asinkron setelah siklus hidupnya berakhir.

Delete Stage

Sintaksis perintah:

-- Hapus Internal Stage yang ditentukan
-- Ganti variabel: <internal_stage_name> dengan nama Stage yang akan dihapus
CALL HOLOGRES.HG_DROP_INTERNAL_STAGE(
    '<internal_stage_name>'
);

internal_stage_name: Wajib. Nama Internal Stage.

Query Stage Status

Kueri status Stage menggunakan tampilan sistem hologres.hg_internal_stages:

-- Kueri semua Stage atau filter berdasarkan nama
-- Ganti variabel: Jika <internal_stage_name> diganti dengan nama Stage, hanya Stage tersebut yang dikueri; hapus WHERE untuk mengkueri semua.
SELECT * FROM hologres.hg_internal_stages 
[WHERE stage_name = '<internal_stage_name>'];

Tampilan tersebut mencakup bidang-bidang berikut:

Nama Bidang

Makna

stage_name

Nama Stage

group_name

Grup Stage

ttl_in_seconds

TTL Stage (detik)

create_time

Waktu pembuatan Stage

create_user

Pengguna yang membuat Stage

create_application_name

Buat aplikasi untuk Stage

create_session_id

ID sesi yang membuat Stage

last_modified_time

Waktu terakhir Stage dimodifikasi

stage_bytes

Ukuran penyimpanan Stage (Byte)

file_count

Jumlah file Stage

Query Stage Files

Kueri file Stage menggunakan tampilan sistem hologres.hg_internal_stage_files:

-- Kueri daftar file di bawah Stage, dapat difilter berdasarkan pencocokan kabur pada nama
-- Ganti variabel: <internal_stage_name> adalah nama Stage; <pattern%> adalah pencocokan kabur untuk nama file (misalnya 'batch_%')
SELECT * FROM hologres.hg_internal_stage_files 
[WHERE stage_name = '<internal_stage_name>'] 
  [AND file_name like '<pattern%>'];

Tampilan tersebut mencakup bidang-bidang berikut:

Nama Bidang

Makna

stage_name

Nama Stage

file_name

Nama file

file_size

Ukuran penyimpanan file (Byte)

last_modified_time

Waktu terakhir file dimodifikasi

is_complete

Apakah file berhasil ditulis? True berarti penulisan berhasil. False berarti sedang ditulis atau penulisan gagal.

Delete Stage Files

Hapus file Stage menggunakan fungsi sistem hologres.hg_remove_internal_stage_file:

-- Hapus file yang ditentukan
-- Ganti variabel: <stage_name> adalah nama Stage; <file_name> adalah nama file yang akan dihapus
SELECT hologres.hg_remove_internal_stage_file ('<stage_name>', '<file_name>');

-- Hapus file Stage secara batch
-- Ganti variabel: <stage_name> adalah nama Stage; <glob_pattern> adalah wildcard nama file (misalnya '*.arrow'); <pattern%> adalah pencocokan kabur untuk nama file di WHERE
SELECT
    stage_name,
    file_name,
    hologres.hg_remove_internal_stage_file (stage_name, file_name) AS hg_remove_internal_stage_file
FROM
    hologres.hg_list_internal_stage_files ('<stage_name>',['<glob_pattern>']) 
[WHERE file_name like '<pattern%>'];

Use Stage

Client Write to Stage

Sintaksis perintah:

-- Tulis aliran data klien ke file yang ditentukan di Stage
-- Ganti variabel: <internal_stage_name> adalah nama Stage yang telah dibuat; <file_name> adalah nama file yang akan ditulis (mendukung huruf, angka, garis bawah, tanda hubung, titik, maksimal 128 karakter)
COPY EXTERNAL_FILES(
  path = 'internal_stage://<internal_stage_name>/<file_name>'
) FROM STDIN;

Saat menulis ke Stage menggunakan perintah COPY, Anda tidak dapat mengonfigurasi parameter WITH. Sebagai gantinya, definisikan path file Stage menggunakan parameter path. Karakter yang valid meliputi huruf (case-sensitive), angka, garis bawah, tanda hubung, dan titik, dengan panjang maksimum 128 karakter.

Read from Stage and Write to Internal Tables

Sintaksis perintah:

-- Baca file Arrow dari Stage dan tulis ke tabel internal
-- Ganti variabel:
--   <table_name>: Nama tabel internal target
--   <col_name>: Nama kolom (opsional, berkorespondensi satu-satu dengan kolom tabel target jika ditentukan)
--   <internal_stage_name>: Nama Stage. Tentukan beberapa nama yang dipisahkan koma untuk membaca dari beberapa Stage.
--   <col_type>: Tipe kolom (opsional, gunakan hanya saat menentukan tipe kolom di klausa AS)
INSERT INTO <table_name> [ ( <col_name> [ , <col_name> ... ] ) ]
SELECT *
FROM EXTERNAL_FILES(
  path = 'internal_stage://<internal_stage_name>, internal_stage://<internal_stage_name>',
  format = arrow
)
[AS ( <col_name> <col_type>[ , <col_name> <col_type> ... ] )];

Membaca dari Stage hanya mendukung file format Arrow.

Usage Examples

Write to Stage Using Holo-client

Contoh ini menunjukkan cara melakukan penulisan near real-time ke Stage menggunakan Holo-client.

Dependensi Maven:

<dependency>
  <groupId>com.alibaba.hologres</groupId>
  <artifactId>holo-client</artifactId>
  <version>2.7.0</version>
</dependency>

Kode contoh:

import com.alibaba.hologres.client.HoloClient;
import com.alibaba.hologres.client.HoloConfig;
import com.alibaba.hologres.client.Put;
import com.alibaba.hologres.client.copy.CopyUtil;
import com.alibaba.hologres.client.copy.in.CopyInStageWrapper;
import com.alibaba.hologres.client.copy.in.arrow.RecordArrowWriter;
import com.alibaba.hologres.client.model.OnConflictAction;
import com.alibaba.hologres.client.model.TableSchema;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CopyStageDemo {

    public static void main(String[] args) throws Exception {
        // Catatan: jdbcUrl harus menggunakan protokol jdbc:hologres
        String jdbcUrl = "jdbc:hologres://host:port/db";
        String username = "";
        String password = "";

        /*
        CREATE TABLE copy_stage_demo (id INT NOT NULL, name TEXT NOT NULL, address TEXT, PRIMARY KEY(id));
        */
        String tableName = "copy_stage_demo";

        HoloConfig config = new HoloConfig();
        config.setJdbcUrl(jdbcUrl);
        config.setUsername(username);
        config.setPassword(password);
        config.setRegion("local");

        // Buat nama Stage sementara
        String stageName = "temp_stage_" + System.currentTimeMillis();

        try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
             HoloClient client = new HoloClient(config)) {

            // Buat Internal Stage
            String createStageSql =
                    "call hologres.hg_create_internal_stage('"
                            + stageName
                            + "', 'default_group', 7200);";
            try (java.sql.Statement stmt = conn.createStatement()) {
                stmt.execute(createStageSql);
            }

            // Dapatkan skema tabel
            TableSchema schema = client.getTableSchema(tableName);

            // Definisikan kolom yang akan ditulis
            List<String> columns = new ArrayList<>();
            columns.add("id");
            columns.add("name");
            columns.add("address");

            // Gunakan RecordArrowWriter dan CopyInStageWrapper untuk menulis data ke Stage
            try (RecordArrowWriter arrowWriter =
                         new RecordArrowWriter(
                                 schema,
                                 columns,
                                 8192 // maxBatchSize, 1024 baris data membentuk satu Arrow RecordBatch
                         );
                 CopyInStageWrapper<com.alibaba.hologres.client.model.Record> copyInStage =
                         new CopyInStageWrapper<>(
                                 config,
                                 stageName,
                                 "data_file", // Awalan nama file
                                 arrowWriter,
                                 64 * 1024 * 1024 // fileSizeLimit, ukuran tiap file 64 MB
                         )) {

                // Tulis 10 catatan
                for (int i = 0; i < 10; ++i) {
                    Put put = new Put(schema);
                    // Sesuaikan dengan kolom di CopyInStageWrapper
                    put.setObject("id", i);
                    put.setObject("name", "name" + i);
                    put.setObject("address", "address" + i);

                    copyInStage.putRecord(put.getRecord());
                }
                // Panggil close sebelum program berakhir untuk memastikan data sepenuhnya ditulis
                // Demo ini menggunakan try-with-resources, tidak perlu menutup secara manual
                // copyInStage.close();
            }

            // Hasilkan pernyataan INSERT untuk menulis dari Stage ke tabel target
            String insertSql =
                    CopyUtil.buildInsertTableSelectFromStageSql(
                            schema,
                            columns,
                            Collections.singletonList(stageName),
                            OnConflictAction.INSERT_OR_UPDATE);

            try (java.sql.Statement stmt = conn.createStatement()) {
                stmt.execute(insertSql);
            }
            // Verifikasi hasil penulisan
            try (java.sql.Statement stmt = conn.createStatement()) {
                try (java.sql.ResultSet rs = stmt.executeQuery("select * from " + tableName)) {
                    while (rs.next()) {
                        System.out.println(
                                "id: "
                                        + rs.getInt(1)
                                        + ", name: "
                                        + rs.getString(2)
                                        + ", address: "
                                        + rs.getString(3));
                    }
                }
            }
        } finally {
            // Bersihkan Stage sementara. Jika tidak dibersihkan, akan dibersihkan otomatis berdasarkan TTL.
            try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
                 java.sql.Statement stmt = conn.createStatement()) {
                String dropStageSql = "call hologres.hg_drop_internal_stage('" + stageName + "');";
                stmt.execute(dropStageSql);
            } catch (Exception e) {
                System.err.println("Error membersihkan Stage: " + e.getMessage());
            }
        }
    }
}

Data Type Mapping

Selama impor near real-time melalui Stage, pemetaan tipe data antara format Arrow dan Hologres adalah sebagai berikut. Holo-client secara otomatis mengonversi tipe data selama penulisan.

Tipe Data Hologres

Tipe Data Arrow

SMALLINT

SMALLINT

INT

INT

BIGINT

BIGINT

BOOLEAN

UINT8、BIT

REAL(FLOAT4)

FLOAT4

DOUBLE PRECISION(FLOAT8)

FLOAT8

DATE

DateDay

TIMETZ

FixedSizeBinary

TIME

TimeMicro

TIMESTAMP WITHOUT TIME ZONE

TimeStampMicro

TIMESTAMP WITH TIME ZONE

DateMilli

TEXT

VarChar

CHAR(n)

VARCHAR(n)

JSON

JSONB

BYTEA

VarBINARY

roaringbitmap

NUMERIC(m,n)

DECIMAL(m,n)

ARRAY (mendukung INT, BIGINT, FLOAT, BOOLEAN, DOUBLE, STRING)

ARRAY<type>