Cette rubrique décrit les problèmes fréquents rencontrés lors des tâches d'expédition de données MaxCompute (nouvelle version) et propose des solutions pour y remédier.
Erreur « User does not exist »
Si l'historique d'exécution d'une tâche d'expédition de données MaxCompute (nouvelle version) affiche l'erreur suivante : ODPS-0420095: Access Denied - Authorization Failed [4002], You don't exist in project ****. Context ID:11111-1111-111-1111-11111111. --->Tips: Pricipal:INVALID$v4_11111111111; You don't exist in project ****, cela signifie que l'utilisateur cible n'a pas été ajouté au workspace MaxCompute, ou qu'il a été ajouté incorrectement. Pour résoudre ce problème, ajoutez à nouveau l'utilisateur et autorisez-le. Pour plus d'informations, consultez la page Autoriser le rôle par défaut à écrire des données dans MaxCompute (pour l'expédition de données au sein du même compte) ou Autoriser un rôle personnalisé à écrire des données dans MaxCompute (pour l'expédition de données au sein du même compte).
Erreur « RAM role has no permission »
Si l'historique d'exécution d'une tâche d'expédition de données MaxCompute (nouvelle version) affiche l'erreur suivante : ODPS-0420095: Access Denied - Authorization Failed [4019], You have NO privilege 'odps:Describe' on {acs:odps:*:projects/****/tables/****}. Context ID:111111-1111-11111-1111-1111111. --->Tips: Pricipal:INVALID$v4_11111111111, cela indique que le rôle RAM ne dispose pas des autorisations requises lorsqu'il est ajouté en tant que membre du workspace MaxCompute. Pour résoudre ce problème, accordez à nouveau les autorisations nécessaires au rôle RAM. Pour plus d'informations, consultez la page Autoriser le rôle par défaut à écrire des données dans MaxCompute (pour l'expédition de données au sein du même compte) ou Autoriser un rôle personnalisé à écrire des données dans MaxCompute (pour l'expédition de données au sein du même compte).
Erreur FAILED: mismatched input
Si vous utilisez un utilisateur RAM et que vous rencontrez l'erreur FAILED: mismatched input lors de l'ajout d'un rôle RAM en tant que membre d'un workspace MaxCompute, cela signifie que votre compte ne dispose pas des autorisations nécessaires pour exécuter des instructions telles que ADD USER. Pour résoudre ce problème, utilisez un compte Alibaba Cloud ou un utilisateur RAM disposant de la politique suivante afin d'exécuter des instructions comme ADD USER. Après cette opération unique, vous pourrez utiliser l'utilisateur RAM pour exécuter des instructions telles que ADD USER sans rencontrer cette erreur.
{
"Version": "1",
"Statement": [
{
"Action": "ram:CreateServiceLinkedRole",
"Resource": "*",
"Effect": "Allow",
"Condition": {
"StringEquals": {
"ram:ServiceName": "usermgmt.odps.aliyuncs.com"
}
}
}
]
}
Autorisations utilisateur insuffisantes
Si l'utilisateur actuel rencontre l'erreur suivante lors de l'ajout d'un rôle RAM en tant que membre d'un workspace MaxCompute : FAILED: ODPS-0130013:Authorization exception - Authorization Failed [4003], You have NO privilege to do the PROJECT SECURITY OPERATION for {acs:odps:*:projects/****/authorization/users}. Context ID:1111-11111-1111-1111-11111., cela indique que l'utilisateur ne dispose pas des autorisations requises pour effectuer des opérations de sécurité sur le projet dans MaxCompute. Pour résoudre ce problème, attribuez le rôle admin à l'utilisateur. Pour plus d'informations, consultez la page Relation entre les autorisations MaxCompute et DataWorks.
Suivez les étapes ci-dessous pour attribuer le rôle admin à un utilisateur.
Connectez-vous à la console MaxCompute.
Dans le coin supérieur gauche de la page, sélectionnez une région.
Sur la page Project Management, localisez le projet cible et cliquez sur Manage dans la colonne Actions.
Cliquez sur l'onglet Role Permissions.
Localisez le rôle admin et cliquez sur Manage Members dans la colonne Actions.
Dans le panneau Manage Members, saisissez le nom du compte dans le champ Account name to add.
Dans la boîte de dialogue Manage Members, cliquez sur OK. Sélectionnez le compte cible, cliquez sur la flèche droite (>) pour le déplacer vers la liste Added Accounts, puis cliquez sur OK.
Erreurs « SlotExceeded » et « io: read/write on closed pipe »
Si les historiques d'exécution d'une tâche d'expédition de données MaxCompute (nouvelle version) affichent l'une des erreurs suivantes, il est possible que la concurrence actuelle de l'expédition de données dépasse le quota de slots MaxCompute :
SlotExceeded: Your slot quota is exceeded. Region: cn-shanghai Project: xxx Slot Quota Exceeded. Total: xxx, Acquired: xxx
maxcompute error ClientError: io: read/write on closed pipe
Pour réduire le risque de survenue de ce problème, utilisez __receive_time__ comme champ de partitionnement. Ce champ se base sur l'heure de réception côté serveur. Les journaux appartenant à la même fenêtre temporelle de réception sont écrits dans la même partition, ce qui permet d'éviter les écritures concurrentes sur plusieurs partitions et de réduire la consommation de slots. Vous pouvez modifier le champ de partitionnement lors de la création d'une tâche d'expédition de données MaxCompute (nouvelle version).
Partitionnement par heure du journal
Lors de la création d'une tâche d'expédition de données MaxCompute (nouvelle version), vous pouvez définir la MaxCompute Partition Key Column sur __partition_time__ afin de partitionner les données selon l'heure du journal. Dans la configuration de la MaxCompute partition key column, __partition_time__ et __receive_time__ sont des champs de partition définis par le système, calculés respectivement à partir de l'heure du journal et de l'heure de réception. Vous pouvez également cliquer sur l'icône plus (+) pour ajouter des colonnes de clé de partition personnalisées et les mapper aux champs existants dans Simple Log Service, tels que http_method ou operation.
Le champ __partition_time__ est calculé en fonction de la valeur du champ __time__ dans Simple Log Service. Une chaîne temporelle est générée selon le fuseau horaire spécifié et le format d'heure de partition. Afin d'éviter de dépasser la limite de partitions par table dans MaxCompute, MaxCompute aligne les valeurs des colonnes de clé de partition basées sur la date sur des intervalles de 1 800 secondes (30 minutes). Pour plus d'informations, consultez la section Champ __partition_time__.
Colonnes de partition MaxCompute : __partition_time__ et __receive_time__
__partition_time__ se base sur l'heure du journal. La valeur de __partition_time__ est calculée à partir du champ __time__ d'un journal. Étant donné que __time__ provient du journal lui-même, la partition cible peut être affectée par la latence de collecte et les décalages d'horloge du client.
|
Scénario |
Heure de réception |
Partition cible |
Cause |
|
Journal A normal |
10:00 |
|
L'heure du journal correspond à l'heure de réception. |
|
Journal B retardé |
10:00 |
|
L'heure du journal est antérieure à l'heure de réception. |
|
Journal C provenant d'un client avec décalage d'horloge |
10:00 |
|
L'heure du journal est postérieure à l'heure de réception. |
Si les journaux appartenant à la même fenêtre temporelle de réception sont distribués sur plusieurs partitions, les problèmes suivants peuvent survenir :
Les partitions historiques continuent de recevoir des données arrivant en retard, ce qui rend difficile la détermination de l'exhaustivité d'une partition.
Des partitions futures peuvent apparaître plus tôt que prévu, car les journaux présentant des horodatages clients anormaux sont écrits dans des plages de partitions futures.
La planification des tâches en aval devient plus complexe, car les limites des partitions sont floues et la gestion du cycle de vie des données s'en trouve compliquée.
__receive_time__ se base sur l'heure de réception côté serveur. Simple Log Service écrit ce champ dès la réception des journaux ; sa valeur n'est donc pas affectée par la latence de collecte, les décalages d'horloge du client ou les exceptions d'analyse de l'heure du journal. Dans les exemples précédents, les trois journaux sont reçus à 10:00 et écrits dans p=10:00.
L'utilisation de __receive_time__ offre les avantages suivants :
Les journaux appartenant à la même fenêtre temporelle de réception sont écrits dans la même partition, et les limites des partitions restent claires.
La progression du partitionnement est cohérente avec la progression réelle de l'expédition des données, ce qui facilite la détermination de l'exhaustivité des partitions.
La planification des tâches en aval est plus prévisible, car les partitions historiques sont moins susceptibles d'être remplacées de manière répétée.
Il est recommandé d'utiliser __receive_time__ comme champ de partitionnement. Dans les scénarios de données en temps réel, __partition_time__ et __receive_time__ ne présentent généralement aucune différence significative. Dans les environnements de production où les données sont retardées ou où des décalages d'horloge client existent, __receive_time__ assure un comportement de partitionnement plus stable.
Afficher les partitions d'une table MaxCompute
Exécutez la commande show partitions <table-name>; pour afficher les partitions d'une table. Dans cette commande, remplacez <table-name> par le nom de votre table.
Expédier les données d'heure du journal
Lors de la création d'une tâche d'expédition de données MaxCompute (nouvelle version), vous pouvez ajouter le champ __time__ dans la section MaxCompute Common Column. Le champ __time__ représente l'heure du journal au format d'horodatage UNIX, avec une précision à la seconde.
Par exemple, vous pouvez mapper le champ __time__ à une colonne de destination dans votre table MaxCompute, telle que c14.
Valeurs de champ nulles
Ce problème est généralement causé par une incompatibilité de type de données, un échec de conversion de type ou un champ manquant dans le journal source.
Pour gérer les incompatibilités de type de données ou les échecs de conversion, consultez la page Gérer les données erronées.
Pour obtenir des informations sur les exigences de format des types de données, consultez la page Stabilité et limites.
Échec de la tâche après activation d'une liste blanche d'adresses IP
Si vous activez une liste blanche d'adresses IP pour un projet MaxCompute (par exemple, une liste blanche d'adresses IP de réseau classique), une tâche d'expédition de données peut échouer avec un message d'erreur similaire au suivant :
error:RequestId=202211181752058538dc0b0018****, ErrorCode=NoPermission, ErrorMessage=Access denied by project ip white list: sourceIP:'192.168.x.x' is not in white list. project: slstest-1 from:
errorType:odps.OdpsError
jobId:****-****
Pour résoudre les échecs causés par la liste blanche d'adresses IP, exécutez les commandes suivantes dans MaxCompute :
Connectez-vous à la console MaxCompute .
Dans le coin supérieur gauche de la page, sélectionnez la région où se trouve votre projet.
Dans le volet de navigation de gauche de MaxCompute, choisissez .
-
Dans DataWorks, effectuez les étapes suivantes. Pour plus d'informations sur l'utilisation de DataWorks, consultez la page Avancé : Analyser les catégories de produits les plus vendus.
-
Interrogez la configuration actuelle de la liste blanche d'adresses IP.
setproject; select 1; -
Ajoutez
AliyunLogSLRService,AliyunLogDefaultServiceà la liste blanche de services existante à l'aide de la commande suivante :setproject odps.security.ip.whitelist.services=AliyunLogSLRService,AliyunLogDefaultService; -
Une fois la configuration terminée, exécutez les commandes suivantes pour vérifier les nouveaux paramètres de la liste blanche.
setproject; select 1;Après avoir exécuté la commande
setproject, le système renvoie les propriétés de configuration du projet. Vérifiez les valeurs des propriétésodps.security.ip.whitelist.servicesetodps.security.outbound.destination:odps.output.field.formatter= odps.project.longtimetmpfile.max.remain.days=30 odps.project.longtimetmpfile.min.remain.days=3 odps.project.maintenance.alarm={"storage.warning.ratio":"85","storage.warning.receiver":"","storage.critical.receiver":"","storage.critical.ratio":"95"} odps.project.maintenance.window= odps.schema.evolution.enable=false odps.schema.model.enabled=false odps.security.enabledownloadprivilege=false odps.security.ip.whitelist= odps.security.ip.whitelist.services=AliyunLogSLRService,AliyunLogDefaultService odps.security.outbound.destination= odps.security.vpc.whitelist= odps.session.flag.authority=false odps.spark.kube.mode=false odps.sql.acid.table.enable=true odps.sql.allow.cartesian=false odps.sql.allow.fullscan=false odps.sql.auto.mv.quota.gb=-1 odps.sql.cfile2.field.maxsize=8192
-