Cette rubrique présente les questions fréquemment posées (FAQ) concernant l'utilisation de MapReduce.
Une vue peut-elle servir de source d'entrée pour MapReduce ?
Non. Il doit s'agir d'une table.
Lorsque MapReduce écrit des résultats dans une table ou une partition, écrase-t-il ou ajoute-t-il les données ?
Il écrase les données existantes dans la table ou la partition.
Puis-je appeler un fichier shell dans MapReduce ?
Non. Le sandbox Java restreint cette action. Pour plus d'informations, consultez Sandbox Java.
La méthode reduce.setup peut-elle lire des données depuis une table d'entrée ?
Vous pouvez lire à partir de la table cache, mais pas à partir de la table d'entrée.
Un Mapper prend-il en charge les entrées multi-partitions provenant de la même table ?
Les Mappers prennent en charge les entrées provenant de plusieurs partitions au sein d'une seule table. Chaque partition peut être traitée comme une table indépendante.
Un Mapper peut-il lire directement les informations de champ de partition à partir d'un Record ?
Un Mapper ne peut pas récupérer les informations de champ de partition à partir d'un Record. Toutefois, vous pouvez utiliser le code suivant. PartitionSpec fournit les informations de partition.
PartitionSpec ps = context.getInputTableInfo().getPartitionSpec();
String area = ps.get(“area”);
Quelle est la relation entre un libellé et une partition ?
Un libellé est un tag appliqué à différentes sorties. Il permet d'identifier la source d'une sortie.
Une tâche MapReduce peut-elle contenir uniquement une fonction Map ?
Oui. MapReduce prend en charge les tâches Map-Only. Pour une tâche Map-Only, définissez explicitement le nombre de Reducers à 0 en utilisant job.setNumReduceTasks(0).
Chaque enregistrement d'une table d'entrée dans un Mapper peut-il être lu par nom de colonne ?
Oui. Vous pouvez lire chaque enregistrement d'une table d'entrée par son numéro ordinal, tel que record.get(i), ou par son nom de colonne, tel que record.get("size").
Quelle est la différence entre write(Record key, Record value) et write(Record record) ?
-
write(Record key, Record value): Produit des résultats intermédiaires, tels quekey.set("id", v1),value.set("size", v2). Les résultats intermédiaires générés par la fonction Map sont envoyés à la fonction Reduce via le réseau. Étant donné qu'aucune table n'est associée pour l'inférence de type, vous devez déclarer les types de champs pour la sérialisation. Les types de champs de sortie sont des types de données MaxCompute.job.setMapOutputKeySchema(SchemaUtils.fromString(“id:string”)); job.setMapOutputValueSchema(SchemaUtils.fromString(“size:bigint”)); write(Record record): Produit des résultats dans la table de destination. Étant donné qu'une table est associée pour l'inférence de type, vous n'avez pas besoin de déclarer les types de champs.
Dans MaxCompute MapReduce, pourquoi dois-je spécifier deux JAR : Libjars et Classpath ?
Le client local effectue la configuration de la tâche et d'autres opérations impliquant une exécution distante. Par conséquent, un exécuteur s'exécute sur le client local et un autre sur le serveur distant.
L'exécuteur distant charge le Classpath distant, qui est -libjars mapreduce-examples.jar. L'exécuteur local charge le Classpath local ; vous devez donc également spécifier -classpath lib/mapreduce-examples.jar.
Puis-je utiliser directement le code source de Hadoop MapReduce dans MaxCompute MapReduce ?
Non. L'API MaxCompute MapReduce diffère de l'API Hadoop MapReduce, mais leurs styles de programmation sont similaires. Vous devez modifier le code source Hadoop et le compiler avec le kit de développement logiciel (SDK) MaxCompute MapReduce avant de pouvoir exécuter le code sur MaxCompute.
Comment implémenter le tri dans MapReduce ?
Utilisez le code suivant pour le tri.
// Set the sort columns. Here, the data is sorted by the i1 and i2 fields.
job.setOutputKeySortColumns(new String[] { "i1", "i2" });
// Set the sort order for the columns. Here, i1 is sorted in ascending order and i2 is sorted in descending order.
job.setOutputKeySortOrder(new SortOrder[] { SortOrder.ASC, SortOrder.DESC });
Voici comment utiliser la méthode setOutputKeySortOrder.
public void setOutputKeySortOrder(JobConf.SortOrder[] order)
Function: Sets the sort order of the key columns.
Parameter: Order specifies the sort order of the columns. Valid values: ASC (ascending) and DESC (descending).
Que sont les sauvegardes (Backups) dans MapReduce ?
Les sauvegardes (Backups) sont une fonctionnalité d'optimisation des performances. MaxCompute surveille vos tâches. Si une tâche a une charge de travail importante, MaxCompute démarre une tâche de sauvegarde pour celle-ci. Les deux tâches traitent les mêmes données et le résultat de la tâche qui se termine en premier est utilisé. Cette fonctionnalité est appelée Backups. Toutefois, si la tâche est très volumineuse, les sauvegardes peuvent ne pas être efficaces car ni la tâche originale ni la tâche de sauvegarde ne peuvent se terminer.
Lors du développement d'une tâche MapReduce, comment transmettre plusieurs ressources dans la ligne de commande ?
Séparez les ressources par des virgules (,), par exemple, jar -resource resource1,resource2,...
Comment déterminer si une table est vide dans la méthode principale ?
Utilisez le code suivant pour déterminer si une table est vide.
Odps odps=SessionState.get().getOdps();
Table table=odps.tables().get('tableName');
RecordReader recordReader=table.read(1);
if(recordReader.read()==null){
//TO DO
Dans MaxCompute MapReduce, comment configurer le code Java pour l'impression des journaux ?
Utilisez l'une des méthodes suivantes :
Utilisez
System.out.printlndans votre code pour imprimer les journaux. Les journaux sont affichés dans stdout dans Logview.Lorsqu'une exception se produit, le client renvoie un message d'exception. Vous n'avez pas besoin d'imprimer les informations de journal.
Utilisez la journalisation standard. Les journaux sont affichés dans stderr, que vous pouvez consulter dans Logview.
La table de destination conservera-t-elle les données en double après deux calculs MapReduce ?
Oui. Lorsque vous interrogez les données, vous récupérerez deux enregistrements identiques.
Dans Hadoop, je peux sélectionner plusieurs nœuds pour le traitement distribué. Comment configurer les nœuds pour le traitement distribué dans MaxCompute MapReduce ?
Vous n'avez pas besoin de construire et d'allouer les nœuds vous-même. C'est l'un des avantages de MaxCompute.
Lorsque vous exécutez une tâche MapReduce, le système sous-jacent de MaxCompute détermine les partitions de données à utiliser en fonction de son algorithme.
La sortie est normale sans Combiner, mais la fonction Reduce ne reçoit aucune entrée lorsqu'un Combiner est utilisé. Pourquoi ?
Ce problème se produit parce que l'enregistrement unique produit par la fonction Reduce est incohérent avec la paire clé-valeur produite par la fonction Map.
Dans une tâche MapOnly, pourquoi le programme ne spécifie-t-il pas le format de schéma de la table de sortie ?
Le schéma de la table de sortie doit être créé à l'avance et spécifié lors de l'exécution de l'instruction create table. Le programme MapOnly n'a pas besoin de spécifier le schéma et peut produire des données directement.
Comment appeler localement un serveur MaxCompute pour exécuter une tâche MapReduce ?
Généralement, vous pouvez exécuter un package JAR MaxCompute en exécutant la commande jar dans l'interface de ligne de commande. Pour plus d'informations, consultez Soumettre une tâche MapReduce.
Vous pouvez également intégrer le package dans votre projet en mode simulation. La procédure est la suivante :
-
Définissez les dépendances du package.
Outre le SDK de base, d'autres packages de dépendance sont requis. Vous pouvez les trouver dans le dossier lib de l'outil client. Le dossier lib contient également le package JAR du SDK. Nous vous recommandons d'importer tous les packages JAR du dossier lib du dernier outil client.
-
Téléchargez le package JAR.
Emballez le programme MapReduce qui a passé les tests locaux dans un fichier JAR et téléchargez-le. Par exemple, supposons que le fichier JAR soit nommé mr.jar. Pour plus d'informations, consultez Opérations sur les ressources.
-
Définissez le mode d'exécution.
Configurez JobConf. Voici un exemple de configuration.
// Configure the MaxCompute connection information. Account account = new AliyunAccount(accessid, accesskey); Odps odps = new Odps(account); odps.setEndpoint(endpoint); odps.setDefaultProject(project); // Get the session. SessionState ss = SessionState.get(); ss.setOdps(odps); ss.setLocalRun(false); // Set the value to false to run the job on the server. To debug the job locally, set the value to true. // The code for setting jobconf. Job job = new Job(); String resource = “mr.jar”; job.setResources(resource); // This step is similar to the 'jar -resources mr.jar' command. // The following code follows the standard MapReduce rules. job.setMapperClass(XXXMapper.class); job.setReducerClass(XXXReducer.class);Une fois la configuration terminée, vous pouvez exécuter la tâche MapReduce directement.
Comment résoudre l'erreur BufferOverflowException qui se produit lors de l'exécution d'une tâche MaxCompute MapReduce ?
-
Symptôme :
Lorsque vous exécutez une tâche MaxCompute MapReduce, l'erreur suivante est renvoyée.
FAILED: ODPS-0123131:User defined function exception - Traceback: java.nio.BufferOverflowException at java.nio.DirectByteBuffer.put(Unknown Source) at com.aliyun.odps.udf.impl.batch.TextBinary.put(TextBinary.java:35) -
Cause :
La quantité de données écrites en une seule fois est trop importante, ce qui provoque un dépassement de tampon.
-
Solution :
Les limites suivantes s'appliquent aux types de données pouvant être écrits dans un seul champ dans MaxCompute.
String 8 MB Bigint -9223372036854775807 to 9223372036854775807 Boolean True/False Double -1.0 10308 to 1.0 10308 Date 0001-01-01 00:00:00 to 9999-12-31 23:59:59
Comment résoudre l'erreur « Resource not found » qui se produit lors de l'exécution d'une tâche MaxCompute MapReduce ?
Lors de la soumission d'une tâche, utilisez le paramètre -resources pour spécifier les ressources requises. Vous pouvez séparer plusieurs ressources par des virgules (,).
Comment résoudre l'erreur « Class Not Found » qui se produit lors de l'exécution d'une tâche MaxCompute MapReduce ?
Cette erreur se produit dans les deux situations suivantes lors de l'exécution d'une tâche MapReduce :
Le nom de classe pour le paramètre
classpathest incorrect. Vous devez spécifier le nom complet du package.Une erreur s'est produite lors de l'emballage du JAR. Assurez-vous de sélectionner tout le code source dans le répertoire SRC lors de l'emballage.
Comment résoudre l'erreur ODPS-0010000 qui se produit lors de l'exécution d'une tâche MaxCompute MapReduce ?
-
Symptôme :
Lorsque vous exécutez une tâche MaxCompute MapReduce, l'erreur suivante est renvoyée.
ODPS-0010000: System internal error - get input pangu dir meta fail. -
Cause :
Cette erreur se produit parce que vous essayez d'utiliser une partition avant qu'elle ne soit créée ou avant que ses données ne soient prêtes.
-
Solution :
Créez la partition avant d'exécuter la tâche MapReduce.
Comment résoudre l'erreur « Table not found » qui se produit lors de l'exécution d'une tâche MaxCompute MapReduce ?
-
Symptôme :
Lorsque vous exécutez une tâche MaxCompute MapReduce, l'erreur suivante est renvoyée.
Exception in thread "main" com.aliyun.odps.OdpsException: Table not found: project_name.table_name. -
Cause :
Le projet de destination est incorrect ou la table de destination n'existe pas.
-
Solution :
Le Table Info Builder de l'interface MapReduce requiert ProjectName et TableName. Définissez ces deux paramètres avec le nom correct du projet et de la table.
Comment résoudre l'erreur ODPS-0123144 qui se produit lors de l'exécution d'une tâche MaxCompute MapReduce ?
-
Symptôme :
Lorsque vous exécutez une tâche MaxCompute MapReduce, l'erreur suivante est renvoyée.
FAILED: ODPS-0123144: Fuxi job failed - WorkerRestar -
Cause :
Cette erreur se produit parce qu'un nœud secondaire du cluster expire pendant le calcul. Le nœud principal considère alors le nœud secondaire comme défaillant et signale une erreur. La période d'expiration est de 10 minutes et ne peut pas être configurée par les utilisateurs.
-
Solution :
Une cause courante de cette erreur est une boucle importante dans la fonction Reduce, qui peut être causée par des données à longue traîne ou un produit cartésien. Essayez de minimiser ces grandes boucles.
Comment résoudre l'erreur java.security.AccessControlException qui se produit lors de l'exécution d'une tâche MaxCompute MapReduce ?
-
Symptôme :
Lorsque vous exécutez une tâche MaxCompute MapReduce, l'erreur suivante est renvoyée.
FAILED: ODPS-0123131:User defined function exception - Traceback: java.lang.ExceptionInInitializerError ... Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getProtectionDomain") at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) -
Cause :
Cette erreur se produit parce que votre code viole les restrictions du sandbox. Pour plus d'informations, consultez Sandbox Java.
-
Solution :
Pour résoudre cette erreur, vous devez accéder à des ressources externes. Toutefois, MaxCompute ne prend actuellement pas en charge cette opération. Vous devez stocker la logique de traitement externe et les données associées dans MaxCompute pour y accéder. Pour lire les fichiers de configuration, consultez Utiliser des fichiers de ressources.
Comment résoudre l'erreur java.io.IOException qui se produit lors de l'exécution d'une tâche MaxCompute MapReduce ?
-
Symptôme :
Lorsque vous exécutez une tâche MaxCompute MapReduce, l'erreur suivante est renvoyée.
Exception in thread “main“ java.io.IOException: ODPS-0740001: Too many local-run maps: 101, must be <= 100(specified by local-run parameter ‘odps.mapred.local.map.max.tasks‘) -
Cause :
La valeur par défaut de local-run maps est 100, ce qui doit être ajusté.
-
Solution :
Ajoutez la configuration
-Dodps.mapred.local.map.max.tasks=200.
Comment résoudre l'erreur « Exceed maximum read times » qui se produit lors de l'exécution d'une tâche MaxCompute MapReduce ?
-
Symptôme :
Lorsque vous exécutez une tâche MaxCompute MapReduce, l'erreur suivante est renvoyée.
ODPS-0730001: Exceed maximum read times per resource -
Cause :
Le fichier de ressources a été lu trop de fois.
-
Solution :
Vérifiez la logique du code pour la lecture de la ressource. Généralement, une ressource ne doit être lue qu'une seule fois lors de la phase de configuration (setup). Ne lisez pas la ressource plusieurs fois lors de la phase Map ou Reduce.
Une erreur de mémoire insuffisante (out of memory) se produit avant le démarrage de la fonction Reduce. Comment résoudre ce problème ?
-
Cause :
Certaines données sont trop volumineuses et provoquent un dépassement lors de leur chargement en mémoire.
-
Solution :
Supprimez le Combiner ou limitez la taille dans le Combiner en utilisant
set odps.mapred.map.min.split.size=512;.
Comment résoudre une erreur de mémoire insuffisante (out of memory) qui se produit lors de l'exécution d'une tâche MaxCompute MapReduce ?
Une erreur de mémoire insuffisante est généralement causée par un manque de mémoire. Vous pouvez résoudre ce problème en ajustant les paramètres de mémoire JVM, tels que odps.stage.mapper.jvm.mem et odps.stage.reducer.jvm.mem. Par exemple, exécutez la commande set odps.stage.mapper.jvm.mem = 2048 pour définir la mémoire sur 2 Go.
Lors de l'exécution d'une tâche MaxCompute MapReduce, 600 Reducers sont démarrés pour charger un petit fichier de configuration, mais une erreur java.lang.OutOfMemoryError se produit. Comment résoudre ce problème ?
-
Symptôme :
Lorsque vous exécutez une tâche MaxCompute MapReduce, l'erreur suivante est renvoyée.
java.lang.OutOfMemoryError: Java heap space -
Cause :
Ce problème est causé par les limites d'utilisation de MapReduce. Pour plus d'informations, consultez Limites.
-
Solution :
Configurez les paramètres comme décrit dans Aperçu du SDK natif.
Comment résoudre l'erreur ODPS-0420095 qui se produit lors de l'exécution d'une tâche MaxCompute MapReduce ?
-
Symptôme :
Lorsque vous exécutez une tâche MaxCompute MapReduce, l'erreur suivante est renvoyée.
Exception in thread "main" java.io.IOException: com.aliyun.odps.OdpsException: ODPS-0420095: Access Denied - The task is not in release range: LOT -
Cause :
Le projet utilise des ressources MaxCompute Developer Edition. Cette édition prend en charge uniquement les tâches MaxCompute SQL (y compris les UDF) et PyODPS. Elle ne prend pas en charge d'autres tâches telles que MapReduce ou Spark.
-
Solution :
Pour mettre à niveau les spécifications du projet, consultez Basculer entre les méthodes de facturation.
Une erreur « Too many open files » se produit lors de l'utilisation de ressources dans MapReduce. Comment résoudre ce problème ?
-
Symptôme :
Lorsque vous utilisez des ressources dans MapReduce, l'erreur suivante est renvoyée.
Caused by: com.aliyun.odps.OdpsException: java.io.FileNotFoundException: temp/mr_XXXXXX/resource/meta.user.group.config (Too many open files) -
Cause :
Une seule tâche ne peut pas référencer plus de 256 ressources. Sinon, une erreur se produit. Les ressources de table et les ressources Archive sont chacune comptées comme une unité. Pour plus d'informations sur les limites, consultez Limites.
-
Solution :
Ajustez le nombre de ressources référencées.
J'utilise une classe tierce dans un programme MapReduce et j'emballe un fichier JAR Assembly. Une erreur « class not found » se produit au moment de l'exécution. Comment résoudre ce problème ?
Lorsqu'une tâche MaxCompute MapReduce s'exécute dans un environnement distribué, elle est soumise aux restrictions du sandbox Java. Le programme principal de la tâche MapReduce n'est pas soumis à ces restrictions. Pour plus d'informations sur les restrictions, consultez Sandbox Java.
Si vous avez uniquement besoin de traiter du JSON, utilisez Gson directement. Vous n'avez pas besoin d'emballer la classe Gson. Les composants open source Java fournissent de nombreuses méthodes pour convertir des chaînes en dates, telles que SimpleDateFormat.
Une erreur « index out of bounds » se produit lors de l'exécution d'une tâche MapReduce compatible avec les logiciels open source sur MaxCompute. Comment résoudre ce problème ?
Nous vous recommandons d'utiliser l'interface MaxCompute MapReduce pour écrire votre code. Nous vous recommandons également d'utiliser Spark plutôt que MapReduce, sauf si cela est nécessaire.