Découvrez comment utiliser le connecteur Log Service (SLS).
Contexte
Simple Log Service est un service de bout en bout dédié aux données de journal. Il vous aide à collecter, consommer, acheminer, interroger et analyser efficacement les données de journal. Cela améliore l'efficacité des opérations et de la maintenance (O&M) et vous permet de traiter des volumes massifs de données de journal.
Le tableau suivant répertorie les fonctionnalités du connecteur SLS.
|
Catégorie |
Description |
|
Types pris en charge |
Table source et table de destination |
|
Mode d'exécution |
Mode streaming uniquement |
|
Métriques spécifiques au connecteur |
S/O |
|
Format des données |
S/O |
|
Type d'API |
SQL, DataStream API et API YAML d'ingestion de données |
|
Mise à jour ou suppression des données dans la table de destination |
Les tables de destination sont en ajout seul ; vous ne pouvez pas mettre à jour ni supprimer les données. |
Fonctionnalités
Le connecteur source SLS lit directement les champs d'attribut de message. Le tableau suivant répertorie les champs pris en charge.
|
Paramètre |
Type |
Description |
|
__source__ |
STRING METADATA VIRTUAL |
Source du message. |
|
__topic__ |
STRING METADATA VIRTUAL |
Rubrique du message. |
|
__timestamp__ |
BIGINT METADATA VIRTUAL |
Heure du journal. |
|
__tag__ |
MAP<VARCHAR, VARCHAR> METADATA VIRTUAL |
Tag du message. Par exemple, pour l'attribut |
Prérequis
Assurez-vous d'avoir créé un projet Log Service et un Logstore. Pour plus d'informations, consultez la rubrique Créer un projet et un Logstore.
Limites
Seuls Ververica Runtime (VVR) 11.1 et les versions ultérieures prennent en charge l'utilisation de SLS comme source synchrone pour l'ingestion de données définie en YAML.
Le connecteur SLS garantit uniquement la sémantique « au moins une fois » (at-least-once).
Ne définissez pas le paramètre
source parallelismsur une valeur supérieure au nombre de shards, car cela gaspille des ressources. De plus, pour Ververica Runtime (VVR) 8.0.5 et les versions antérieures, une modification du nombre de shards peut entraîner l'échec de la fonctionnalité automatique defailover, empêchant la consommation de certains shards.
SQL
Syntaxe
CREATE TABLE sls_table(
a INT,
b INT,
c VARCHAR
) WITH (
'connector' = 'sls',
'endPoint' = '<yourEndPoint>',
'project' = '<yourProjectName>',
'logStore' = '<yourLogStoreName>',
'accessId' = '${secret_values.ak_id}',
'accessKey' = '${secret_values.ak_secret}'
);
Avec options
-
Général
Paramètre
Description
Type
Obligatoire
Valeur par défaut
Remarques
connector
Le connecteur à utiliser.
String
Oui
Aucun
Définissez ce paramètre sur
sls.endPoint
L'endpoint de Log Service (SLS).
String
Oui
Aucun
Spécifiez l'adresse d'accès VPC de Log Service (SLS). Pour plus d'informations, consultez la rubrique Endpoints de service.
Remarque-
Par défaut, Realtime Compute for Apache Flink ne peut pas accéder à Internet. Pour activer l'accès à Internet depuis votre Virtual Private Cloud (VPC), utilisez une passerelle NAT. Pour plus d'informations, consultez la rubrique Comment accéder à Internet ?.
-
Nous vous déconseillons d'accéder à SLS via Internet. Si cela est indispensable, utilisez HTTPS et activez l'accélération du transfert. Pour plus d'informations, consultez la rubrique Gérer l'accélération du transfert.
project
Le nom du projet SLS.
String
Oui
Aucun
S/O
logStore
Le nom du Logstore ou du MetricStore.
String
Oui
Aucun
Les données d'un Logstore sont consommées de la même manière que celles d'un MetricStore.
accessId
L'AccessKey ID de votre compte Alibaba Cloud.
String
Oui
Aucun
Pour plus d'informations, consultez la rubrique Obtenir une paire de clés AccessKey.
ImportantPour éviter l'exposition de votre paire de clés AccessKey, nous vous recommandons d'utiliser des variables pour spécifier l'AccessKey ID et l'AccessKey secret. Pour plus d'informations, consultez la rubrique Variables de projet.
accessKey
L'AccessKey secret de votre compte Alibaba Cloud.
String
Oui
Aucun
akless.assume-role.role-name
Le nom du rôle RAM utilisé pour accéder à SLS.
String
Non
Aucun
Si les paramètres accessId et accessKey ne sont pas spécifiés, vous devez définir ce paramètre pour accéder aux ressources SLS à l'aide d'un rôle RAM.
Le rôle RAM doit être référencé au préalable sous
Access Security/RAM Roles.RemarqueCe paramètre est pris en charge uniquement dans les versions VVR 11.9.0 et ultérieures.
-
-
Spécifique à la source
Paramètre
Description
Type
Obligatoire
Valeur par défaut
Remarques
enableNewSource
Indique s'il faut utiliser la nouvelle source de données qui implémente l'interface FLIP-27.
Boolean
Non
false
La nouvelle source peut s'adapter automatiquement aux modifications des shards et répartir ces derniers de manière aussi équitable que possible entre toutes les sous-tâches de la source.
Important-
Cette option est prise en charge uniquement dans les versions VVR 8.0.9 et ultérieures. La valeur par défaut est
truepour les versions VVR 11.1 et ultérieures. -
Si vous modifiez la valeur de cette option, vous ne pouvez pas restaurer les tâches à partir d'un état enregistré. Pour reprendre la consommation à partir d'un offset historique, commencez par démarrer la tâche avec l'option
consumerGroupafin d'enregistrer la progression de la consommation dans le groupe de consommateurs SLS. Ensuite, définissez l'optionconsumeFromCheckpointsurtrueet redémarrez la tâche sans état. -
Si un Logstore contient des shards en lecture seule, certaines sous-tâches peuvent continuer à demander des données provenant d'autres shards après avoir terminé leur propre traitement. Cela peut entraîner un déséquilibre de la charge de travail, affectant ainsi les performances. Pour atténuer ce problème, vous pouvez ajuster le parallélisme, optimiser la stratégie de planification ou fusionner les petits shards afin de réduire leur nombre et de simplifier l'allocation des tâches.
shardDiscoveryIntervalMs
L'intervalle pour la découverte dynamique des shards.
Long
Non
60000
Définissez cette option sur une valeur négative pour désactiver la découverte dynamique. Unité : millisecondes.
Remarque-
La valeur doit être supérieure ou égale à 60 000 millisecondes (1 minute).
-
Cette option prend effet uniquement lorsque
enableNewSourceest défini surtrue. -
Cette option est prise en charge uniquement dans les versions VVR 8.0.9 et ultérieures.
startupMode
Le mode de démarrage pour la table source.
String
Non
timestamp
-
timestamp(par défaut) : Consomme les journaux à partir de l'heure de début spécifiée. -
latest: Commence à consommer les journaux à partir du dernier offset. -
earliest: Commence à consommer les journaux à partir du premier offset. -
consumer_group: Commence la consommation des journaux à partir de l'offset enregistré par le groupe de consommateurs. Si le groupe de consommateurs n'a enregistré aucun offset de consommation pour un shard, la consommation commence à partir du premier offset.
Important-
Pour les versions VVR antérieures à 11,1, la valeur consumer_group n'est pas prise en charge. Vous devez définir
consumeFromCheckpointsurtrue. Dans ce cas, la consommation des journaux commence à partir de l'offset enregistré par le groupe de consommateurs spécifié, et le paramètre de mode de démarrage ne prend pas effet.
startTime
L'heure de début de la consommation des journaux.
String
Non
Heure actuelle
Le format est
yyyy-MM-dd hh:mm:ss.Cela prend effet uniquement lorsque
startupModeest défini surtimestamp.RemarqueLes options
startTimeetstopTimesont basées sur l'attribut__receive_time__dans SLS, plutôt que sur l'attribut__timestamp__.stopTime
L'heure de fin de la consommation des journaux.
String
Non
Aucun
Le format est
yyyy-MM-dd hh:mm:ss.Remarque-
Cette option est utilisée uniquement pour la consommation de journaux historiques et doit être définie sur une heure passée. Si vous la définissez sur une heure future, la consommation risque de s'arrêter prématurément si aucun nouveau journal n'est écrit, ce qui entraîne une interruption du flux de données sans message d'erreur.
-
Si vous souhaitez que la tâche Flink se termine après la consommation de tous les journaux, vous devez également définir
exitAfterFinishsurtrue.
consumerGroup
Le nom du groupe de consommateurs.
String
Non
Aucun
Un groupe de consommateurs sert à enregistrer la progression de la consommation. Vous pouvez spécifier un nom personnalisé sans format fixe.
RemarqueDifférentes tâches Flink doivent utiliser des groupes de consommateurs distincts. Si plusieurs tâches Flink utilisent le même groupe de consommateurs, elles ne se coordonnent pas et chaque tâche consomme toutes les données. En effet, Flink n'utilise pas le groupe de consommateurs SLS pour l'attribution des partitions lors de la consommation des données depuis SLS. Par conséquent, chaque consommateur traite les messages indépendamment, même s'ils partagent le même groupe de consommateurs.
consumeFromCheckpoint
Indique s'il faut consommer à partir d'un point de contrôle du groupe de consommateurs.
String
Non
false
-
true: Vous devez également spécifier un groupe de consommateurs. Le programme Flink commence à consommer les journaux à partir du point de contrôle enregistré dans le groupe de consommateurs. Si le groupe de consommateurs ne dispose pas de point de contrôle correspondant, la consommation commence à partir de la valeur configurée pour startTime. -
false(valeur par défaut) : Ne commence pas à consommer les journaux à partir du point de contrôle enregistré pour le groupe de consommateurs spécifié.
ImportantCe paramètre n'est plus pris en charge dans les versions VVR 11.1 et ultérieures. Pour ces versions, vous devez définir l'option
startupModesurconsumer_group.maxRetries
Le nombre de tentatives après un échec de lecture depuis SLS.
String
Non
3
S/O
batchGetSize
Le nombre de groupes de journaux à lire en une seule requête.
String
Non
100
Le paramètre
batchGetSizene peut pas dépasser 1 000, sinon une erreur est signalée.exitAfterFinish
Indique si la tâche Flink se termine après la consommation de toutes les données.
String
Non
false
-
true: Le programme Flink se termine après la consommation de toutes les données. -
false(par défaut) : Le programme Flink ne se termine pas après la consommation des données.
query
ImportantCette option a été dépréciée dans la version VVR 11.3, mais les versions ultérieures restent compatibles.
L'instruction de requête pour le prétraitement des données avant la consommation.
String
Non
Aucun
Utilisez cette option pour filtrer les données SLS avant leur consommation par Flink. Cela permet de réduire les coûts et d'améliorer la vitesse de traitement.
Par exemple,
'query' = '*| where request_method = ''GET'''indique qu'avant que Flink ne lise les données depuis SLS, il filtre d'abord les données dont la valeur du champrequest_methodest « GET ».RemarqueCette option utilise le langage SPL de Log Service (SLS). Pour plus d'informations, consultez la rubrique Syntaxe SPL.
Important-
Cette option est prise en charge uniquement dans les versions VVR 8.0.1 et ultérieures.
-
Cette fonctionnalité engendre des frais Log Service (SLS). Pour plus d'informations, consultez la rubrique Facturation de Log Service.
processor
Le nom du processeur SLS pour le prétraitement des données. Si les paramètres
queryetprocessorsont tous deux spécifiés,queryest prioritaire etprocessorest ignoré.String
Non
Aucun
Cette option filtre les données SLS avant leur consommation par Flink, ce qui réduit les coûts et améliore la vitesse de traitement. Nous vous recommandons d'utiliser
processorplutôt quequery.Par exemple,
'processor' = 'test-filter-processor'indique que le processeur SLS filtre les données avant que Flink ne les lise depuis SLS.RemarqueCette option utilise le langage SPL de Log Service (SLS). Pour plus d'informations, consultez la rubrique Syntaxe SPL. Pour savoir comment créer ou mettre à jour un processeur SLS, consultez la rubrique Gérer les processeurs.
ImportantCette option est prise en charge uniquement dans les versions VVR 11.3 et ultérieures.
Cette fonctionnalité engendre des frais Log Service (SLS). Pour plus d'informations, consultez la rubrique Facturation de Log Service.
preserveRawBytes
Indique s'il faut récupérer et conserver directement les octets bruts transportés par SLS lorsque
enableNewSourceest défini surtrue.Boolean
Non
false
Lorsque cette option est activée, les champs BINARY/VARBINARY lisent directement le tableau d'octets brut (byte[]), tandis que les champs CHAR/VARCHAR construisent les données de chaîne à partir des octets bruts. Les autres champs utilisent toujours la logique de conversion par défaut. Le comportement est cohérent avec celui de l'ancienne source.
Remarque-
Cette option est prise en charge uniquement dans les versions VVR 11.8 et ultérieures.
-
Cette option prend effet uniquement lorsque
enableNewSourceest défini surtrue.
-
-
Spécifique au sink
Paramètre
Description
Type
Obligatoire
Valeur par défaut
Remarques
topicField
Spécifie un champ dont la valeur remplace l'attribut
__topic__, qui indique le sujet du journal.String
Non
Aucun
La valeur de cette option doit correspondre à un champ existant dans la table.
timeField
Spécifie un champ dont la valeur remplace l'attribut
__timestamp__, qui indique l'heure d'écriture du journal.String
Non
Heure actuelle
La valeur de cette option doit correspondre à un champ
INTexistant dans la table. Si cette option n'est pas spécifiée, l'heure actuelle est utilisée.sourceField
Spécifie un champ dont la valeur remplace l'attribut
__source__, qui indique la source du journal, telle que l'adresse IP de la machine ayant généré le journal.String
Non
Aucun
La valeur de cette option doit correspondre à un champ existant dans la table.
partitionField
Spécifie un champ pour le partitionnement. Un hachage de la valeur de ce champ détermine le shard qui reçoit les données, garantissant que les enregistrements ayant le même hachage sont dirigés vers le même shard.
String
Non
Aucun
Si cette option n'est pas spécifiée, chaque enregistrement est écrit aléatoirement dans un shard disponible.
buckets
Si
partitionFieldest spécifié, cette option définit le nombre de buckets pour le mappage des valeurs de hachage.String
Non
64
La valeur doit être une puissance de 2 comprise dans l'intervalle [1, 256]. Le nombre de buckets doit être supérieur ou égal au nombre de shards. Sinon, certains shards risquent de ne recevoir aucune donnée.
flushIntervalMs
L'intervalle d'écriture des données.
String
Non
2000
Unité : millisecondes.
writeNullProperties
Indique s'il faut écrire les valeurs nulles sous forme de chaînes vides dans SLS.
Boolean
Non
true
-
true(valeur par défaut) : Écrit les valeurs nulles dans le journal sous forme de chaînes vides. -
false: Les champs évalués comme nuls ne sont pas écrits dans le journal.
RemarqueCette option est prise en charge uniquement dans les versions VVR 8.0.6 et ultérieures.
-
Correspondances de types
|
Type Flink |
Type SLS |
|
BOOLEAN |
STRING |
|
VARBINARY |
|
|
VARCHAR |
|
|
TINYINT |
|
|
INTEGER |
|
|
BIGINT |
|
|
FLOAT |
|
|
DOUBLE |
|
|
DECIMAL |
Ingestion de données (bêta)
Limites
Cette fonctionnalité est prise en charge uniquement par les versions 11.1 et ultérieures de Realtime Compute for Apache Flink.
Syntaxe
source:
type: sls
name: SLS Source
endpoint: <endpoint>
project: <project>
logstore: <logstore>
accessId: <accessId>
accessKey: <accessKey>
Paramètres
|
Paramètre |
Description |
Type |
Obligatoire |
Valeur par défaut |
Remarques |
||||||||||
|
type |
Le type de la source de données. |
String |
Oui |
Aucune |
La valeur doit être |
||||||||||
|
endpoint |
L'endpoint de Log Service (SLS). |
String |
Oui |
Aucune |
L'adresse d'accès VPC de Log Service (SLS). Pour plus d'informations, consultez Endpoints de service. Remarque
|
||||||||||
|
accessId |
L'AccessKey ID de votre compte Alibaba Cloud. |
String |
Oui |
Aucune |
Pour plus d'informations, consultez Comment consulter l'AccessKey ID et l'AccessKey secret ?. Important
Pour éviter toute exposition de vos informations AccessKey, nous vous recommandons d'utiliser une variable de projet pour spécifier la valeur de l'AccessKey. Pour plus d'informations, consultez Variables de projet. |
||||||||||
|
accessKey |
L'AccessKey secret de votre compte Alibaba Cloud. |
String |
Oui |
Aucune |
|||||||||||
|
project |
Le nom du projet Log Service (SLS). |
String |
Oui |
Aucune |
Aucune |
||||||||||
|
logStore |
Le nom du Logstore ou du Metricstore SLS. |
String |
Oui |
Aucune |
Les données d'un Logstore sont consommées de la même manière que celles d'un Metricstore. |
||||||||||
|
schema.inference.strategy |
La stratégie d'inférence de schéma. |
String |
Non |
continuous |
|
||||||||||
|
maxPreFetchLogGroups |
Le nombre maximal de groupes de journaux à lire depuis chaque shard pour l'inférence initiale du schéma. |
Integer |
Non |
50 |
Avant que le job ne lise et ne traite les données, le connecteur pré-consomme un nombre spécifié de groupes de journaux depuis chaque shard pour initialiser les informations de schéma. |
||||||||||
|
shardDiscoveryIntervalMs |
L'intervalle, en millisecondes, pour la découverte dynamique des modifications de shard. |
Long |
Non |
60000 |
Définissez ce paramètre sur une valeur négative pour désactiver la découverte dynamique. Remarque
La valeur doit être supérieure ou égale à 60 000 millisecondes (1 minute). |
||||||||||
|
startupMode |
Le mode de démarrage. |
String |
Non |
Aucune |
|
||||||||||
|
startTime |
L'heure de début de la consommation des journaux. |
String |
Non |
Heure actuelle |
Le format est Ce paramètre prend effet uniquement lorsque Remarque
Les paramètres |
||||||||||
|
stopTime |
L'heure de fin de la consommation des journaux. |
String |
Non |
Aucune |
Le format est Remarque
Si vous souhaitez que le job Flink se termine après la consommation de tous les journaux, vous devez également définir |
||||||||||
|
consumerGroup |
Le nom du groupe de consommateurs. |
String |
Non |
Aucune |
Un groupe de consommateurs enregistre la progression de la consommation. Vous pouvez spécifier n'importe quel nom personnalisé. |
||||||||||
|
batchGetSize |
Le nombre de groupes de journaux à lire par requête. |
Integer |
Non |
100 |
La valeur de batchGetSize ne peut pas dépasser 1 000. Dans le cas contraire, une erreur se produit. |
||||||||||
|
maxRetries |
Le nombre de tentatives en cas d'échec de la lecture depuis Log Service (SLS). |
Integer |
Non |
3 |
Aucune |
||||||||||
|
exitAfterFinish |
Indique si le job Flink se termine après la consommation de toutes les données. |
Boolean |
Non |
false |
|
||||||||||
|
query |
L'instruction de prétraitement pour la consommation des données depuis Log Service (SLS). |
String |
Non |
Aucune |
Utilisez ce paramètre pour filtrer les données dans Log Service (SLS) avant la consommation afin de réduire les coûts et d'améliorer la vitesse de traitement. Par exemple, Remarque
La requête doit utiliser la syntaxe SPL de Log Service. Pour plus d'informations, consultez Syntaxe SPL. Important
|
||||||||||
|
compressType |
Le type de compression pour Log Service (SLS). |
String |
Non |
Aucune |
Les types de compression pris en charge incluent :
|
||||||||||
|
timeZone |
Le fuseau horaire pour |
String |
Non |
Aucune |
Par défaut, aucun décalage n'est ajouté. |
||||||||||
|
regionId |
La région où Log Service (SLS) est déployé. |
String |
Non |
Aucune |
Pour plus d'informations, consultez Régions prises en charge. |
||||||||||
|
signVersion |
La version de signature de requête pour Log Service (SLS). |
String |
Non |
Aucune |
Pour plus d'informations, consultez Signatures de requête. |
||||||||||
|
shardModDivisor |
Le diviseur utilisé lors de la lecture depuis les shards du Logstore. |
Int |
Non |
-1 |
Pour plus d'informations, consultez Shards. |
||||||||||
|
shardModRemainder |
Le reste utilisé lors de la lecture depuis les shards du Logstore. |
Int |
Non |
-1 |
Pour plus d'informations, consultez Shards. |
||||||||||
|
metadata.list |
Les colonnes de métadonnées à transmettre aux jobs en aval. |
String |
Non |
Aucune |
Les champs de métadonnées disponibles incluent |
||||||||||
|
decode.table-id.fields |
Spécifie les champs dont les valeurs sont utilisées pour générer un ID de table lors de l'analyse des données de journal depuis Log Service (SLS). |
String |
Non |
Aucune |
Plusieurs champs sont séparés par une virgule anglaise
Remarque
Ce paramètre est pris en charge dans les versions 11.6 et ultérieures de Realtime Compute for Apache Flink. |
||||||||||
|
fixed-types |
Spécifie les types de données pour des champs spécifiques lors de l'analyse des données de journal depuis Log Service (SLS). |
String |
Non |
Aucune |
Lors de l'analyse des données, spécifiez les types pour des champs spécifiques. Utilisez une virgule Remarque
Ce paramètre est pris en charge dans les versions 11.6 et ultérieures de Realtime Compute for Apache Flink. |
||||||||||
|
timestamp-format.standard |
Le format des champs d'horodatage dans les données de journal de Log Service (SLS). |
String |
Non |
SQL |
Valeurs valides :
Remarque
Ce paramètre est pris en charge dans les versions 11.6 et ultérieures de Realtime Compute for Apache Flink. |
||||||||||
|
ingestion.ignore-errors |
Indique s'il faut ignorer les erreurs survenant lors de l'analyse des données. |
Boolean |
Non |
false |
Remarque
Ce paramètre est pris en charge dans les versions 11.6 et ultérieures de Realtime Compute for Apache Flink. |
||||||||||
|
ingestion.error-tolerance.max-count |
Si |
Integer |
Non |
-1 |
Ce paramètre prend effet uniquement lorsque Remarque
Ce paramètre est pris en charge dans les versions 11.6 et ultérieures de Realtime Compute for Apache Flink. |
Réutilisation d'un catalogue existant
À partir de la version 11.5 de Realtime Compute for Apache Flink, vous pouvez référencer un catalogue SLS intégré créé sur la page Data Management dans les tâches d'ingestion de données Flink CDC. Cette approche évite de devoir spécifier manuellement les propriétés de connexion.
source:
type: sls
using.built-in-catalog: sls_catalog
Actuellement, les tâches d'ingestion de données peuvent réutiliser automatiquement les paramètres suivants issus du catalogue SLS intégré :
endpoint
project
accessId
accessKey
Pour remplacer ces paramètres réutilisés automatiquement, définissez-les explicitement dans la configuration YAML. Les paramètres définis dans le fichier YAML sont prioritaires.
Correspondance des types de données
Si fixed-types n'est pas configuré, la correspondance des types de données suivante s'applique :
|
Type SLS |
Type CDC |
|
STRING |
STRING |
Si fixed-types est configuré, le système analyse les données en utilisant les types spécifiés.
Inférence et évolution du schéma
-
Pré-consommation des données des shards et initialisation du schéma
Le connecteur SLS conserve le schéma du Logstore à partir duquel il lit les données. Avant de lire les données du Logstore, le connecteur pré-consomme jusqu'à
maxPreFetchLogGroupsgroupes de journaux depuis chaque shard. Il analyse le schéma de chaque entrée de journal et les fusionne pour initialiser le schéma de la table. Un événement de création de table est ensuite généré sur la base de ce schéma initial avant le début de la consommation des données.RemarquePour chaque shard, le connecteur tente de consommer les données à partir d'une heure avant l'heure actuelle afin d'analyser le schéma des journaux.
-
Informations sur la clé primaire
Les journaux Log Service (SLS) ne contiennent pas d'informations sur la clé primaire. Vous pouvez ajouter manuellement une clé primaire à la table à l'aide de règles de transformation :
transform: - source-table: <project>.<logstore> projection: * primary-keys: key1, key2 -
Inférence du schéma et modifications du schéma
Une fois le schéma initialisé, si schema.inference.strategy est défini sur
static, le connecteur SLS analyse chaque entrée de journal selon le schéma initial et ne génère pas d'événements de modification du schéma. Si schema.inference.strategy est défini surcontinuous, le connecteur analyse chaque entrée de journal, déduit les colonnes physiques et les compare au schéma actuel. Si le schéma déduit est incohérent avec le schéma actuel, les schémas sont fusionnés selon les règles suivantes :Si les colonnes physiques déduites contiennent des champs absents du schéma actuel, le connecteur ajoute ces champs au schéma et génère un événement pour ajouter des colonnes acceptant les valeurs NULL.
Si les colonnes physiques déduites omettent des champs présents dans le schéma actuel, le connecteur conserve ces champs, remplit leurs données par NULL et ne génère pas d'événement de suppression de colonne.
Le connecteur SLS déduit le type de données de tous les champs de chaque entrée de journal comme étant String. Actuellement, seule l'ajout de nouvelles colonnes est pris en charge. Le connecteur ajoute les nouvelles colonnes à la fin du schéma et les définit comme acceptant les valeurs NULL.
Exemples de code
-
SQL pour les tables source et de destination
CREATE TEMPORARY TABLE sls_input( `time` BIGINT, url STRING, dt STRING, float_field FLOAT, double_field DOUBLE, boolean_field BOOLEAN, `__topic__` STRING METADATA VIRTUAL, `__source__` STRING METADATA VIRTUAL, `__timestamp__` STRING METADATA VIRTUAL, __tag__ MAP<VARCHAR, VARCHAR> METADATA VIRTUAL, proctime as PROCTIME() ) WITH ( 'connector' = 'sls', 'endpoint' ='cn-hangzhou-intranet.log.aliyuncs.com', 'accessId' = '${secret_values.ak_id}', 'accessKey' = '${secret_values.ak_secret}', 'starttime' = '2023-08-30 00:00:00', 'project' ='sls-test', 'logstore' ='sls-input' ); CREATE TEMPORARY TABLE sls_sink( `time` BIGINT, url STRING, dt STRING, float_field FLOAT, double_field DOUBLE, boolean_field BOOLEAN, `__topic__` STRING, `__source__` STRING, `__timestamp__` BIGINT , receive_time BIGINT ) WITH ( 'connector' = 'sls', 'endpoint' ='cn-hangzhou-intranet.log.aliyuncs.com', 'accessId' = '${ak_id}', 'accessKey' = '${ak_secret}', 'project' ='sls-test', 'logstore' ='sls-output' ); INSERT INTO sls_sink SELECT `time`, url, dt, float_field, double_field, boolean_field, `__topic__` , `__source__` , `__timestamp__` , cast(__tag__['__receive_time__'] as bigint) as receive_time FROM sls_input; -
Ingestion de données avec une source de données SLS
Utilisez SLS comme source de données pour ingérer des données en temps réel dans les systèmes aval pris en charge. Par exemple, la configuration suivante définit une tâche d'ingestion de données qui écrit les données d'un logstore vers un lac de données au format Paimon dans Data Lake Formation (DLF). La tâche déduit automatiquement le schéma de la table de destination et prend en charge l'évolution du schéma lors de l'exécution.
source:
type: sls
name: SLS Source
endpoint: ${endpoint}
project: test_project
logstore: test_log
accessId: ${accessId}
accessKey: ${accessKey}
# Add a primary key to the table.
transform:
- source-table: \.*.\.*
projection: \*
primary-keys: id
# Route all data from test_project.test_log to the test_database.inventory table.
route:
- source-table: test_project.test_log
sink-table: test_database.inventory
sink:
type: paimon
catalog.properties.metastore: rest
catalog.properties.uri: dlf_uri
catalog.properties.warehouse: your_warehouse
catalog.properties.token.provider: dlf
# (Optional) Enable deletion vectors to improve read performance.
table.properties.deletion-vectors.enabled: true
API DataStream
Pour lire ou écrire des données avec l'API DataStream, utilisez un connecteur DataStream. Pour plus d'informations, consultez Utilisation des connecteurs DataStream.
Si vous utilisez une version de VVR antérieure à la 8.0.10, votre tâche risque de ne pas démarrer en raison de dépendances manquantes. Pour résoudre ce problème, ajoutez le fichier JAR uber correspondant en tant que dépendance supplémentaire.
Lire depuis SLS
Realtime Compute for Apache Flink fournit la classe SlsSourceFunction, une implémentation de SourceFunction, pour lire les données depuis Simple Log Service (SLS). L'exemple suivant lit les données depuis SLS.
public class SlsDataStreamSource {
public static void main(String[] args) throws Exception {
// Sets up the streaming execution environment
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// Creates an SLS source and prints the data to the console.
env.addSource(createSlsSource())
.map(SlsDataStreamSource::convertMessages)
.print();
env.execute("SLS Stream Source");
}
private static SlsSourceFunction createSlsSource() {
SLSAccessInfo accessInfo = new SLSAccessInfo();
accessInfo.setEndpoint("yourEndpoint");
accessInfo.setProjectName("yourProject");
accessInfo.setLogstore("yourLogStore");
accessInfo.setAccessId("yourAccessId");
accessInfo.setAccessKey("yourAccessKey");
// The batch get size is required.
accessInfo.setBatchGetSize(10);
// Optional parameters
accessInfo.setConsumerGroup("yourConsumerGroup");
accessInfo.setMaxRetries(3);
// Start time for consumption, set to the current time.
int startInSec = (int) (new Date().getTime() / 1000);
// Stop time for consumption, where -1 means never stop.
int stopInSec = -1;
return new SlsSourceFunction(accessInfo, startInSec, stopInSec);
}
private static List<String> convertMessages(SourceRecord input) {
List<String> res = new ArrayList<>();
for (FastLogGroup logGroup : input.getLogGroups()) {
int logsCount = logGroup.getLogsCount();
for (int i = 0; i < logsCount; i++) {
FastLog log = logGroup.getLogs(i);
int fieldCount = log.getContentsCount();
for (int idx = 0; idx < fieldCount; idx++) {
FastLogContent f = log.getContents(idx);
res.add(String.format("key: %s, value: %s", f.getKey(), f.getValue()));
}
}
}
return res;
}
}
Écrire dans SLS
Realtime Compute for Apache Flink fournit la classe SLSOutputFormat, une implémentation de OutputFormat, pour écrire des données dans SLS. L'exemple suivant écrit des données dans SLS.
public class SlsDataStreamSink {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.fromSequence(0, 100)
.map((MapFunction<Long, SinkRecord>) aLong -> getSinkRecord(aLong))
.addSink(createSlsSink())
.name(SlsDataStreamSink.class.getSimpleName());
env.execute("SLS Stream Sink");
}
private static OutputFormatSinkFunction createSlsSink() {
Configuration conf = new Configuration();
conf.setString(SLSOptions.ENDPOINT, "yourEndpoint");
conf.setString(SLSOptions.PROJECT, "yourProject");
conf.setString(SLSOptions.LOGSTORE, "yourLogStore");
conf.setString(SLSOptions.ACCESS_ID, "yourAccessId");
conf.setString(SLSOptions.ACCESS_KEY, "yourAccessKey");
SLSOutputFormat outputFormat = new SLSOutputFormat(conf);
return new OutputFormatSinkFunction<>(outputFormat);
}
private static SinkRecord getSinkRecord(Long seed) {
SinkRecord record = new SinkRecord();
LogItem logItem = new LogItem((int) (System.currentTimeMillis() / 1000));
logItem.PushBack("level", "info");
logItem.PushBack("name", String.valueOf(seed));
logItem.PushBack("message", "it's a test message for " + seed.toString());
record.setContent(logItem);
return record;
}
}
XML
Le connecteur SLS DataStream est disponible dans le dépôt central Maven.
<dependency>
<groupId>com.alibaba.ververica</groupId>
<artifactId>ververica-connector-sls</artifactId>
<version>${vvr-version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.flink</groupId>
<artifactId>flink-format-common</artifactId>
</exclusion>
</exclusions>
</dependency>