All Products
Search
Document Center

Realtime Compute for Apache Flink:Object Storage Service

Last Updated:Sep 25, 2026

Realtime Compute for Apache Flink mendukung pembacaan dari dan penulisan ke Object Storage Service (OSS) menggunakan filesystem connector. OSS menyediakan ketahanan data sebesar 99,9999999999% (dua belas angka 9) dan ketersediaan sebesar 99,995%, menjadikannya penyimpanan yang andal untuk pipeline Flink skala besar.

Category Details
Jenis tabel yang didukung Tabel sumber dan tabel sink
Mode eksekusi Batch dan stream
Format data ORC, Parquet, Avro, CSV, JSON, dan raw
Metrik pemantauan khusus Tidak ada
Jenis API DataStream API dan SQL
Memperbarui atau menghapus data di tabel sink Hanya insert. Update dan delete tidak didukung.

Batasan

Umum:

  • Hanya Ververica Runtime (VVR) 11 dan versi setelahnya yang mendukung pembacaan file terkompresi (GZIP, BZIP2, XZ, DEFLATE) dari OSS. VVR 8 tidak dapat memproses file terkompresi dengan benar.

  • Versi VVR sebelum 8.0.6 hanya mendukung bucket OSS dalam akun yang sama. Untuk mengakses bucket lintas akun, gunakan VVR 8.0.6 atau versi setelahnya dan konfigurasikan otentikasi bucket. Untuk detailnya, lihat Konfigurasikan otentikasi bucket.

  • Pembacaan inkremental partisi baru tidak didukung.

  • Akses OSS lintas wilayah tidak didukung pada VVR 11.8 dan versi sebelumnya. Bucket OSS harus berada di wilayah yang sama dengan ruang kerja Flink. OSS connector dibangun di atas antarmuka Filesystem, yang hanya mendukung satu endpoint global. Mengakses bucket OSS di wilayah berbeda menyebabkan error ketidakcocokan endpoint.

  • Mulai dari VVR 11.9, Anda dapat mengakses bucket OSS yang berada di wilayah berbeda dari ruang kerja Flink Anda dengan mengonfigurasi parameter region-id dan endpoint tingkat bucket. Contoh berikut menunjukkan cara mengonfigurasi parameter tersebut:

    fs.oss.bucket.<bucket-name>.region-id: cn-shanghai
    fs.oss.bucket.<bucket-name>.endpoint: oss-cn-shanghai.aliyuncs.com

Hanya untuk tabel sink:

Format baris — Avro, CSV, JSON, dan raw — tidak didukung saat menulis ke OSS. Lihat FLINK-30635 untuk detailnya.

Sintaksis

CREATE TABLE OssTable (
  column_name1 INT,
  column_name2 STRING,
  ...
  datetime STRING,
  `hour` STRING
) PARTITIONED BY (datetime, `hour`) WITH (
  'connector' = 'filesystem',           -- wajib: harus 'filesystem'
  'path' = 'oss://<bucket>/path',       -- wajib: URI dari path OSS
  'format' = '...',                     -- wajib: orc, parquet, avro, csv, json, atau raw
  'partition.default-name' = '...',     -- opsional: nama partisi saat field partisi NULL atau kosong
  'source.monitor-interval' = '...',    -- opsional (hanya sumber): interval pemindaian file baru
  'auto-compaction' = '...'            -- opsional (hanya sink): aktifkan kompaksi otomatis setelah setiap checkpoint
);

Kolom metadata

Tabel sumber mendukung kolom metadata yang menampilkan informasi tingkat file untuk setiap baris. Definisikan kolom metadata dalam DDL Anda dengan menambahkan METADATA setelah tipe data:

CREATE TABLE MyUserTableWithFilepath (
  column_name1 INT,
  column_name2 STRING,
  `file.path` STRING NOT NULL METADATA
) WITH (
  'connector' = 'filesystem',
  'path' = 'oss://<bucket>/path',
  'format' = 'json'
)

Kolom metadata berikut tersedia:

Key Data type Description
file.path STRING NOT NULL Path lengkap file yang berisi baris tersebut.
file.name STRING NOT NULL Nama file (elemen terakhir dari path).
file.size BIGINT NOT NULL Ukuran file, dalam byte.
file.modification-time TIMESTAMP_LTZ(3) NOT NULL Waktu modifikasi terakhir file.

Parameter WITH

Parameter umum

Parameter Wajib Default Deskripsi
connector Ya — Harus filesystem.
path Ya — Path OSS dalam format URI, seperti oss://my_bucket/my_path. Untuk VVR 8.0.6 dan versi setelahnya, otentikasi bucket diperlukan setelah mengatur parameter ini. Lihat Konfigurasikan otentikasi bucket.
format Ya — Format file: csv, json, avro, parquet, orc, atau raw.

Parameter tabel sumber

Parameter Wajib Default Deskripsi
source.monitor-interval Tidak — Interval pemindaian file baru. Harus lebih besar dari 0. Jika tidak diatur, path dipindai sekali dan sumber bersifat bounded. Setiap file diidentifikasi berdasarkan path-nya dan diproses tepat satu kali. Path file yang telah diproses disimpan dalam state dan dipertahankan di seluruh checkpoint dan savepoint. Interval yang lebih pendek mempercepat penemuan file tetapi meningkatkan frekuensi pemindaian.

Parameter tabel sink

Parameter Wajib Default Deskripsi
partition.default-name Tidak _DEFAULT_PARTITION__ Nama partisi yang digunakan saat field partisi bernilai NULL atau string kosong.
sink.rolling-policy.file-size Tidak 128 MB Ukuran maksimum file bagian sebelum dilakukan rolling. Setiap subtask sink membuat minimal satu file bagian per partisi. Lihat Perilaku kebijakan rolling untuk mengetahui interaksinya dengan format file.
sink.rolling-policy.rollover-interval Tidak 30min Durasi maksimum file bagian dapat tetap terbuka sebelum dilakukan rolling. Frekuensi pemeriksaan dikendalikan oleh sink.rolling-policy.check-interval.
sink.rolling-policy.check-interval Tidak 1min Seberapa sering memeriksa apakah file bagian perlu di-rolling berdasarkan sink.rolling-policy.rollover-interval.
auto-compaction Tidak false Apakah akan mengaktifkan kompaksi otomatis. Data pertama-tama ditulis ke file sementara. Setelah setiap checkpoint, file sementara dari checkpoint tersebut digabung menjadi file yang lebih besar. File sementara tidak terlihat sebelum penggabungan. Saat diaktifkan: hanya file dalam satu checkpoint yang digabung (minimal satu file per checkpoint); latensi visibilitas data sama dengan interval checkpoint + durasi kompaksi; proses kompaksi yang lama dapat menyebabkan backpressure dan menunda checkpoint.
compaction.file-size Tidak 128 MB Ukuran target file untuk output hasil kompaksi. Nilai default-nya sama dengan sink.rolling-policy.file-size.
sink.partition-commit.trigger Tidak process-time Kapan partisi dikomit. Lihat Pemicu komit partisi.
sink.partition-commit.delay Tidak 0s Delay minimum sebelum mengkomit partisi. Atur ke 1 d untuk partisi harian, 1 h untuk partisi per jam.
sink.partition-commit.watermark-time-zone Tidak UTC Zona waktu untuk menguraikan watermark LONG menjadi TIMESTAMP untuk perbandingan komit partisi. Hanya berlaku saat sink.partition-commit.trigger adalah partition-time. Gunakan zona waktu sesi saat watermark didefinisikan pada kolom TIMESTAMP_LTZ (misalnya, Asia/Shanghai). Menerima nama zona waktu lengkap (seperti America/Los_Angeles) atau offset kustom (seperti GMT-08:00). Jika tidak dikonfigurasi dengan benar, komit partisi mungkin tertunda beberapa jam.
partition.time-extractor.kind Tidak default Cara mengekstraksi waktu dari field partisi. default: konfigurasikan pola atau formatter timestamp. custom: tentukan kelas extractor.
partition.time-extractor.class Tidak — Kelas yang mengimplementasikan antarmuka PartitionTimeExtractor. Wajib saat partition.time-extractor.kind adalah custom.
partition.time-extractor.timestamp-pattern Tidak — Pola untuk membangun timestamp dari field partisi. Secara default, field pertama diekstraksi menggunakan yyyy-MM-dd hh:mm:ss. Contoh: $dt (satu field), $year-$month-$day $hour:00:00 (multiple fields), $dt $hour:00:00 (dua field).
partition.time-extractor.timestamp-formatter Tidak yyyy-MM-dd HH:mm:ss Formatter untuk mengonversi string timestamp (seperti yang dinyatakan oleh partition.time-extractor.timestamp-pattern) menjadi timestamp. Misalnya, jika partition.time-extractor.timestamp-pattern adalah $year$month$day, atur ini ke yyyyMMdd. Kompatibel dengan DateTimeFormatter Java.
sink.partition-commit.policy.kind Tidak — Cara memberi tahu konsumen downstream bahwa partisi siap. success-file: menulis file _SUCCESS ke direktori partisi. custom: menggunakan kelas yang mengimplementasikan PartitionCommitPolicy. Beberapa kebijakan dapat digabungkan.
sink.partition-commit.policy.class Tidak — Kelas yang mengimplementasikan PartitionCommitPolicy. Wajib saat sink.partition-commit.policy.kind adalah custom.
sink.partition-commit.success-file.name Tidak _SUCCESS Nama file success yang ditulis oleh kebijakan komit success-file.
sink.parallelism Tidak — Paralelisme untuk operator penulisan file. Nilai default-nya mengikuti paralelisme operator upstream. Harus lebih besar dari 0. Saat auto-compaction diaktifkan, operator kompaksi juga menggunakan paralelisme ini.
sink.file-per-row.enabled Tidak false Apakah setiap catatan INSERT ditulis sebagai file terpisah. Konten dan path relatif setiap file ditentukan oleh 'sink.file-per-row.content-column' dan 'sink.file-per-row.path-column'. Parameter ini didukung mulai VVR 11.9.
sink.file-per-row.content-column Tidak — Saat 'sink.file-per-row.enabled' bernilai true, nama kolom BYTES yang byte-nya ditulis sebagai seluruh konten setiap file. Nilai kosong tidak didukung. Parameter ini didukung mulai VVR 11.9.
sink.file-per-row.path-column Tidak — Saat 'sink.file-per-row.enabled' bernilai true, nama kolom STRING yang nilainya digunakan sebagai path relatif setiap file. Path absolut, skema URI, segmen path kosong, '.', '..', garis miring terbalik, dan karakter NUL tidak diperbolehkan. Parameter ini didukung mulai VVR 11.9.

Perilaku kebijakan rolling

Perilaku rolling berbeda berdasarkan format file:

Untuk format kolom (Parquet, ORC, Avro), file bagian selalu di-rolling saat checkpoint, bahkan jika kriteria kebijakan rolling belum terpenuhi. Ukuran file dan interval rollover berlaku sebagai pemicu tambahan antar checkpoint.
Untuk format baris (CSV, JSON, raw), file bagian hanya di-rolling saat kriteria kebijakan rolling (sink.rolling-policy.file-size atau sink.rolling-policy.rollover-interval) terpenuhi. Jika Anda membutuhkan visibilitas file dengan latensi rendah, sesuaikan sink.rolling-policy.rollover-interval bersamaan dengan interval checkpoint Anda.
Format baris tidak didukung untuk tabel sink OSS karena FLINK-30635. Perilaku di atas berlaku jika dukungan format baris ditambahkan di versi mendatang.

Pemicu komit partisi

Dua jenis pemicu tersedia untuk sink.partition-commit.trigger:

  • `process-time` (default): Mengkomit partisi saat waktu sistem saat ini melebihi waktu pembuatan partisi ditambah sink.partition-commit.delay. Tidak memerlukan watermark atau extractor waktu partisi. Lebih umum tetapi kurang presisi — keterlambatan atau kegagalan data dapat menyebabkan komit prematur.

  • `partition-time`: Mengkomit partisi saat watermark melebihi waktu pembuatan partisi ditambah sink.partition-commit.delay. Memerlukan pembangkitan watermark dan partisi berbasis waktu (per jam, harian, dan sebagainya).

Konfigurasikan otentikasi bucket

Hanya VVR 8.0.6 dan versi setelahnya yang mendukung otentikasi bucket.

Setelah mengatur parameter path, konfigurasikan otentikasi bucket agar Flink dapat membaca dari dan menulis ke path OSS yang ditentukan. Tambahkan konfigurasi berikut ke bagian Additional Configurations pada tab Parameters halaman Deployment Details di Konsol pengembangan Realtime Compute:

fs.oss.bucket.<bucketName>.accessKeyId: <your-access-key-id>
fs.oss.bucket.<bucketName>.accessKeySecret: <your-access-key-secret>

Ganti <bucketName> dengan nama bucket yang digunakan dalam parameter path.

Item konfigurasi Deskripsi
fs.oss.bucket.<bucketName>.accessKeyId ID AccessKey untuk bucket. Gunakan AccessKey yang sudah ada atau buat yang baru. Lihat Buat AccessKey.
fs.oss.bucket.<bucketName>.accessKeySecret AccessKey Secret untuk bucket.
Penting

AccessKey Secret hanya ditampilkan sekali saat dibuat. Simpan dengan aman.

Menulis ke OSS-HDFS

Tambahkan konfigurasi berikut ke bagian Other Configuration pada tab Parameters halaman Deployment Details di Konsol pengembangan Realtime Compute:

fs.oss.jindo.buckets: <bucket-names>
fs.oss.jindo.accessKeyId: <your-access-key-id>
fs.oss.jindo.accessKeySecret: <your-access-key-secret>
Item konfigurasi Deskripsi
fs.oss.jindo.buckets Nama bucket OSS-HDFS, dipisahkan dengan titik koma. Saat Flink menulis ke path OSS, jika bucket yang sesuai tercantum di sini, data ditulis ke layanan OSS-HDFS.
fs.oss.jindo.accessKeyId ID AccessKey. Lihat Buat AccessKey.
fs.oss.jindo.accessKeySecret AccessKey Secret.
Penting

AccessKey Secret hanya ditampilkan sekali saat dibuat. Simpan dengan aman.

Konfigurasikan endpoint OSS-HDFS menggunakan salah satu metode berikut:

Konfigurasi parameter

Tambahkan endpoint ke Additional Configurations:

fs.oss.jindo.endpoint: <oss-hdfs-endpoint>

Konfigurasi path

Sisipkan endpoint langsung ke dalam path OSS:

oss://<bucket-name>.<oss-hdfs-endpoint>/<directory>

Saat menggunakan metode ini, fs.oss.jindo.buckets harus mencakup <bucket-name>.<oss-hdfs-endpoint>.

Sebagai contoh, jika nama bucket adalah jindo-test dan endpoint-nya adalah cn-beijing.oss-dls.aliyuncs.com:

# Path OSS
oss://jindo-test.cn-beijing.oss-dls.aliyuncs.com/<directory>

# Additional Configurations
fs.oss.jindo.buckets: jindo-test,jindo-test.cn-beijing.oss-dls.aliyuncs.com

Menulis ke Hadoop Distributed File System (HDFS) eksternal

Untuk path yang menggunakan skema hdfs://, tambahkan konfigurasi berikut untuk menentukan atau mengganti username akses:

containerized.taskmanager.env.HADOOP_USER_NAME: hdfs
containerized.master.env.HADOOP_USER_NAME: hdfs

Contoh

Baca dari OSS (tabel sumber)

CREATE TEMPORARY TABLE fs_table_source (
  `id` INT,
  `name` VARCHAR
) WITH (
  'connector' = 'filesystem',
  'path' = 'oss://<bucket>/path',
  'format' = 'parquet'
);

CREATE TEMPORARY TABLE blackhole_sink (
  `id` INT,
  `name` VARCHAR
) WITH (
  'connector' = 'blackhole'
);

INSERT INTO blackhole_sink SELECT * FROM fs_table_source;

Menulis ke OSS (tabel sink)

Menulis ke tabel partisi

Contoh ini melakukan streaming data dari sumber datagen, mempartisinya berdasarkan tanggal dan jam, serta mengkomit partisi menggunakan pemicu partition-time:

CREATE TABLE datagen_source (
  user_id STRING,
  order_amount DOUBLE,
  ts BIGINT,                                               -- Timestamp dalam milidetik
  ts_ltz AS TO_TIMESTAMP_LTZ(ts, 3),
  WATERMARK FOR ts_ltz AS ts_ltz - INTERVAL '5' SECOND    -- Watermark pada kolom TIMESTAMP_LTZ
) WITH (
  'connector' = 'datagen'
);

CREATE TEMPORARY TABLE fs_table_sink (
  user_id STRING,
  order_amount DOUBLE,
  dt STRING,
  `hour` STRING
) PARTITIONED BY (dt, `hour`) WITH (
  'connector' = 'filesystem',
  'path' = 'oss://<bucket>/path',
  'format' = 'parquet',
  'partition.time-extractor.timestamp-pattern' = '$dt $hour:00:00',
  'sink.partition-commit.delay' = '1 h',
  'sink.partition-commit.trigger' = 'partition-time',
  'sink.partition-commit.watermark-time-zone' = 'Asia/Shanghai',
  'sink.partition-commit.policy.kind' = 'success-file'
);

INSERT INTO fs_table_sink
SELECT
  user_id,
  order_amount,
  DATE_FORMAT(ts_ltz, 'yyyy-MM-dd'),
  DATE_FORMAT(ts_ltz, 'HH')
FROM datagen_source;

Menulis ke tabel non-partisi

CREATE TABLE datagen_source (
  user_id STRING,
  order_amount DOUBLE
) WITH (
  'connector' = 'datagen'
);

CREATE TEMPORARY TABLE fs_table_sink (
  user_id STRING,
  order_amount DOUBLE
) WITH (
  'connector' = 'filesystem',
  'path' = 'oss://<bucket>/path',
  'format' = 'parquet'
);

INSERT INTO fs_table_sink SELECT * FROM datagen_source;

DataStream API

Penting

Untuk menggunakan DataStream API, siapkan terlebih dahulu connector DataStream. Lihat Gunakan connector DataStream.

Contoh berikut menggunakan StreamingFileSink dengan OnCheckpointRollingPolicy untuk menulis ke OSS. File bagian di-rolling pada setiap checkpoint.

String outputPath = "oss://<bucket>/path";

final StreamingFileSink<Row> sink =
    StreamingFileSink.forRowFormat(
            new Path(outputPath),
            (Encoder<Row>) (element, stream) -> {
                out.println(element.toString());
            })
        .withRollingPolicy(OnCheckpointRollingPolicy.build())
        .build();

outputStream.addSink(sink);

Untuk menulis ke OSS-HDFS, konfigurasikan juga parameter OSS-HDFS di Additional Configurations. Lihat Menulis ke OSS-HDFS.

Langkah selanjutnya