Realtime Compute for Apache Flink prend en charge la lecture et l'écriture dans le service Object Storage Service (OSS) via le connecteur filesystem. OSS offre une durabilité des données de 99,9999999999 % (douze 9) et une disponibilité de 99 995 %, ce qui en fait un stockage fiable pour les pipelines Flink à grande échelle.
| Catégorie | Détails |
|---|---|
| Types de table pris en charge | Tables source et puits |
| Modes d'exécution | Batch et streaming |
| Formats de données | ORC, Parquet, Avro, CSV, JSON et raw |
| Métriques de surveillance spécifiques | Aucune |
| Types d'API | DataStream API et SQL |
| Mise à jour ou suppression des données dans les tables puits | Insertion uniquement. La mise à jour et la suppression ne sont pas prises en charge. |
Limitations
Général :
Seules les versions Ververica Runtime (VVR) 11 et ultérieures prennent en charge la lecture de fichiers compressés (GZIP, BZIP2, XZ, DEFLATE) depuis OSS. VVR 8 ne peut pas traiter correctement les fichiers compressés.
Les versions de VVR antérieures à la 8.0.6 ne prennent en charge que les buckets OSS situés dans le même compte. Pour accéder à des buckets appartenant à d'autres comptes, utilisez VVR 8.0.6 ou une version ultérieure et configurez l'authentification du bucket. Pour plus de détails, consultez la section Configure bucket authentication.
La lecture incrémentielle des nouvelles partitions n'est pas prise en charge.
L'accès interrégional à OSS n'est pas pris en charge dans VVR 11.8 et les versions antérieures. Le bucket OSS doit se trouver dans la même région que l'espace de travail Flink. Le connecteur OSS s'appuie sur l'interface Filesystem, qui ne prend en charge qu'un seul endpoint global. L'accès à un bucket OSS situé dans une autre région entraîne une erreur de non-correspondance d'endpoint.
-
À partir de VVR 11.9, vous pouvez accéder à un bucket OSS situé dans une région différente de celle de votre espace de travail Flink en configurant les paramètres region-id et endpoint au niveau du bucket. L'exemple suivant montre comment configurer ces paramètres :
fs.oss.bucket.<bucket-name>.region-id: cn-shanghai fs.oss.bucket.<bucket-name>.endpoint: oss-cn-shanghai.aliyuncs.com
Tables puits uniquement :
Les formats de ligne Avro, CSV, JSON et raw ne sont pas pris en charge lors de l'écriture dans OSS. Consultez la page FLINK-30635 pour plus de détails.
Syntaxe
CREATE TABLE OssTable (
column_name1 INT,
column_name2 STRING,
...
datetime STRING,
`hour` STRING
) PARTITIONED BY (datetime, `hour`) WITH (
'connector' = 'filesystem', -- required: must be 'filesystem'
'path' = 'oss://<bucket>/path', -- required: URI of the OSS path
'format' = '...', -- required: orc, parquet, avro, csv, json, or raw
'partition.default-name' = '...', -- optional: partition name when partition field is NULL or empty
'source.monitor-interval' = '...', -- optional (source only): interval to scan for new files
'auto-compaction' = '...' -- optional (sink only): enable automatic compaction after each checkpoint
);
Colonnes de métadonnées
Les tables source prennent en charge les colonnes de métadonnées qui exposent des informations au niveau du fichier pour chaque ligne. Définissez une colonne de métadonnées dans votre DDL en ajoutant METADATA après le type de données :
CREATE TABLE MyUserTableWithFilepath (
column_name1 INT,
column_name2 STRING,
`file.path` STRING NOT NULL METADATA
) WITH (
'connector' = 'filesystem',
'path' = 'oss://<bucket>/path',
'format' = 'json'
)
Les colonnes de métadonnées suivantes sont disponibles :
| Clé | Type de données | Description |
|---|---|---|
file.path |
STRING NOT NULL | Chemin complet du fichier contenant la ligne. |
file.name |
STRING NOT NULL | Nom du fichier (dernier élément du chemin). |
file.size |
BIGINT NOT NULL | Taille du fichier, en octets. |
file.modification-time |
TIMESTAMP_LTZ(3) NOT NULL | Dernière heure de modification du fichier. |
Paramètres WITH
Paramètres généraux
| Paramètre | Obligatoire | Par défaut | Description |
|---|---|---|---|
connector |
Oui | — | Doit être filesystem. |
path |
Oui | — | Chemin OSS au format URI, par exemple oss://my_bucket/my_path. Pour VVR 8.0.6 et les versions ultérieures, l'authentification du bucket est requise après la définition de ce paramètre. Consultez la section Configure bucket authentication. |
format |
Oui | — | Format de fichier : csv, json, avro, parquet, orc ou raw. |
Paramètres de la table source
| Paramètre | Obligatoire | Par défaut | Description |
|---|---|---|---|
source.monitor-interval |
Non | — | Intervalle de recherche de nouveaux fichiers. Doit être supérieur à 0. Si ce paramètre n'est pas défini, le chemin est analysé une seule fois et la source est bornée. Chaque fichier est identifié par son chemin et traité exactement une fois. Les chemins des fichiers traités sont stockés dans l'état et conservés lors des checkpoints et des savepoints. Un intervalle plus court accélère la découverte des fichiers, mais augmente la fréquence d'analyse. |
Paramètres de la table puits
| Paramètre | Obligatoire | Par défaut | Description |
|---|---|---|---|
partition.default-name |
Non | _DEFAULT_PARTITION__ |
Nom de partition utilisé lorsqu'un champ de partition est NULL ou une chaîne vide. |
sink.rolling-policy.file-size |
Non | 128 Mo | Taille maximale du fichier partiel avant rotation (rolling). Chaque sous-tâche puits crée au moins un fichier partiel par partition. Consultez la section Comportement de la politique de rotation pour comprendre l'interaction avec les formats de fichier. |
sink.rolling-policy.rollover-interval |
Non | 30 min | Durée maximale pendant laquelle un fichier partiel peut rester ouvert avant rotation. La fréquence de vérification est contrôlée par sink.rolling-policy.check-interval. |
sink.rolling-policy.check-interval |
Non | 1 min | Fréquence de vérification pour déterminer si un fichier partiel doit subir une rotation en fonction de sink.rolling-policy.rollover-interval. |
auto-compaction |
Non | false | Indique si la compaction automatique est activée. Les données sont d'abord écrites dans des fichiers temporaires. Après chaque checkpoint, les fichiers temporaires de ce checkpoint sont fusionnés en fichiers plus volumineux. Les fichiers temporaires ne sont pas visibles avant la fusion. Lorsque cette option est activée : seuls les fichiers d'un même checkpoint sont fusionnés (au moins un fichier par checkpoint) ; la latence de visibilité des données équivaut à checkpoint interval + compaction duration ; les opérations de compaction longues peuvent provoquer une contre-pression et retarder les checkpoints. |
compaction.file-size |
Non | 128 Mo | Taille cible des fichiers compactés en sortie. La valeur par défaut est identique à celle de sink.rolling-policy.file-size. |
sink.partition-commit.trigger |
Non | process-time |
Moment du commit d'une partition. Consultez la section Déclencheurs de commit de partition. |
sink.partition-commit.delay |
Non | 0s |
Délai minimal avant le commit d'une partition. Définissez cette valeur sur 1 d pour les partitions quotidiennes et sur 1 h pour les partitions horaires. |
sink.partition-commit.watermark-time-zone |
Non | UTC |
Fuseau horaire utilisé pour analyser un watermark LONG en TIMESTAMP afin de comparer les commits de partition. S'applique uniquement lorsque sink.partition-commit.trigger est défini sur partition-time. Utilisez le fuseau horaire de la session lorsque le watermark est défini sur une colonne TIMESTAMP_LTZ (par exemple, Asia/Shanghai). Accepte les noms complets de fuseaux horaires (tels que America/Los_Angeles) ou les décalages personnalisés (tels que GMT-08:00). Une configuration incorrecte peut retarder les commits de partition de plusieurs heures. |
partition.time-extractor.kind |
Non | default |
Méthode d'extraction de l'heure à partir des champs de partition. default : configurez un modèle ou un formateur d'horodatage. custom : spécifiez une classe d'extracteur. |
partition.time-extractor.class |
Non | — | Classe implémentant l'interface PartitionTimeExtractor . Obligatoire lorsque partition.time-extractor.kind est défini sur custom. |
partition.time-extractor.timestamp-pattern |
Non | — | Modèle permettant de construire un horodatage à partir des champs de partition. Par défaut, le premier champ est extrait en utilisant yyyy-MM-dd hh:mm:ss. Exemples : $dt (champ unique), $year-$month-$day $hour:00:00 (champs multiples), $dt $hour:00:00 (deux champs). |
partition.time-extractor.timestamp-formatter |
Non | yyyy-MM-dd HH:mm:ss |
Formateur permettant de convertir la chaîne d'horodatage (telle qu'exprimée par partition.time-extractor.timestamp-pattern) en horodatage. Par exemple, si partition.time-extractor.timestamp-pattern est défini sur $year$month$day, définissez ce paramètre sur yyyyMMdd. Compatible avec DateTimeFormatter de Java. |
sink.partition-commit.policy.kind |
Non | — | Méthode de notification aux consommateurs en aval indiquant qu'une partition est prête. success-file : écrit un fichier _SUCCESS dans le répertoire de la partition. custom : utilise une classe implémentant PartitionCommitPolicy . Plusieurs politiques peuvent être combinées. |
sink.partition-commit.policy.class |
Non | — | Classe implémentant PartitionCommitPolicy . Obligatoire lorsque sink.partition-commit.policy.kind est défini sur custom. |
sink.partition-commit.success-file.name |
Non | _SUCCESS |
Nom du fichier de succès écrit par la politique de commit success-file . |
sink.parallelism |
Non | — | Parallélisme de l'opérateur d'écriture de fichiers. La valeur par défaut correspond au parallélisme de l'opérateur en amont. Doit être supérieur à 0. Lorsque auto-compaction est activé, l'opérateur de compaction utilise également ce parallélisme. |
sink.file-per-row.enabled |
Non | false |
Indique si chaque enregistrement INSERT doit être écrit dans un fichier distinct. Le contenu et le chemin relatif de chaque fichier sont spécifiés par 'sink.file-per-row.content-column' et 'sink.file-per-row.path-column'. Ce paramètre est pris en charge à partir de VVR 11.9. |
sink.file-per-row.content-column |
Non | — | Lorsque 'sink.file-per-row.enabled' est défini sur true, nom de la colonne BYTES dont les octets sont écrits comme contenu entier de chaque fichier. Les valeurs vides ne sont pas prises en charge. Ce paramètre est pris en charge à partir de VVR 11.9. |
sink.file-per-row.path-column |
Non | — | Lorsque 'sink.file-per-row.enabled' est défini sur true, nom de la colonne STRING dont la valeur est utilisée comme chemin relatif de chaque fichier. Les chemins absolus, les schémas URI, les segments de chemin vides, '.' , '..' , les barres obliques inverses et les caractères NUL ne sont pas autorisés. Ce paramètre est pris en charge à partir de VVR 11.9. |
Comportement de la politique de rotation
Le comportement de rotation varie selon le format de fichier :
Pour les formats columnaires (Parquet, ORC, Avro), un fichier partiel subit toujours une rotation au moment du checkpoint, même si les critères de la politique de rotation ne sont pas remplis. La taille du fichier et l'intervalle de rotation s'appliquent comme déclencheurs supplémentaires entre les checkpoints.
Pour les formats de ligne (CSV, JSON, raw), un fichier partiel subit une rotation uniquement lorsque les critères de la politique de rotation (sink.rolling-policy.file-sizeousink.rolling-policy.rollover-interval) sont remplis. Si vous avez besoin d'une faible latence de visibilité des fichiers, ajustezsink.rolling-policy.rollover-intervalconjointement avec votre intervalle de checkpoint.
Les formats de ligne ne sont pas pris en charge pour les tables puits OSS en raison de FLINK-30635 . Le comportement décrit ci-dessus s'appliquera si la prise en charge des formats de ligne est ajoutée dans une version future.
Déclencheurs de commit de partition
Deux types de déclencheurs sont disponibles pour sink.partition-commit.trigger :
process-time(par défaut) : Valide une partition lorsque l'heure système actuelle dépasse l'heure de création de la partition plussink.partition-commit.delay. Ne nécessite ni watermark ni extracteur de temps de partition. Plus général, mais moins précis : les retards de données ou les pannes peuvent entraîner des validations prématurées.partition-time: Valide une partition lorsque le watermark dépasse l'heure de création de la partition plussink.partition-commit.delay. Nécessite la génération de watermarks et des partitions basées sur le temps (horaire, quotidien, etc.).
Configure bucket authentication
Seules les versions VVR 8.0.6 et ultérieures prennent en charge l'authentification du bucket.
Après avoir défini le paramètre path , configurez l'authentification du bucket afin que Flink puisse lire et écrire dans le chemin OSS spécifié. Ajoutez les éléments suivants à la section Additional Configurations de l'onglet Parameters de la page Deployment Details dans la console de développement Realtime Compute :
fs.oss.bucket.<bucketName>.accessKeyId: <your-access-key-id>
fs.oss.bucket.<bucketName>.accessKeySecret: <your-access-key-secret>
Remplacez <bucketName> par le nom du bucket utilisé dans le paramètre path .
| Élément de configuration | Description |
|---|---|
fs.oss.bucket.<bucketName>.accessKeyId |
AccessKey ID pour le bucket. Utilisez un AccessKey existant ou créez-en un. Consultez la section Create an AccessKey. |
fs.oss.bucket.<bucketName>.accessKeySecret |
AccessKey Secret pour le bucket. |
L'AccessKey Secret n'est affiché qu'une seule fois lors de sa création. Conservez-le en toute sécurité.
Write to OSS-HDFS
Ajoutez la configuration suivante à la section Other Configuration de l'onglet Parameters de la page Deployment Details dans la console de développement Realtime Compute :
fs.oss.jindo.buckets: <bucket-names>
fs.oss.jindo.accessKeyId: <your-access-key-id>
fs.oss.jindo.accessKeySecret: <your-access-key-secret>
| Élément de configuration | Description |
|---|---|
fs.oss.jindo.buckets |
Noms des buckets OSS-HDFS, séparés par des points-virgules. Lorsque Flink écrit dans un chemin OSS, si le bucket correspondant figure dans cette liste, les données sont écrites dans le service OSS-HDFS. |
fs.oss.jindo.accessKeyId |
AccessKey ID. Consultez la section Create an AccessKey. |
fs.oss.jindo.accessKeySecret |
AccessKey Secret. |
L'AccessKey Secret n'est affiché qu'une seule fois lors de sa création. Conservez-le en toute sécurité.
Configurez l'endpoint OSS-HDFS en utilisant l'une des méthodes suivantes :
Parameter configuration
Ajoutez l'endpoint à la section Additional Configurations :
fs.oss.jindo.endpoint: <oss-hdfs-endpoint>
Path configuration
Intégrez l'endpoint directement dans le chemin OSS :
oss://<bucket-name>.<oss-hdfs-endpoint>/<directory>
Lorsque vous utilisez cette méthode, fs.oss.jindo.buckets doit inclure <bucket-name>.<oss-hdfs-endpoint> .
Par exemple, si le nom du bucket est jindo-test et que l'endpoint est cn-beijing.oss-dls.aliyuncs.com :
# OSS path
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
Écriture dans un Hadoop Distributed File System (HDFS) externe
Pour les chemins utilisant le schéma hdfs:// , ajoutez les éléments suivants pour spécifier ou changer le nom d'utilisateur d'accès :
containerized.taskmanager.env.HADOOP_USER_NAME: hdfs
containerized.master.env.HADOOP_USER_NAME: hdfs
Exemples
Lire depuis OSS (table source)
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;
Écrire dans OSS (table puits)
Écrire dans une table partitionnée
Cet exemple diffuse des données depuis une source datagen , les partitionne par date et heure, et valide les partitions en utilisant le déclencheur partition-time :
CREATE TABLE datagen_source (
user_id STRING,
order_amount DOUBLE,
ts BIGINT, -- Timestamp in milliseconds
ts_ltz AS TO_TIMESTAMP_LTZ(ts, 3),
WATERMARK FOR ts_ltz AS ts_ltz - INTERVAL '5' SECOND -- Watermark on TIMESTAMP_LTZ column
) 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;
Écrire dans une table non partitionnée
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
Pour utiliser la DataStream API, configurez d'abord le connecteur DataStream. Consultez la section Use a DataStream connector.
L'exemple suivant utilise StreamingFileSink avec OnCheckpointRollingPolicy pour écrire dans OSS. Les fichiers partiels subissent une rotation à chaque 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);
Pour écrire dans OSS-HDFS, configurez également les paramètres OSS-HDFS dans la section Additional Configurations . Consultez la section Write to OSS-HDFS.