La source de données LogHub (SLS) permet une synchronisation bidirectionnelle des données entre Simple Log Service (SLS) et d'autres sources de données au sein de DataWorks.
Fonctionnalités
Simple Log Service (SLS) prend en charge les scénarios de synchronisation de données suivants :
Synchronisation des données entre LogHub et des sources telles que MaxCompute, sur différentes régions.
Synchronisation des données entre LogHub et des sources telles que MaxCompute, sur différents comptes Alibaba Cloud.
Synchronisation des données entre LogHub et des sources telles que MaxCompute, au sein d'un même compte Alibaba Cloud.
Synchronisation des données entre LogHub et des sources telles que MaxCompute, entre les comptes du cloud public et ceux du China Finance Cloud.
Limites
Lorsque Data Integration effectue une écriture hors ligne vers LogHub (SLS), des doublons peuvent apparaître si une tâche est relancée après un basculement. Cela s'explique par le fait que LogHub (SLS) n'est pas idempotent.
Types de champs pris en charge
Data Integration prend en charge les types de champs LogHub (SLS) suivants pour la lecture et l'écriture.
|**Type de champ**
|
**Lecture hors ligne (LogHub (SLS) Reader)**
|
**Écriture hors ligne (LogHub (SLS) Writer)**
|
**Lecture en temps réel**
| | --- | --- | --- | --- | |
STRING
|
Pris en charge
|
Pris en charge
|
Pris en charge
|
Détails :
-
Lors de l'écriture de données dans LogHub (SLS) en mode hors ligne
Tous les types de données sont convertis en STRING avant d'être écrits dans LogHub (SLS). Le tableau suivant récapitule les conversions effectuées par LogHub (SLS) Writer.
|
**Type interne pris en charge par Data Integration**
|
**Type de données lors de l'écriture dans LogHub (SLS)**
| | --- | --- | |
LONG
|
STRING
| |
DOUBLE
|
STRING
| |
STRING
|
STRING
| |
DATE
|
STRING
| |
BOOLEAN
|
STRING
| |
BYTES
|
STRING
| -
Lors de la lecture des données depuis LogHub (SLS) en mode temps réel
Les champs de métadonnées suivants sont automatiquement inclus.
|
**Champ de synchronisation en temps réel LogHub (SLS)**
|
**Type de données**
|
**Description**
| | --- | --- | --- | |
__time__
|
STRING
|
Champ réservé SLS : __time__ indique l'horodatage du journal lors de l'écriture des données. La valeur correspond à un horodatage UNIX exprimé en secondes.
| |
__source__
|
STRING
|
Champ réservé SLS : __source__ spécifie le périphérique source du journal.
| |
__topic__
|
STRING
|
Champ réservé SLS : __topic__ indique le nom du topic.
| |
__tag__:__receive_time__
|
STRING
|
Horodatage d'arrivée du journal sur le serveur. Une fois la fonction d'enregistrement des adresses IP publiques activée, le serveur ajoute ce champ au journal brut dès sa réception. La valeur correspond à un horodatage UNIX exprimé en secondes.
| |
__tag__:__client_ip__
|
STRING
|
Adresse IP publique du périphérique source du journal. Une fois la fonction d'enregistrement des adresses IP publiques activée, le serveur ajoute ce champ au journal brut dès sa réception.
| |
__tag__:__path__
|
STRING
|
Chemin du fichier journal collecté par Logtail. Logtail ajoute automatiquement ce champ au journal.
| |
__tag__:__hostname__
|
STRING
|
Nom d'hôte de la machine source depuis laquelle Logtail collecte les données. Logtail ajoute automatiquement ce champ au journal.
|
Créer une source de données
Configurer une source de données
Avant de développer une tâche de synchronisation, vous devez créer la source de données correspondante dans DataWorks. Pour la procédure, consultez Créer une source de données. Pour une description détaillée des paramètres de configuration, reportez-vous aux info-bulles affichées sur la page de configuration.
Créer une source de données entre comptes Alibaba Cloud
L'exemple suivant explique comment utiliser le compte B pour configurer une tâche de synchronisation dans Data Integration afin de transférer les données LogHub du compte A vers MaxCompute du compte B. Les points d'attention spécifiques aux scénarios intercomptes sont les suivants :
-
Créez une source de données LogHub en utilisant l'AccessKey ID et l'AccessKey Secret du compte A.
Dans ce cas, le compte B peut synchroniser les données de tous les projets SLS appartenant au compte A.
-
Créez une source de données LogHub en utilisant l'AccessKey ID et l'AccessKey Secret de l'utilisateur RAM A1 rattaché au compte A.
-
Le compte A accorde à l'utilisateur RAM A1 les autorisations générales sur SLS, à savoir les stratégies
AliyunLogFullAccessetAliyunLogReadOnlyAccess. Pour plus d'informations, consultez Créer un utilisateur RAM et lui attribuer des autorisations.RemarqueUne fois les stratégies système
AliyunLogFullAccessetAliyunLogReadOnlyAccessattachées à un utilisateur RAM, celui-ci peut interroger toutes les ressources SLS du compte Alibaba Cloud. -
Le compte A accorde à l'utilisateur RAM A1 une autorisation personnalisée sur SLS.
Connectez-vous à la console avec le compte A, puis cliquez sur Create Permission Policy.
Pour en savoir plus sur l'autorisation associée, consultez Présentation du contrôle d'accès et Exemples d'autorisations personnalisées RAM.
Après avoir autorisé l'utilisateur RAM A1 selon la stratégie suivante, le compte B ne pourra synchroniser les données que depuis les projets SLS project_name1 et project_name2 via cet utilisateur.
{ "Version": "1", "Statement": [ { "Action": [ "log:Get*", "log:List*", "log:CreateConsumerGroup", "log:UpdateConsumerGroup", "log:DeleteConsumerGroup", "log:ListConsumerGroup", "log:ConsumerGroupUpdateCheckPoint", "log:ConsumerGroupHeartBeat", "log:GetConsumerGroupCheckPoint" ], "Resource": [ "acs:log:*:*:project/project_name1", "acs:log:*:*:project/project_name1/*", "acs:log:*:*:project/project_name2", "acs:log:*:*:project/project_name2/*" ], "Effect": "Allow" } ] }
-
Développement de tâches de synchronisation de données
Pour connaître le point d'entrée et la procédure de configuration d'une tâche de synchronisation, reportez-vous aux guides de configuration suivants.
Lorsqu'une source de données LogHub sert de source, vous pouvez filtrer les données dans LogHub à l'aide de la syntaxe de requête LogHub ou des instructions SPL (SLS Processing Language, langage utilisé par SLS pour traiter les journaux) durant la configuration de la tâche. Pour le détail de la syntaxe, consultez Annexe : Filtrage des données LogHub.
Guide de configuration des tâches de synchronisation hors ligne mono-table
-
Pour la procédure, consultez Configurer une tâche de synchronisation hors ligne mono-table dans l'interface sans code et Configurer une tâche de synchronisation hors ligne mono-table à l'aide d'un script.
RemarqueLorsque vous configurez un nœud de synchronisation en mode interface sans code, le format des paramètres doit être cohérent avec celui utilisé en mode script.
Pour la liste complète des paramètres et un exemple de script en mode script, consultez Paramètres du mode script ci-dessous.
Guide de configuration des tâches de synchronisation en temps réel mono-table
Pour la procédure, consultez Configurer une tâche de synchronisation en temps réel mono-table.
Guide de configuration de la synchronisation en temps réel sur toute la base de données et autres synchronisations au niveau de la base
Pour la procédure, consultez Configurer une tâche de synchronisation en temps réel sur toute la base de données.
FAQ
Un champ contient des données dans LogHub mais apparaît vide après la synchronisation
Les champs récupérés lors du mappage depuis LogHub ne correspondent pas aux attentes
Pour davantage de problèmes courants liés à Data Integration, consultez FAQ Data Integration.
Annexe 1 : Exemple de script et description des paramètres
Configuration d'une tâche de synchronisation par lots via l'éditeur de code
Pour configurer une tâche de synchronisation par lots à l'aide de l'éditeur de code, vous devez définir les paramètres appropriés dans le script, conformément aux exigences du format de script unifié. Pour plus d'informations, consultez la section Configuration en mode script. Les informations ci-dessous détaillent les paramètres à configurer pour les sources de données lors de la mise en place d'une tâche de synchronisation par lots via l'éditeur de code.
Exemple de script pour le composant Reader
Lecture depuis un Logstore (exemple de base)
{ "type":"job", "version":"2.0",// The version number. "steps":[ { "stepType":"LogHub",// The plug-in name. "parameter":{ "datasource":"",// The data source. "column":[// The columns. "col0", "col1", "col2", "col3", "col4", "__category__", "__source__", "__topic__", // The log topic. "__machineUUID__", // The unique identifier of the collection machine. "__tag__:__hostname__", // The hostname. "__tag__:__path__", // The path. "__time__" // The event time. ], "beginDateTime":"",// The start time for data consumption. "batchSize":"",// The number of data entries queried from SLS at a time. "endDateTime":"",// The end time for data consumption. "fieldDelimiter":",",// The column delimiter. "logstore":""// The name of the destination Logstore. }, "name":"Reader", "category":"reader" }, { "stepType":"stream", "parameter":{}, "name":"Writer", "category":"writer" } ], "setting":{ "errorLimit":{ "record":"0"// The number of error records. }, "speed":{ "throttle":true,// If throttle is set to false, the mbps parameter does not take effect, which means throttling is disabled. If throttle is set to true, throttling is enabled. "concurrent":1 // The number of concurrent threads. "mbps":"12",// The throttling rate. 1 mbps = 1 MB/s. } }, "order":{ "hops":[ { "from":"Reader", "to":"Writer" } ] } }
Lecture depuis un Logstore après traitement des données avec SPL (exemple)
{ "type":"job", "version":"2.0",// The version number. "steps":[ { "stepType":"LogHub",// The plug-in name. "parameter":{ "datasource":"",// The data source. "column":[// The columns. "col100", "col1" ], "beginDateTime":"",// The start time for data consumption. "batchSize":"",// The number of data entries queried from SLS at a time. "endDateTime":"",// The end time for data consumption. "fieldDelimiter":",",// The column delimiter. "logstore":"",// The name of the destination Logstore. "query":"* | where regexp_like(col0, '[0-9]+') | project col100=col0, col1 " // SPL }, "name":"Reader", "category":"reader" }, { "stepType":"stream", "parameter":{}, "name":"Writer", "category":"writer" } ], "setting":{ "errorLimit":{ "record":"0"// The number of error records. }, "speed":{ "throttle":true,// If throttle is set to false, the mbps parameter does not take effect, which means throttling is disabled. If throttle is set to true, throttling is enabled. "concurrent":1 // The number of concurrent threads. "mbps":"12",// The throttling rate. 1 mbps = 1 MB/s. } }, "order":{ "hops":[ { "from":"Reader", "to":"Writer" } ] } }
Lecture depuis un Logstore après extension des champs avec SPL (exemple)
{ "type":"job", "version":"2.0",// The version number. "steps":[ { "stepType":"LogHub",// The plug-in name. "parameter":{ "datasource":"",// The data source. "column":[// The columns. "col0", "col1", "col2", "col3", "col4", "__category__", "__source__", "__topic__", // The log topic. "__machineUUID__", // The unique identifier of the collection machine. "__tag__:__hostname__", // The hostname. "__tag__:__path__", // The path. "__time__", // The event time. "col100", "col101" ], "beginDateTime":"",// The start time for data consumption. "batchSize":"",// The number of data entries queried from SLS at a time. "endDateTime":"",// The end time for data consumption. "fieldDelimiter":",",// The column delimiter. "logstore":"",// The name of the destination Logstore. "query":"* | where regexp_like(col0, '[0-9]+') | extend col100=cast(col2 as BIGINT), extend col101=date_parse(col3, '%Y-%m-%d %H:%i') ",// SPL }, "name":"Reader", "category":"reader" }, { "stepType":"stream", "parameter":{}, "name":"Writer", "category":"writer" } ], "setting":{ "errorLimit":{ "record":"0"// The number of error records. }, "speed":{ "throttle":true,// If throttle is set to false, the mbps parameter does not take effect, which means throttling is disabled. If throttle is set to true, throttling is enabled. "concurrent":1 // The number of concurrent threads. "mbps":"12",// The throttling rate. 1 mbps = 1 MB/s. } }, "order":{ "hops":[ { "from":"Reader", "to":"Writer" } ] } }
Paramètres du script Reader
Parameter | Description | Required | Default value |
endPoint | L'endpoint Simple Log Service correspond à l'URL permettant d'accéder à un projet et à ses données de journal. Il dépend de la région Alibaba Cloud où réside le projet ainsi que du nom du projet. Pour connaître les endpoints de service par région, consultez la page Endpoints. | Yes | None |
accessId | L'AccessKey ID utilisé pour accéder à Simple Log Service, qui identifie l'utilisateur. | Yes | None |
accessKey | L'AccessKey utilisé pour accéder à Simple Log Service afin d'authentifier l'utilisateur. | Yes | None |
project | Le nom du projet Simple Log Service de destination. Un projet constitue l'unité de gestion des ressources dans Simple Log Service et sert à isoler et gérer les ressources. | Yes | None |
logstore | Le nom du Logstore de destination. Un Logstore est l'unité dans Simple Log Service dédiée à la collecte, au stockage et à l'interrogation des données de journal. | Yes | None |
batchSize | Le nombre d'entrées de données récupérées depuis Simple Log Service lors d'une seule requête. | No | 128 |
column | Les noms de colonne présents dans chaque entrée de données. Vous pouvez configurer les champs de métadonnées de Simple Log Service en tant que colonnes de synchronisation. Simple Log Service prend en charge des métadonnées telles que le sujet du journal, l'identifiant unique de la machine de collecte, le nom d'hôte, le chemin d'accès et l'heure du journal. Remarque Les noms de colonne sont sensibles à la casse. Pour plus d'informations, reportez-vous à la section valeurs de colonne configurables ci-dessous. | Yes | None |
beginDateTime | L'heure de début de la consommation des données, correspondant au moment où les données de journal arrivent dans LogHub (SLS). Ce paramètre définit la borne inférieure (inclusive) de la plage temporelle. Définissez ce paramètre sous forme de chaîne horaire au format yyyyMMddHHmmss (par exemple, 20180111013000). Vous pouvez utiliser ce paramètre conjointement avec les paramètres de planification de DataWorks. Par exemple, dans les Scheduling Settings situées à droite de la page d'édition du nœud, définissez Remarque
| Yes | None |
endDateTime | L'heure de fin de la consommation des données, correspondant à la borne supérieure (exclusive) de la plage temporelle. Définissez ce paramètre sous forme de chaîne horaire au format yyyyMMddHHmmss (par exemple, 20180111013010). Vous pouvez utiliser ce paramètre conjointement avec les paramètres de planification de DataWorks. Par exemple, dans les Scheduling Settings situées à droite de la page d'édition du nœud, définissez endDateTime=${yyyymmdd} dans le champ Parameter, puis configurez l'Log End Time sur ${endDateTime}000000. Cela indique que l'heure de fin du journal est 00:00:00 le lendemain de la date métier. Pour plus d'informations, consultez la rubrique Paramètres de planification. Important
| Yes | None |
query | Filtre les données dans LogHub à l'aide de la syntaxe de requête LogHub ou des instructions SPL (SPL, ou SLS Processing Language, est la syntaxe utilisée par SLS pour traiter les journaux). | Yes | None |
Si des données sont manquantes lors de la lecture depuis LogHub, vérifiez dans la console LogHub si le champ de métadonnées receive_time se situe bien dans la plage temporelle configurée pour la tâche.
Partitionnement par champs métier personnalisés
Le filtre temporel appliqué aux tâches de synchronisation hors ligne LogHub (SLS) repose toujours sur __tag__:__receive_time__. Le filtrage ou le partitionnement direct par des champs métier personnalisés tels que start_time n'est pas pris en charge. Pour partitionner les données dans MaxCompute selon un champ métier personnalisé, utilisez la solution de contournement suivante :
Configurez une tâche de synchronisation hors ligne pour transférer toutes les données LogHub (SLS) vers une table intermédiaire MaxCompute (sans spécifier de champ de partition).
-
Créez un nœud SQL MaxCompute et exécutez l'instruction suivante pour écrire les données dans la table partitionnée de destination en utilisant un champ métier personnalisé (tel que
start_time) :INSERT OVERWRITE TABLE target_table PARTITION(start_time) SELECT col1, col2, start_time FROM temp_table; Utilisez des paramètres de planification pour transmettre dynamiquement les valeurs de partition et mettre en œuvre un partitionnement automatique par jour ou par heure.
Exemple de script pour le composant Writer
{ "type": "job", "version": "2.0",// The version number. "steps": [ { "stepType": "stream", "parameter": {}, "name": "Reader", "category": "reader" }, { "stepType": "LogHub",// The plug-in name. "parameter": { "datasource": "",// The data source. "column": [// The columns. "col0", "col1", "col2", "col3", "col4", "col5" ], "topic": "",// The selected topic. "batchSize": "1024",// The number of records to submit at a time. "logstore": ""// The name of the destination LogService Logstore. }, "name": "Writer", "category": "writer" } ], "setting": { "errorLimit": { "record": ""// The number of error records. }, "speed": { "throttle":true,// If throttle is set to false, the mbps parameter does not take effect and bandwidth is not throttled. If throttle is set to true, bandwidth is throttled. "concurrent":3, // The number of concurrent threads. "mbps":"12"// The throttling rate. 1 mbps = 1 MB/s. } }, "order": { "hops": [ { "from": "Reader", "to": "Writer" } ] } }
Paramètres du script Writer
Le composant Writer LogHub (SLS) récupère les données générées par le composant Reader via le framework Data Integration, puis convertit tous les types de données pris en charge en STRING un par un. Lorsque la taille de lot (batchSize) spécifiée est atteinte, les données sont envoyées à LogHub (SLS) en un seul lot à l'aide du SDK Java LogService.
Parameter | Description | Required | Default value |
endpoint | L'endpoint Log Service correspond à l'URL permettant d'accéder à un projet et à ses données de journal. Il est déterminé par la région Alibaba Cloud et le nom du projet. Pour connaître les endpoints de service par région, consultez la page Endpoints de service. | Yes | None |
accessKeyId | L'AccessKeyId utilisé pour accéder à Log Service. | Yes | None |
accessKeySecret | Le AccessKeySecret utilisé pour accéder à Log Service. | Yes | None |
project | Le nom du projet Log Service de destination. | Yes | None |
logstore | Le nom du Logstore de destination. Un Logstore est l'unité dans Log Service dédiée à la collecte, au stockage et à l'interrogation des données de journal. | Yes | None |
topic | Le nom du topic dans le SLS de destination. | No | Empty string |
batchSize | Le nombre d'enregistrements de données synchronisés vers LogHub (SLS) à la fois. Valeur par défaut : 1 024. Valeur maximale : 4 096. Remarque La taille des données pour une écriture par lot unique dans LogHub (SLS) ne doit pas dépasser 5 Mo. Ajustez le nombre d'enregistrements poussés par lot en fonction de la taille individuelle de vos enregistrements. | No | 1 024 |
column | Le nom de la colonne dans chaque enregistrement de données. | Yes | None |
Annexe 2 : Filtrage de la syntaxe LogHub SPL
Lorsque LogHub est utilisé comme source de données, vous pouvez utiliser la syntaxe de requête LogHub ou des instructions SPL (SLS Processing Language) pour filtrer les données dans LogHub lors de la configuration des tâches. La syntaxe est décrite ci-dessous :
Pour plus d'informations sur le langage SPL, consultez Présentation du langage SPL.
Scénario | Instruction SQL | Instruction SPL |
Filtrage des données | |
|
Traitement et sélection des champs | Sélectionnez des champs spécifiques et renommez-les : |
|
Transformation des données (appel de fonctions SQL) | Convertissez les types de données, analysez les horodatages, etc. : | Convertissez les types de données, analysez les horodatages, etc. : |
Extraction de champs | Extraction par expression régulière : Extraction JSON : |
|
Annexe 3 : Valeurs de colonne configurables
La logique de lecture de tous les champs n'est déclenchée que si column contient exactement un élément qui est * ou "*". Dans le cas contraire, chaque élément column est traité selon l'ordre de correspondance normal. Par exemple, si vous configurez ["*", "__time__"], le * ne déclenche pas la logique de lecture de tous les champs. Il est plutôt traité comme un nom de champ normal, ce qui génère généralement null.
L'ordre de correspondance normal est le suivant : champs de contenu de journal normaux → mappage des métadonnées intégrées du lecteur → constantes entre guillemets simples → __tag__:<tagKey> → null. Si un champ de contenu de journal normal porte le même nom qu'un champ de métadonnées ou qu'une clé LogTag, le champ de contenu de journal normal est prioritaire.
Le tableau suivant répertorie les champs couramment utilisés et recommandés pour les configurations destinées aux utilisateurs dans les paramètres column de LogHub Reader, en se basant sur les définitions des champs réservés SLS. La présence d'une valeur pour un champ dépend du contenu réel du journal, des métadonnées LogGroup et des balises LogTags récupérées.
Configuration
|
Comportement
| | --- | --- | |
Nom de champ normal, par exemple `content` ou `level`
|
Lit la valeur à partir des champs de contenu (contents) de chaque entrée de journal par clé. Les noms de champs sont sensibles à la casse.
| |
`__time__` ou `__logtime__`
|
Lit `log.getTime()` de chaque entrée de journal, qui correspond à l'heure du journal sous forme d'horodatage en secondes.
| |
`__source__`
|
Lit le `source` du LogGroup, qui correspond au périphérique source du journal.
| |
`__topic__`
|
Lit le `topic` du LogGroup, qui correspond au sujet du journal.
| |
`__category__`
|
Lit la `category` du LogGroup.
| |
`__machineUUID__`
|
Lit le `machineUUID` du LogGroup.
| |
`__tag__:__receive_time__`
|
Lit `__receive_time__` à partir des LogTags, qui indique l'heure d'arrivée du journal sur le serveur. Cette balise doit exister dans le journal.
| |
`__tag__:__client_ip__`
|
Lit `__client_ip__` à partir des LogTags, qui indique l'adresse IP publique du périphérique source du journal. Cette balise doit exister dans le journal.
| |
`__tag__:__path__`
|
Lit `__path__` à partir des LogTags, qui indique généralement le chemin du fichier journal collecté par Logtail. Cette balise doit exister dans le journal.
| |
`__tag__:__hostname__`
|
Lit `__hostname__` à partir des LogTags, qui indique généralement le nom d'hôte de la machine source où Logtail collecte les données. Cette balise doit exister dans le journal.
| |
`__tag__:
|
Lit d'autres LogTags spécifiés, tels que `__tag__:__pack_id__` ou `__tag__:__user_defined_id__`.
| |
`__raw_log__` ou `__raw__`
|
Si ce champ existe en tant que champ de contenu de journal, il peut être lu comme un nom de champ normal.
| |
`'fixed value'`
|
Génère une chaîne constante (le contenu après suppression des guillemets simples externes).
| |
`["*"]`
|
Prend effet uniquement si `column` contient un seul `*`. Lit tous les champs de contenu de journal normaux, les trie par clé et génère chaque colonne au format `key:value`.
| |
Champs non correspondants
|
Génère `null` sans signaler d'erreur.
|
Exemple de configuration :
"column": [
"content",
"__time__",
"__source__",
"__tag__:__receive_time__",
"'constant_value'"
]