Problèmes courants et solutions pour les fonctions définies par l'utilisateur (UDF) MaxCompute écrites en Java, notamment les erreurs de chargement de classe, les restrictions du bac à sable (sandbox), les délais d'expiration liés aux performances et l'utilisation des UDTF.
Problèmes de classe ou de dépendance
Problèmes de classe ou de dépendance fréquents lors de l'appel d'une UDF MaxCompute :
-
Symptôme 1 : Une erreur d'exécution se produit avec le message ClassNotFoundException ou Some dependencies are missing.
-
Causes :
Le package JAR de ressource spécifié lors de la création de l'UDF est incorrect.
Le package JAR de ressource dont dépend l'UDF n'a pas été chargé dans MaxCompute. Par exemple, un package tiers dépendant n'a pas été chargé.
Le projet utilisé lors de l'appel de l'UDF est incorrect. L'UDF ne figure pas dans le projet MaxCompute actuel. Par exemple, l'UDF est enregistrée dans un projet de développement mais appelée depuis un projet de production.
La ressource de fichier n'existe pas ou son type est incorrect. Par exemple, pour un fichier PY, le type de ressource est défini sur PY, alors que le type requis par
get_cache_filedans le code de l'UDF est FILE.
-
Solutions :
Vérifiez le package JAR pour vous assurer qu'il est correct et contient les classes requises. Reconditionnez le fichier et chargez-le dans le projet MaxCompute. Pour plus d'informations sur le conditionnement, le chargement et l'enregistrement, consultez la rubrique Conditionner, charger et enregistrer une UDF.
Chargez le package tiers dont dépend l'UDF dans le projet MaxCompute en tant que ressource. Ajoutez ensuite ce package à la liste des ressources dépendantes lors de l'enregistrement de la fonction. Pour plus d'informations sur l'ajout de ressources et l'enregistrement de fonctions, consultez les rubriques Ajouter une ressource et Enregistrer une fonction.
Pour résoudre le problème décrit dans la cause 3, exécutez la commande
list functions;dans le projet où l'erreur s'est produite, à l'aide du client MaxCompute. Cela permet de vérifier que l'UDF MaxCompute existe bien et que sa classe ainsi que ses ressources dépendantes sont correctes.Pour résoudre le problème décrit dans la cause 4, utilisez le client MaxCompute afin d'exécuter la commande
desc function <function_name>;et vérifiez que la liste Resources inclut toutes les ressources de fichier requises. Si le type de ressource ne correspond pas, exécutez la commandeadd <file_type> <file_name>;pour ajouter à nouveau la ressource.
-
-
Symptôme 2 : Un message d'erreur d'exécution s'affiche, tel que NoClassDefFoundError ou NoSuchMethodError, ou le code d'erreur est ODPS-0123055.
-
Causes :
La version d'une bibliothèque tierce dans le package JAR chargé ne correspond pas à la version de la bibliothèque tierce intégrée à MaxCompute.
Restrictions du bac à sable (sandbox) Java. Si le paramètre Stderr de l'instance de tâche contient le message
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader"), cela indique une restriction du bac à sable. Les UDF MaxCompute sont soumises aux restrictions du bac à sable Java lorsqu'elles s'exécutent dans un environnement distribué. Pour plus d'informations sur les restrictions du bac à sable Java, consultez la rubrique Bac à sable Java.
-
Solutions :
Utilisez le plugin
maven-shade-pluginpour résoudre l'incohérence de version et modifier le chemin d'importation. Reconditionnez le fichier dans un package JAR et chargez-le dans le projet MaxCompute. Pour plus d'informations sur le conditionnement, le chargement et l'enregistrement, consultez la rubrique Conditionner, charger et enregistrer une UDF.Consultez la section Problèmes liés aux restrictions du bac à sable Java.
-
Problèmes liés aux restrictions du bac à sable Java
Symptôme : Une erreur se produit lorsque vous appelez une UDF MaxCompute pour accéder à des fichiers locaux, au réseau public ou à un système de fichiers distribué, ou pour créer des threads Java.
Cause : Restrictions réseau. Par défaut, les UDF MaxCompute ne peuvent pas accéder au réseau.
Solution : Remplissez et soumettez le formulaire de demande de connectivité réseau en fonction de vos besoins métier. L'équipe d'assistance technique MaxCompute vous contactera pour activer l'accès au réseau. Pour obtenir des instructions sur le remplissage du formulaire, consultez la rubrique Procédure d'accès au réseau.
Problèmes de performance
Problèmes de performance fréquents lors de l'appel d'une UDF MaxCompute :
-
Symptôme 1 : L'erreur d'exécution est kInstanceMonitorTimeout.
Cause : Le temps de traitement de l'UDF dépasse la limite de délai d'expiration. Par défaut, un lot d'enregistrements (généralement 1 024) doit être traité en moins de 1 800 secondes. Cette limite s'applique au traitement d'un seul lot, et non à la durée totale d'exécution du worker. SQL traite généralement les données à raison de plus de 10 000 enregistrements par seconde. Cette limite permet d'éviter les boucles infinies dans les UDF qui entraîneraient une utilisation prolongée du processeur.
-
Solutions :
Si le volume réel de données à calculer est important, appelez
ExecutionContext.claimAlivedans la méthode de la classe d'implémentation de l'UDF pour réinitialiser le minuteur.-
Optimisez la logique du code de l'UDF. Vous pouvez également configurer les paramètres de session suivants pour ajuster le temps d'exécution de l'UDF et améliorer la vitesse de traitement.
|
**Paramètre**
|
**Description**
| | --- | --- | |
`set odps.function.timeout=xxx;`
|
Ajuste le délai d'expiration d'exécution de l'UDF. La valeur par défaut est 1 800 s. Vous pouvez augmenter cette valeur selon vos besoins. La plage de valeurs va de 1 s à 3 600 s.
| |
`set odps.stage.mapper.split.size=xxx;`
|
Ajuste le volume de données d'entrée pour un worker Map. La valeur par défaut est 256 Mo. Vous pouvez diminuer cette valeur selon vos besoins.
| |
`set odps.sql.executionengine.batch.rowcount=xxx;`
|
Ajuste le nombre de lignes de données traitées simultanément par MaxCompute. La valeur par défaut est 1 024. Vous pouvez diminuer cette valeur selon vos besoins.
|
-
Symptôme 2 : L'exécution renvoie un message d'erreur de type errMsg:SigKill(OOM) ou OutOfMemoryError.
Cause : Les tâches MaxCompute s'exécutent en trois étapes principales : Map, Reduce et Join. Si le volume de données est important, chaque instance de ces étapes peut nécessiter un long temps de traitement.
-
Solutions :
-
Si l'erreur est liée au code
|fuxiouruntime, définissez les paramètres de ressource suivants pour améliorer la vitesse de traitement.
**Paramètre**
|
**Description**
| | --- | --- | |
`set odps.stage.mapper.mem=xxx;`
|
Ajuste la taille de la mémoire d'un worker Map. La valeur par défaut est 1 024 Mo. Vous pouvez augmenter cette valeur selon vos besoins.
| |
`set odps.stage.reducer.mem=xxx;`
|
Ajuste la taille de la mémoire d'un worker Reduce. La valeur par défaut est 1 024 Mo. Vous pouvez augmenter cette valeur selon vos besoins.
| |
`set odps.stage.joiner.mem=xxx;`
|
Ajuste la taille de la mémoire d'un worker Join. La valeur par défaut est 1 024 Mo. Vous pouvez augmenter cette valeur selon vos besoins.
| |
`set odps.stage.mapper.split.size=xxx;`
|
Ajuste le volume de données d'entrée pour un worker Map. La valeur par défaut est 256 Mo. Vous pouvez augmenter cette valeur selon vos besoins.
| |
`set odps.stage.reducer.num=xxx;`
|
Ajuste le nombre de workers dans l'étape Reduce. Vous pouvez augmenter cette valeur selon vos besoins.
| |
`set odps.stage.joiner.num=xxx;`
|
Ajuste le nombre de workers dans l'étape Join. Vous pouvez augmenter cette valeur selon vos besoins.
| Si l'erreur provient du code Java, augmentez également la mémoire JVM en définissant
set odps.sql.udf.jvm.memory=xxx;en plus des paramètres mentionnés ci-dessus.
-
Pour plus d'informations sur les paramètres, consultez la rubrique Opérations SET.
Problèmes liés aux UDTF
Problèmes fréquents lors de l'appel d'une fonction table définie par l'utilisateur (UDTF) Java :
-
Symptôme 1 : Erreur d'exécution : Semantic analysis exception: only a single expression in the SELECT clause is supported with UDTFs.
-
Cause : Lorsque vous appelez une UDTF Java dans une instruction SELECT, l'UDTF est mélangée avec d'autres colonnes ou expressions. Cette opération n'est pas prise en charge. L'exemple suivant illustre une utilisation incorrecte.
select b.*, 'x', udtffunction_name(v) from table lateral view udtffunction_name(v) b as f1, f2; -
Solution : Utilisez l'UDTF Java avec la clause LATERAL VIEW. Exemple :
select b.*, 'x' from table lateral view udtffunction_name(v) b as f1, f2;
-
-
Symptôme 2 : Erreur d'exécution : Semantic analysis exception - expect 2 aliases but have 0.
Cause : Les noms des colonnes de sortie ne sont pas spécifiés dans le code de l'UDTF Java.
-
Solution : Spécifiez les noms de colonnes dans la clause
asde l'instruction SELECT. Exemple :select udtffunction_name(paramname) as (col1, col2);