Cette rubrique répond aux questions fréquemment posées concernant les tables externes.
|
Catégorie |
FAQ |
|
Table externe Object Storage Service (OSS) |
|
|
Table externe Hologres |
|
|
Problèmes de performance |
Comment diagnostiquer la lenteur des tâches SQL sur les tables externes ? |
Erreur ODPS-0123131 : Lecture des types DATETIME avec des extracteurs personnalisés
-
Problème
Lorsque vous utilisez un extracteur personnalisé pour lire des données non structurées, l'erreur suivante s'affiche si un champ de données est de type DATETIME, par exemple
2019-11-11 06:43:36.FAILED: ODPS-0123131:User defined function exception - Traceback: java.lang.IllegalArgumentException at java.sql.Date.valueOf(Date.java:143) at com.aliyun.odps.udf.example.text.TextExtractor.textLineToRecord(TextExtractor.java:194) at com.aliyun.odps.udf.example.text.TextExtractor.extract(TextExtractor.java:153) at com.aliyun.odps.udf.ExtractorHandler.extract(ExtractorHandler.java:120) -
Cause
Dans le code
Date.valueOf(parts[i]), la fonctionjava.sql.Date.valueOf()accepte uniquement les paramètres STRING au format"yyyy-[m]m-[d]d"et ne prend pas en charge les paramètres DATETIME. -
Résolution
-
Ajoutez la dépendance Joda-Time à votre projet et importez les classes requises dans votre code.
-- Dependency. <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10</version> </dependency> -- Import information. import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; -
Utilisez la fonction
DateTimeFormat.forPattern()pour convertir une valeur de type DATETIME en type STRING afin de permettre sa lecture.record.setDate(index, new Date(DateTime.parse(parts[i], DateTimeFormat.forPattern("yyyy-MM-dd HH:mi:ss")).getMillis()));
Exemple :
-
Utilisez le client MaxCompute pour télécharger le fichier JAR de votre projet d'extracteur.
add jar /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar/Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jarcorrespond au chemin de stockage local du fichier JAR généré. -
Utilisez le client MaxCompute pour télécharger le fichier JAR tiers Joda-Time.
add jar /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar/Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jarcorrespond au chemin local du fichier JAR tiers Joda-Time. -
Téléchargez les données de test dans le répertoire spécifié sur OSS. Pour un fichier nommé
video_play_log.txt, voici un exemple de données.5c661071dba64d5080c91da085ff1073^Music-Click-Fast forward^26.12.XX.XX^2019-11-11 06:43:36 -
Lisez les données depuis la table externe.
select * from <project_name>.video_play_log;+------+-------+---+----------------+ | uuid | action | ip | time | +------+-------+---+----------------+ | 5c661071dba64d5080c91da085ff1073 | Music-Click-Fast forward | 26.12.XX.XX | 2019-11-11 06:43:36 | +------+-------+---+----------------+
-
Dépassement de mémoire avec les UDF sur les tables externes OSS
-
Problème
Lorsque vous utilisez une UDF pour accéder à une table externe OSS, une erreur de dépassement de mémoire se produit, même si la UDF a réussi les tests locaux.
FAILED: ODPS-0123131:User defined function exception - Traceback: java.lang.OutOfMemoryError: Java heap spaceAprès avoir défini les paramètres suivants, le temps d'exécution augmente, mais l'erreur persiste.
set odps.stage.mapper.mem = 2048; set odps.stage.mapper.jvm.mem = 4096; -
Cause
La table externe contient trop de fichiers objets, ce qui consomme une grande quantité de mémoire. De plus, aucune partition n'est configurée.
-
Résolution
Interrogez un volume de données plus faible.
Utilisez des partitions pour réduire la quantité de données analysées lors de chaque requête.
Erreur : Les données inline dépassent la taille maximale autorisée
-
Problème
L'erreur
Inline data exceeds the maximum allowed sizese produit lors du traitement des données dans Object Storage Service (OSS). -
Cause
Lorsque MaxCompute écrit des données dans une table externe OSS, il peut tenter de créer un fichier unique dont la taille dépasse la limite opérationnelle.
-
Résolution
Ajustez les propriétés suivantes pour contrôler le plan d'exécution. Cela garantit que les fichiers individuels écrits dans la table externe OSS ne dépassent pas la limite de taille.
-- Adjust the amount of data read by each mapper. Unit: MB. SET odps.sql.mapper.split.size=256; -- Adjust the number of workers in the reduce phase. SET odps.stage.reducer.num=100;
Fusionner les petits fichiers avec les tables externes OSS
Utilisez le journal Logview pour vérifier si le dernier opérateur du plan d'exécution SQL est un Reducer ou un Joiner. S'il s'agit d'un Reducer, exécutez l'instruction set odps.stage.reducer.num=1;. S'il s'agit d'un Joiner, exécutez l'instruction set odps.stage.joiner.num=1;.
Erreur ODPS-0130071 : Lecture des données Hologres depuis MaxCompute
-
Problème
Lorsque vous lisez directement les données depuis Hologres, l'erreur « ODPS-0130071 Failed to split to equal size...max count: 7777 » s'affiche. Exemple :
ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777 -
Cause
Cette erreur se produit car la stratégie de fractionnement par défaut des mappeurs de MaxCompute (volume de données d'entrée / split.size = 256 Mo) entraîne un dépassement de la limite maximale de 7 777 mappeurs concurrents.
RemarqueCette limite empêche les utilisateurs de soumettre des tâches générant un grand nombre de mappeurs, ce qui pourrait affecter la stabilité de Hologres ou la connexion réseau.
-
Résolution
Définissez les paramètres suivants pour résoudre l'erreur.
-- Increase the mapper concurrency limit. The maximum value is 10,000. SET odps.external.holo.mapper.instances=10000; -- Adjust task concurrency by increasing the split size. The maximum value is 512 MB. SET odps.sql.mapper.split.size=512;
Tâches SQL lentes sur les tables externes
Les tâches SQL sur les tables externes peuvent être lentes pour plusieurs raisons courantes :
-
Lecture lente des fichiers compressés GZ depuis une table externe OSS
-
Problème
La lecture d'un fichier volumineux et compressé (tel qu'un fichier GZ de 200 Go) depuis une table externe OSS est lente.
-
Cause
La tâche est lente car les formats compressés comme GZ ne sont pas fractionnables, ce qui oblige MaxCompute à n'utiliser qu'un seul mappeur.
-
Résolution
-
Pour améliorer les performances, divisez le fichier compressé volumineux en plusieurs fichiers plus petits sur OSS. Cela permet à MaxCompute d'utiliser plusieurs mappeurs en parallèle, ce qui augmente le débit de lecture.
-- Sets the data split size for each mapper in MB. SET odps.sql.mapper.split.size=256; Pour les données non structurées, vérifiez si le chemin de la table externe Object Storage Service (OSS) ne contient qu'un seul fichier. S'il n'y a qu'un seul fichier, un seul Mappeur est généré car les données non structurées compressées ne peuvent pas être fractionnées. Cela ralentit le traitement. Divisez le fichier OSS volumineux en fichiers plus petits dans le chemin de la table externe OSS. Cela augmente le nombre de Mappeurs et améliore la vitesse de lecture.
-
-
-
Requête de données lente dans une table externe MaxCompute via un SDK
-
Problème
L'interrogation des données d'une table externe MaxCompute à l'aide d'un SDK est lente.
-
Résolution
Les tables externes ne prennent en charge que les analyses complètes de table, ce qui peut être lent. Nous vous recommandons d'utiliser plutôt des tables internes MaxCompute.
-
-
Requête de données lente depuis une table externe Tablestore
-
Problème
Une requête sur une table externe Tablestore est nettement plus lente qu'une requête équivalente sur une table interne MaxCompute contenant les mêmes données.
-
Résolution
Cette différence de performance est attendue car l'interrogation d'une table externe implique des lectures de données à distance. Pour de meilleures performances, importez d'abord les données dans une table interne MaxCompute, puis exécutez vos requêtes.
-
Erreur « Couldn't connect to server » avec les tables externes OSS
-
Problème
Lorsque vous lisez des données depuis une table externe OSS, l'erreur suivante s'affiche :
ODPS-0123131:User defined function exception - common/io/oss/oss_client.cpp(95): OSSRequestException: req_id: , http status code: -998, error code: HttpIoError, message: Couldn't connect to server. -
Causes
Cause 1 : Lors de la création d'une table externe OSS, un endpoint public est utilisé pour le paramètre
oss_endpointdans oss_location au lieu d'un endpoint interne.Cause 2 : Lors de la création d'une table externe OSS, le paramètre
oss_endpointspécifié dans le chemin oss_location appartient à une région différente.
-
Résolution
-
Pour la Cause 1 :
Vérifiez le paramètre
oss_locationdans l'instructionCREATE TABLEde la table externe OSS. Si le paramètreoss_endpointest un endpoint public, remplacez-le par un endpoint interne. Pour plus d'informations sur les paramètres, consultez Description des paramètres.Par exemple, si vous vous trouvez dans la région Indonésie (Jakarta) et utilisez l'endpoint
oss://oss-ap-southeast-5.aliyuncs.com/<bucket>/....pour créer une table externe, vous devez le remplacer par l'endpoint interne correspondant :oss://oss-ap-southeast-5-internal.aliyuncs.com/<bucket>/..... -
Pour la Cause 2 :
Vérifiez que le paramètre
oss_endpointdans le paramètreoss_locationde l'instruction CREATE TABLE de la table externe OSS correspond bien à l'endpoint de la région que vous souhaitez accéder. Pour plus d'informations sur les noms de domaine du réseau classique OSS, consultez Régions et endpoints.
-
Erreur « Network is unreachable (connect failed) » lors de la création de table
-
Problème
Lorsque vous créez une table externe pour Object Storage Service (OSS), l'erreur suivante s'affiche :
ODPS-0130071:[1,1] Semantic analysis exception - external table checking failure, error message: Cannot connect to the endpoint 'oss-cn-beijing.aliyuncs.com': Connect to bucket.oss-cn-beijing.aliyuncs.com:80 [bucket.oss-cn-beijing.aliyuncs.com] failed: Network is unreachable (connect failed). -
Cause
Lors de la création d'une table externe OSS, le paramètre
oss_endpointdans l'adresse oss_location utilise un endpoint public, et non un endpoint interne. -
Résolution
Vérifiez l'instruction
CREATE TABLEde la table externe OSS pour vous assurer que le paramètreoss_endpointspécifié dans le paramètreoss_locationest un endpoint interne. S'il s'agit d'un endpoint public, remplacez-le par un endpoint interne. Pour plus d'informations sur les paramètres, consultez Description des paramètres.Par exemple, dans la région Chine (Pékin), si vous utilisez l'endpoint
oss://oss-cn-beijing.aliyuncs.com/<bucket>/....pour créer une table externe, vous devez le remplacer par l'endpoint interne correspondantoss://oss-cn-beijing-internal.aliyuncs.com/<bucket>/.....