

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Exportation, importation, interrogation et jointure de tables dans DynamoDB à l'aide d'Amazon EMR
<a name="EMRforDynamoDB"></a>

**Note**  
Le connecteur Amazon EMR-DynamoDB est open source sur. GitHub Pour de plus amples informations, veuillez consulter [https://github.com/awslabs/emr-dynamodb-connector](https://github.com/awslabs/emr-dynamodb-connector).

DynamoDB est un service de base de données NoSQL entièrement géré offrant des performances rapides et prévisibles avec une scalabilité simple. Les développeurs peuvent créer une table de base de données et développer sans limite son trafic de demandes ou son stockage. DynamoDB répartit automatiquement les données et le trafic de la table sur un nombre de serveurs approprié afin de gérer le volume de requêtes spécifié par le client et la quantité de données stockées, tout en assurant la cohérence et la rapidité des performances. Avec Amazon EMR et Hive, vous pouvez traiter rapidement et efficacement de grandes quantités de données, telles que les données stockées dans DynamoDB. Pour plus d'informations sur DynamoDB, consultez le [manuel du développeur Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/).

Apache Hive est une couche logicielle que vous pouvez utiliser pour interroger, mapper ou réduire les clusters à l'aide d'un langage de requête simplifié de type SQL, appelé HiveQL. Il s'exécute sur l'architecture Hadoop. Pour plus d'informations sur Hive et HiveQL, consultez le [Manuel du langage HiveQL](https://cwiki.apache.org/confluence/display/Hive/LanguageManual). Pour plus d'informations sur Hive et Amazon EMR, consultez [Apache Hive](emr-hive.md) .

Vous pouvez utiliser Amazon EMR avec une version personnalisée de Hive qui inclut une connectivité à DynamoDB pour effectuer des opérations sur les données stockées dans DynamoDB :
+ Chargement des données DynamoDB dans le système de fichier distribué Hadoop (HDFS) et son utilisation en tant qu'entrée dans un cluster Amazon EMR.
+ Interrogation de données DynamoDB en direct à l'aide d'instructions de type SQL (HiveQL).
+ Jointure de données stockées dans DynamoDB et exportation ou interrogation par rapport aux données jointes.
+ Exportation de données stockées dans DynamoDB vers Amazon S3.
+ Importation de données stockées dans Amazon S3 vers DynamoDB.

**Note**  
Le connecteur Amazon EMR-DynamoDB ne prend pas en charge les clusters configurées pour utiliser l'[authentification Kerberos](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-kerberos.html).

Pour exécuter chacune des tâches suivantes, vous allez lancer un cluster Amazon EMR, spécifier l'emplacement des données dans DynamoDB et émettre des commandes Hive pour manipuler les données dans DynamoDB. 

Il existe plusieurs manières de lancer un cluster Amazon EMR : vous pouvez utiliser la console Amazon EMR, l'interface de ligne de commande (CLI), ou vous pouvez programmer votre cluster à l'aide d'un AWS SDK ou de l'API Amazon EMR. Vous pouvez également choisir d'exécuter un cluster Hive de façon interactive ou à partir d'un script. Dans cette section, nous allons vous montrer comment lancer un cluster Hive interactif à partir de la console et de l'interface de ligne de commande Amazon EMR. 

L'utilisation interactive de Hive est un excellent moyen de tester les performances des requêtes et de régler votre application. Une fois que vous avez défini un ensemble de commandes Hive qui s'exécuteront régulièrement, envisagez de créer un script Hive qu'Amazon EMR peut exécuter automatiquement. 

**Avertissement**  
Les opérations Amazon EMR de lecture et d'écriture sur une table DynamoDB desservent votre débit réservé établi, en augmentant potentiellement la fréquence des exceptions de débit réservé. Pour les demandes importantes, Amazon EMR implémente de nouvelles tentatives avec un backoff exponentiel pour gérer la charge des demandes sur la table DynamoDB. L'exécution simultanée de travaux Amazon EMR avec le reste du trafic peut entraîner un dépassement du niveau de débit réservé alloué. Vous pouvez contrôler cela en vérifiant la **ThrottleRequests**métrique sur Amazon CloudWatch. Si la charge de la demande est trop élevée, vous pouvez relancer le cluster et diminuer la valeur [Paramètre de pourcentage de lecture](EMR_Hive_Optimizing.md#ReadPercent) ou [Paramètre de pourcentage d'écriture](EMR_Hive_Optimizing.md#WritePercent) afin de limiter les opérations Amazon EMR. Pour de plus amples informations sur les paramètres de débit DynamoDB, veuillez consulter [Débit alloué](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithDDTables.html#ProvisionedThroughput).   
Si une table est configurée pour le [mode à la demande](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.OnDemand), vous devez la remettre en mode provisionné avant d'exécuter une opération d'exportation ou d'importation. Les pipelines ont besoin d'un ratio de débit pour calculer les ressources à utiliser à partir d'une DynamoDBtable. Le mode à la demande supprime le débit provisionné. Pour provisionner la capacité de débit, vous pouvez utiliser les métriques Amazon CloudWatch Events pour évaluer le débit agrégé utilisé par une table.

**Topics**
+ [Configuration d'une table Hive pour exécuter des commandes Hive](EMR_Interactive_Hive.md)
+ [Exemples de commandes Hive pour l'exportation, l'importation et l'interrogation de données dans DynamoDB](EMR_Hive_Commands.md)
+ [Optimisation des performances pour les opérations Amazon EMR dans DynamoDB](EMR_Hive_Optimizing.md)

# Configuration d'une table Hive pour exécuter des commandes Hive
<a name="EMR_Interactive_Hive"></a>

Apache Hive est une application d'entrepôt des données que vous pouvez utiliser pour interroger les données contenues dans les clusters Amazon EMR à l'aide d'un langage de type SQL. Pour plus d'informations sur Hive, consultez le site [http://hive.apache.org/](http://hive.apache.org/).

La procédure suivante suppose que vous avez déjà créé un cluster et spécifié une paire de clés Amazon EC2. Pour savoir comment commencer à créer des clusters, consultez la section [Premiers pas avec Amazon EMR](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-gs) dans le *Guide de gestion Amazon EMR*.

## Configurer Hive pour utiliser MapReduce
<a name="hive-mapreduce"></a>

Lorsque vous utilisez Hive sur Amazon EMR pour interroger les tables DynamoDB, des erreurs peuvent se produire si Hive utilise le moteur d'exécution par défaut, Tez. C'est pourquoi, lorsque vous créez un cluster avec Hive qui s'intègre à DynamoDB comme décrit dans cette section, nous vous recommandons d'utiliser une classification de configuration qui définit Hive à utiliser. MapReduce Pour de plus amples informations, veuillez consulter [Configuration des applications](emr-configure-apps.md).

L'extrait suivant montre la classification de configuration et les propriétés à utiliser pour définir MapReduce comme moteur d'exécution pour Hive :

```
[
                {
                    "Classification": "hive-site",
                    "Properties": {
                        "hive.execution.engine": "mr"
                    }
                }
             ]
```<a name="EMR_Interactive_Hive_session"></a>

**Pour exécuter les commandes Hive de façon interactive**

1. Connectez-vous au nœud maître. Pour plus d'informations, consultez [Connexion au nœud principal à l'aide de SSH](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html) dans le *Guide de gestion d'Amazon EMR*.

1. A l'invite de commande pour le nœud maître actuel, tapez `hive`.

   Vous devez voir une invite Hive : `hive>`

1.  Entrez une commande Hive qui mappe une table de l'application Hive aux données dans DynamoDB. Ce tableau agit comme référence pour les données stockées dans Amazon DynamoDB ; les données ne sont pas stockées localement dans Hive et les requêtes utilisant cette table s'exécutent sur les données en direct dans DynamoDB et consomment la capacité en lecture ou en écriture de la table chaque fois qu'une commande est exécutée. Si vous prévoyez d'exécuter plusieurs commandes Hive sur le même ensemble de données, pensez d'abord à l'exporter. 

    L'exemple suivant montre la syntaxe pour mapper une table Hive à une table DynamoDB. 

   ```
   CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...)
   STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
   TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", 
   "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...");
   ```

    Lorsque vous créez une table dans Hive depuis DynamoDB, vous devez la créer en tant que table externe à l'aide du mot clé `EXTERNAL`. La différence entre les tables internes et externes est que les données des tables internes sont supprimées lorsqu'une table interne est supprimée. Il ne s'agit pas du comportement souhaité lorsque vous êtes connecté à Amazon DynamoDB, si bien que seules les tables externes sont prises en charge. 

    Par exemple, la commande Hive suivante crée une table nommée *hivetable1* dans Hive qui fait référence à la table DynamoDB nommée *dynamodbtable1*. La *table* DynamoDB dynamodbtable1 possède un schéma de clé primaire. hash-and-range L'élément de clé de hachage est `name` (type de chaîne), l'élément de clé de plage est `year` (type numérique) et chaque élément a une valeur d'attribut pour `holidays` (type string set). 

   ```
   CREATE EXTERNAL TABLE hivetable1 (col1 string, col2 bigint, col3 array<string>)
   STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
   TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", 
   "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays");
   ```

    La ligne 1 utilise l'instruction HiveQL `CREATE EXTERNAL TABLE`. Pour *hivetable1*, vous devez établir une colonne pour chaque paire nom-valeur d'attribut de la table DynamoDB et fournir le type de données. Ces valeurs ne sont pas sensibles à la casse et vous pouvez donner aux colonnes le nom de votre choix (à l'exception des mots réservés). 

    La ligne 2 utilise l'instruction `STORED BY`. La valeur de `STORED BY` est le nom de la classe qui gère la connexion entre Hive et DynamoDB. Cette valeur doit être définie sur `'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'`. 

    La ligne 3 utilise l'instruction `TBLPROPERTIES` pour associer « hivetable1 » à la table et au schéma appropriés dans DynamoDB. Fournissez à `TBLPROPERTIES` les valeurs des paramètres `dynamodb.table.name` et `dynamodb.column.mapping`. Ces valeurs *sont* sensibles à la casse.
**Note**  
 Tous les noms d'attribut DynamoDB de la table doivent avoir les colonnes correspondantes dans la table Hive. En fonction de votre version d'Amazon EMR, les scénarios suivants se produisent si le one-to-one mappage n'existe pas :  
Sur Amazon EMR version 5.27.0 et versions ultérieures, le connecteur dispose de validations qui garantissent un mappage one-to-one entre les noms d'attributs DynamoDB et les colonnes de la table Hive. Une erreur se produira si le one-to-one mappage n'existe pas.
Sur Amazon EMR version 5.26.0 et antérieure, la table Hive ne contient pas de paire nom-valeur de DynamoDB. Si vous ne mappez pas les attributs de clé primaire DynamoDB, Hive génère une erreur. Si vous ne mappez pas un attribut de clé non primaire, aucune erreur n'est générée, mais vous ne voyez pas les données de la table Hive. Si les types de données ne correspondent pas, la valeur est null. 

Ensuite, vous pouvez commencer à exécuter les opérations Hive sur *hivetable1*. Les requêtes exécutées sur *hivetable1* sont exécutées en interne sur la table DynamoDB *dynamodbtable1* de votre compte DynamoDB et consomment des unités de lecture ou d'écriture à chaque exécution.

Lorsque vous exécutez les requêtes Hive sur une table DynamoDB, vous devez vous assurer que vous avez alloué une quantité suffisante d'unités de capacité de lecture.

Par exemple, supposons que vous ayez provisionné 100 unités de capacité en lecture pour votre table DynamoDB. Vous pourrez ainsi effectuer 100 lectures, ou 409 600 octets, par seconde. Si cette table contient 20 Go de données (21 474 836 480 octets) et que votre requête Hive exécute une analyse complète de la table, vous pouvez estimer la durée d'exécution de la requête :

 * 21 474 836 480 / 409 600 = 52 429 secondes = 14,56 heures * 

Le seul moyen de diminuer le temps nécessaire consiste à ajuster les unités de capacité de lecture sur la table DynamoDB source. L'ajout de nœuds Amazon EMR supplémentaires n'y changera rien.

Dans la sortie Hive, le pourcentage d'achèvement est mis à jour lorsqu'un ou plusieurs processus de mappeurs sont terminés. Pour une table DynamoDB volumineuse avec un paramètre de faible capacité allouée en lecture, la sortie du pourcentage d'achèvement peut ne pas être mise à jour pendant longtemps. Dans le cas décrit ci-dessus, la tâche apparaît complète à 0 % pendant plusieurs heures. Pour un état plus détaillé de l'avancement de votre tâche, accédez à la console Amazon EMR ; vous serez en mesure d'afficher l'état des tâches de chaque mappeur et des statistiques de lecture des données. Vous pouvez également vous connecter à l'interface Hadoop sur le nœud maître et voir les statistiques Hadoop. Vous visualisez ainsi l'état des tâches de chaque carte et certaines statistiques de lecture des données. Pour plus d’informations, consultez les rubriques suivantes :
+ [Interfaces web hébergées sur le nœud principal](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-web-interfaces.html)
+ [Afficher les interfaces web Hadoop](https://docs.aws.amazon.com/emr/latest/ManagementGuide/UsingtheHadoopUserInterface.html)

Pour plus d'informations sur les exemples d'instructions HiveQL permettant d'exécuter des tâches telles que l'exportation ou l'importation de données depuis DynamoDB et la jointure de tables, consultez [Exemples de commandes Hive pour l'exportation, l'importation et l'interrogation de données dans DynamoDB](EMR_Hive_Commands.md).<a name="EMR_Hive_Cancel"></a>

**Pour annuler une demande Hive**

Lorsque vous exécutez une requête Hive, la réponse initiale du serveur inclut la commande pour annuler la demande. Pour annuler la demande à tout moment du processus, utilisez la **Kill Command (Commande kill)** de la réponse du serveur.

1. Entrez `Ctrl+C` pour quitter le client de ligne de commande.

1.  À la commande shell, saisissez la **Commande kill** à partir de la réponse initiale du serveur à votre demande. 

    Vous pouvez également exécuter la commande suivante depuis la ligne de commande du nœud principal pour supprimer la tâche Hadoop. Elle contient l'identifiant de la tâche Hadoop et peut être récupérée depuis l'interface utilisateur de Hadoop. *job-id*

   ```
   hadoop job -kill job-id
   ```

## Types de données pour Hive et DynamoDB
<a name="EMR_Hive_Properties"></a>

Le tableau suivant indique les types de données Hive disponibles, le type DynamoDB par défaut auquel ils correspondent et les autres types DynamoDB auxquels ils peuvent également mapper. 


| Type Hive | Type DynamoDB par défaut | Autre(s) type(s) de DynamoDB | 
| --- | --- | --- | 
| chaîne | string (S) |  | 
| bigint ou double | number (N) |  | 
| binary | binary (B) |  | 
| boolean | boolean (BOOL) |  | 
| array | list (L) | number set (NS), string set (SS) ou binary set (BS) | 
| map<string,string> | article | map (M) | 
| map<string,?> | map (M) |  | 
|  | null (NULL) |  | 

Si vous voulez écrire vos données Hive sous la forme d'un autre type DynamoDB correspondant, ou si vos données DynamoDB contiennent des valeurs d'attribut d'un autre type DynamoDB, vous pouvez spécifier la colonne et le type DynamoDB avec le paramètre `dynamodb.type.mapping`. L'exemple suivant montre la syntaxe permettant de spécifier un mappage d’un autre type.

```
CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename",
"dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...",
"dynamodb.type.mapping" = "hive_column1_name:dynamodb_attribute1_datatype");
```

Le paramètre de mappage de type est facultatif et ne doit être spécifié que pour les colonnes qui utilisent d'autres types.

Par exemple, la commande Hive suivante crée une table nommée `hivetable2` qui fait référence à la table DynamoDB `dynamodbtable2`. Elle est équivalent à `hivetable1`, sauf qu'elle mappe la colonne `col3` au type string set (SS). 

```
CREATE EXTERNAL TABLE hivetable2 (col1 string, col2 bigint, col3 array<string>)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable2",
"dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays",
"dynamodb.type.mapping" = "col3:SS");
```

Dans Hive, `hivetable1` et `hivetable2` sont identiques. Toutefois, lorsque les données de ces tables sont écrites dans leurs tables DynamoDB correspondantes, `dynamodbtable1` contient des listes, tandis que `dynamodbtable2` contient des ensembles de chaînes.

Si vous souhaitez écrire des valeurs `null` Hive en tant qu'attributs de type DynamoDB pour `null`, vous pouvez le faire avec le paramètre `dynamodb.null.serialization`. L'exemple suivant montre la syntaxe permettant de spécifier la sérialisation `null`.

```
CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename",
"dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...",
"dynamodb.null.serialization" = "true");
```

Le paramètre de sérialisation null est facultatif ; il est défini sur `false` s'il n'est pas spécifié. Notez que les attributs `null` DynamoDB sont lus en tant que valeurs `null` dans Hive, quel que soit le paramètre. Les collections Hive avec des valeurs `null` peuvent être écrites dans DynamoDB uniquement si le paramètre de sérialisation null est spécifié comme `true`. Sinon, une erreur Hive se produit.

Le type bigint de Hive est identique au type long de Java, et le type double de Hive est le même que le type double de Java en termes de précision. Cela signifie que si vous avez des données numériques stockées dans DynamoDB qui ont une précision supérieure à celle des types de données Hive, l'utilisation de Hive pour exporter, importer ou référencer les données DynamoDB peut entraîner une perte de précision ou un échec de la requête Hive. 

 Les exportations de type binaire de DynamoDB vers Amazon Simple Storage Service (Amazon S3) ou HDFS sont stockées sous la forme d'une chaîne codée en Base64. Si vous importez des données d'Amazon S3 ou HDFS dans le type binaire DynamoDB, elles doivent être encodées en tant que chaîne Base64. 

## Options Hive
<a name="EMR_Hive_Options"></a>

 Vous pouvez définir les options Hive suivantes pour gérer le transfert de données hors d'Amazon DynamoDB. Ces options sont conservées uniquement pour la session Hive en cours. Si vous fermez l'invite de commande Hive et la rouvrez ultérieurement sur le cluster, ces paramètres sont rétablis à leurs valeurs par défaut. 


| Options Hive | Description | 
| --- | --- | 
| dynamodb.throughput.read.percent |   Définissez la vitesse des opérations de lecture pour maintenir votre débit DynamoDB dans la plage allouée pour votre table. La valeur est comprise entre `0.1` et `1.5`, valeurs incluses.   La valeur de 0,5 est la vitesse de lecture par défaut, ce qui signifie que Hive essaie de consommer la moitié des lectures provisionnées dans le cadre des ressources de la table. L'augmentation de cette valeur au-dessus de 0,5 augmente le taux de demandes de lecture. Sa diminution sous 0,5 réduit le taux de demandes de lecture. Cette vitesse de lecture est approximative. La vitesse de lecture réelle dépend de facteurs comme l'existence d'une distribution uniforme des clés dans DynamoDB.   Si vous trouvez que votre débit alloué est fréquemment dépassé par l'opération Hive, ou si le trafic de lecture en direct est trop limité, réduisez cette valeur sous `0.5`. Si vous avez suffisamment de capacité et voulez une opération Hive plus rapide, définissez cette valeur au-dessus de `0.5`. Vous pouvez également sursouscrire en la définissant sur 1,5 si vous pensez qu'il existe des opérations d'entrée/sortie inutilisées disponibles.   | 
| dynamodb.throughput.write.percent |   Définissez la vitesse des opérations d'écriture pour maintenir votre débit DynamoDB dans la plage allouée pour votre table. La valeur est comprise entre `0.1` et `1.5`, valeurs incluses.   La valeur de 0,5 est la vitesse d'écriture par défaut, ce qui signifie que Hive essaie d'utiliser la moitié des écritures provisionnées dans le cadre des ressources de la table. L'augmentation de cette valeur au-dessus de 0,5 augmente le taux de demandes d'écriture. Sa diminution sous 0,5 réduit le taux de demandes d'écriture. Cette vitesse d'écriture est approximative. La vitesse d'écriture réelle dépend de facteurs comme l'existence d'une distribution uniforme des clés dans DynamoDB.   Si vous trouvez que votre débit alloué est fréquemment dépassé par l'opération Hive ou si le trafic d'écriture en direct est trop limité, réduisez cette valeur sous `0.5`. Si vous avez suffisamment de capacité et voulez une opération Hive plus rapide, définissez cette valeur au-dessus de `0.5`. Vous pouvez également sursouscrire en la définissant jusqu'à 1,5 si vous pensez qu'il existe des opérations d'entrée/sortie inutilisées disponibles ou qu'il s'agit du chargement des données initiales sur la table et qu'il n'y pas encore de trafic en direct.   | 
| dynamodb.endpoint | Spécifiez le point de terminaison pour le service DynamoDB. Pour plus d'information sur les points de terminaison DynamoDB disponibles, consultez [Régions et points de terminaison](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region).  | 
| dynamodb.max.map.tasks |   Spécifiez le nombre maximal de tâches de mappage lors de la lecture des données à partir de DynamoDB. Cette valeur doit être supérieure ou égale à 1.   | 
| dynamodb.retry.duration |   Spécifiez le nombre de minutes à utiliser comme délai d'expiration pour répéter les commandes Hive. Cette valeur doit être un entier supérieur ou égal à 0. Le délai d'expiration par défaut est de deux minutes.   | 

 Ces options sont définies à l'aide de la commande `SET`, comme illustré dans l'exemple suivant. 

```
SET dynamodb.throughput.read.percent=1.0; 

INSERT OVERWRITE TABLE s3_export SELECT * 
FROM hiveTableName;
```

# Exemples de commandes Hive pour l'exportation, l'importation et l'interrogation de données dans DynamoDB
<a name="EMR_Hive_Commands"></a>

Les exemples suivants utilisent les commandes Hive afin d'effectuer des opérations telles que l'exportation de données vers Amazon S3 ou HDFS, l'importation de données vers DynamoDB, la jointure de tables, l'interrogation de tables, et plus encore. 

Les opérations sur une table Hive référencent les données stockées dans DynamoDB. Les commandes Hive sont soumises aux paramètres de débit alloué de la table DynamoDB et les données extraites incluent les données écrites dans la table DynamoDB au moment où la demande d'opération Hive est traitée par DynamoDB. Si le processus de récupération des données prend du temps, certaines données retournées par la commande Hive peuvent avoir été mises à jour dans DynamoDB depuis que la commande Hive a commencé. 

Les commandes Hive `DROP TABLE` et `CREATE TABLE` agissent uniquement sur les tables locales de Hive et ne créent ni ne suppriment de tables dans DynamoDB. Si votre requête Hive fait référence à une table dans DynamoDB, cette table doit déjà exister avant que vous exécutiez la requête. Pour plus d'informations sur la création et la suppression de tables dans DynamoDB, consultez [Utilisation de tables dans DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html) dans le *Guide du développeur Amazon DynamoDB*. 

**Note**  
 Lorsque vous mappez une table Hive à un emplacement dans Amazon S3, ne la mappez pas au chemin racine du bucket, s3://amzn-s3-demo-bucket, car cela peut provoquer des erreurs lorsque Hive écrit les données dans Amazon S3. Mappez plutôt la table à un sous-chemin du bucket, s3://amzn-s3-demo-bucket/mypath. 

## Exportation de données à partir de DynamoDB
<a name="EMR_Hive_Commands_exporting"></a>

 Vous pouvez utiliser Hive pour exporter des données à partir de DynamoDB. 

**Pour exporter une table DynamoDB vers un compartiment Amazon S3**
+  Créez une table Hive qui référence les données stockées dans DynamoDB. Ensuite, vous pouvez appeler la commande INSERT OVERWRITE pour écrire les données dans un répertoire externe. Dans l'exemple suivant, *s3://amzn-s3-demo-bucket/path/subpath/* il s'agit d'un chemin valide dans Amazon S3. Ajustez les colonnes et les types de données dans la commande CREATE pour faire correspondre les valeurs dans votre DynamoDB. Vous pouvez l'utiliser pour créer une archive de vos données DynamoDB dans Amazon S3. 

  ```
  1. CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>)
  2. STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
  3. TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", 
  4. "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays");                   
  5.                     
  6. INSERT OVERWRITE DIRECTORY 's3://amzn-s3-demo-bucket/path/subpath/' SELECT * 
  7. FROM hiveTableName;
  ```

**Pour exporter une table DynamoDB vers un compartiment Amazon S3 à l'aide de la compartimentation.**
+  Créez une table externe qui fait référence à un emplacement dans Amazon S3. Cela est présenté ci-dessous en tant que s3\$1export. Pendant l'appel CREATE, spécifiez le formatage des lignes de la table. Puis, lorsque vous utilisez INSERT OVERWRITE pour exporter les données de DynamoDB vers s3\$1export, les données sont écrites au format spécifié. Dans l'exemple suivant, les données sont écrites sous forme de valeurs séparées par des virgules (CSV). 

  ```
   1. CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>)
   2. STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
   3. TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", 
   4. "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays");                      
   5.                     
   6. CREATE EXTERNAL TABLE s3_export(a_col string, b_col bigint, c_col array<string>)
   7. ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
   8. LOCATION 's3://amzn-s3-demo-bucket/path/subpath/';
   9.                     
  10. INSERT OVERWRITE TABLE s3_export SELECT * 
  11. FROM hiveTableName;
  ```

**Pour exporter une table DynamoDB vers un compartiment Amazon S3 sans spécifier de mappage de colonne**
+  Créez une table Hive qui référence les données stockées dans DynamoDB. Cet exemple est similaire au précédent, sauf que vous ne spécifiez pas un mappage de colonne. La table doit avoir exactement une colonne de type `map<string, string>`. Si vous créez ensuite une table `EXTERNAL` dans Amazon S3, vous pouvez appeler la commande `INSERT OVERWRITE` pour écrire les données de DynamoDB vers Amazon S3. Vous pouvez l'utiliser pour créer une archive de vos données DynamoDB dans Amazon S3. Comme il n'y a aucun mappage de colonnes, vous ne pouvez pas interroger les tables qui sont exportées de cette façon. L'exportation de données sans spécifier de mappage de colonne est disponible dans Hive 0.8.1.5 (ou version ultérieure), qui est prise en charge sur l'AMI Amazon EMR 2.2.*x* et les versions ultérieures. 

  ```
   1. CREATE EXTERNAL TABLE hiveTableName (item map<string,string>)
   2. STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
   3. TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1");  
   4.     
   5. CREATE EXTERNAL TABLE s3TableName (item map<string, string>)
   6. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
   7. LOCATION 's3://amzn-s3-demo-bucket/path/subpath/'; 
   8.                 
   9. INSERT OVERWRITE TABLE s3TableName SELECT * 
  10. FROM hiveTableName;
  ```

**Pour exporter une table DynamoDB vers un compartiment Amazon S3 en utilisant la compartimentation des données**
+  Hive fournit plusieurs codecs de compression, que vous pouvez définir durant votre session Hive. Les données exportées sont ainsi compressées au format spécifié. L'exemple suivant compresse les fichiers exportés à l'aide de l'algorithme Lempel-Ziv-Oberhumer (LZO). 

  ```
   1. SET hive.exec.compress.output=true;
   2. SET io.seqfile.compression.type=BLOCK;
   3. SET mapred.output.compression.codec = com.hadoop.compression.lzo.LzopCodec;                    
   4.                     
   5. CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>)
   6. STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
   7. TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", 
   8. "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays");                    
   9.                     
  10. CREATE EXTERNAL TABLE lzo_compression_table (line STRING)
  11. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
  12. LOCATION 's3://amzn-s3-demo-bucket/path/subpath/';
  13.                     
  14. INSERT OVERWRITE TABLE lzo_compression_table SELECT * 
  15. FROM hiveTableName;
  ```

   Les codecs de compression disponibles sont les suivants : 
  +  org.apache.hadoop.io.compress. GzipCodec 
  +  org.apache.hadoop.io.compress. DefaultCodec 
  +  com.hadoop.compression.lzo. LzoCodec 
  +  com.hadoop.compression.lzo. LzopCodec 
  +  org.apache.hadoop.io.compress. BZip2Codec 
  +  org.apache.hadoop.io.compress. SnappyCodec 

**Pour exporter une table DynamoDB vers HDFS**
+  Utilisez la commande Hive suivante, où se *hdfs:///directoryName* trouve un chemin HDFS valide et *hiveTableName* une table dans Hive qui fait référence à DynamoDB. Cette opération d'exportation est plus rapide que l'exportation d'une table DynamoDB vers Amazon S3, car Hive 0.7.1.1 utilise HDFS comme étape intermédiaire lors de l'exportation des données vers Amazon S3. L'exemple suivant montre aussi comment définir `dynamodb.throughput.read.percent` sur 1.0 afin d'augmenter le taux de demande de lecture. 

  ```
  1. CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>)
  2. STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
  3. TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", 
  4. "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); 
  5.                     
  6. SET dynamodb.throughput.read.percent=1.0;                    
  7.                     
  8. INSERT OVERWRITE DIRECTORY 'hdfs:///directoryName' SELECT * FROM hiveTableName;
  ```

   Vous pouvez également exporter les données vers HDFS à l'aide de la mise en forme et de la compression comme indiqué ci-dessus pour l'exportation vers Amazon S3. Pour ce faire, remplacez simplement le répertoire Amazon S3 dans les exemples ci-dessus par un répertoire HDFS. <a name="EMR_Hive_non-printable-utf8"></a>

**Pour lire les données de caractères UTF-8 non affichables dans Hive**
+ Vous pouvez lire et écrire des données de caractères UTF-8 non affichables avec Hive en utilisant la clause `STORED AS SEQUENCEFILE` lorsque vous créez la table. A SequenceFile est le format de fichier binaire Hadoop ; vous devez utiliser Hadoop pour lire ce fichier. L’exemple suivant montre comment exporter des données de DynamoDB vers Amazon S3. Vous pouvez utiliser cette fonctionnalité pour gérer les caractères codés UTF-8 non affichables. 

  ```
   1. CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>)
   2. STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
   3. TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", 
   4. "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays");                      
   5.                     
   6. CREATE EXTERNAL TABLE s3_export(a_col string, b_col bigint, c_col array<string>)
   7. STORED AS SEQUENCEFILE
   8. LOCATION 's3://amzn-s3-demo-bucket/path/subpath/';
   9.                     
  10. INSERT OVERWRITE TABLE s3_export SELECT * 
  11. FROM hiveTableName;
  ```

## Importation de données dans DynamoDB
<a name="EMR_Hive_Commands_importing"></a>

 Lorsque vous écrivez des données sur DynamoDB à l'aide de Hive, vous devez vous assurer que le nombre d'unités de capacité d'écriture est supérieur au nombre de mappeurs dans le cluster. Par exemple, les clusters qui s'exécutent sur les instances EC2 m1.xlarge produisent 8 mappeurs par instance. Dans le cas d'un cluster qui possède 10 instances, cela signifie un total de 80 mappeurs. Si vos unités de capacité en écriture ne sont pas supérieures au nombre de mappeurs dans le cluster, l'opération d'écriture Hive peut consommer la totalité du débit d'écriture ou tenter d'utiliser plus de débit qu'il n'en est alloué. Pour plus d'informations sur le nombre de mappeurs émis par chaque type d'instance EC2, consultez [Configuration de Hadoop](emr-hadoop-config.md).

 Le nombre de mappeurs dans Hadoop est contrôlé par les divisions en entrée. S'il y a trop peu de divisions, votre commande d'écriture peut ne pas être en mesure d'utiliser tout le débit d'écriture disponible. 

 Si un élément avec la même clé existe dans la table DynamoDB cible, il est remplacé. Si aucun élément avec la clé n'existe dans la table DynamoDB cible, l'élément est inséré. 

**Pour importer une table d'Amazon S3 vers DynamoDB**
+  Vous pouvez utiliser Amazon EMR (Amazon EMR) et Hive pour écrire des données d'Amazon S3 vers DynamoDB. 

  ```
  CREATE EXTERNAL TABLE s3_import(a_col string, b_col bigint, c_col array<string>)
  ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
  LOCATION 's3://amzn-s3-demo-bucket/path/subpath/';                    
                      
  CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>)
  STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
  TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", 
  "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays");  
                      
  INSERT OVERWRITE TABLE hiveTableName SELECT * FROM s3_import;
  ```

**Pour importer une table depuis un compartiment Amazon S3 vers DynamoDB sans spécifier de mappage de colonne**
+  Créez une table `EXTERNAL` qui référence les données stockées dans Amazon S3 et précédemment exportées depuis DynamoDB. Avant de les importer, vérifiez que la table existe dans DynamoDB et qu'elle possède le même schéma de clés que la table DynamoDB précédemment exportée. En outre, la table doit avoir une seule colonne de type `map<string, string>`. Si vous créez ensuite une table Hive liée à DynamoDB, vous pouvez appeler la commande `INSERT OVERWRITE` pour écrire les données depuis Amazon S3 vers DynamoDB. Comme il n'existe aucun mappage de colonne, vous ne pouvez pas interroger les tables qui sont importées de cette façon. L'importation de données sans spécifier un mappage de colonne est disponible dans Hive 0.8.1.5 ou version ultérieure, qui est pris en charge sur Amazon EMR AMI 2.2.3.x et version ultérieure. 

  ```
  CREATE EXTERNAL TABLE s3TableName (item map<string, string>)
  ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
  LOCATION 's3://amzn-s3-demo-bucket/path/subpath/'; 
                          
  CREATE EXTERNAL TABLE hiveTableName (item map<string,string>)
  STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
  TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1");  
                   
  INSERT OVERWRITE TABLE hiveTableName SELECT * 
  FROM s3TableName;
  ```

**Pour importer une table de HDFS vers DynamoDB**
+  Vous pouvez utiliser Amazon EMR et Hive pour écrire des données de HDFS vers DynamoDB. 

  ```
  CREATE EXTERNAL TABLE hdfs_import(a_col string, b_col bigint, c_col array<string>)
  ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
  LOCATION 'hdfs:///directoryName';                    
                      
  CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>)
  STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
  TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", 
  "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays");  
                      
  INSERT OVERWRITE TABLE hiveTableName SELECT * FROM hdfs_import;
  ```

## Interrogation de données dans DynamoDB
<a name="EMR_Hive_Commands_querying"></a>

 Les exemples suivants illustrent les différentes façons dont vous pouvez utiliser Amazon EMR pour interroger les données stockées dans DynamoDB. 

**Pour trouver la plus grande valeur pour une colonne mappée (`max`)**
+  Utilisez les commandes de Hive comme suit. Dans la première commande, l'instruction CREATE crée une table Hive qui référence les données stockées dans DynamoDB. L'instruction SELECT utilise ensuite cette table pour interroger les données stockées dans DynamoDB. L'exemple suivant recherche la plus grande commande passée par un client donné. 

  ```
  CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) 
  STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
  TBLPROPERTIES ("dynamodb.table.name" = "Purchases",
  "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items");
  
  SELECT max(total_cost) from hive_purchases where customerId = 717;
  ```

**Pour regrouper les données à l'aide de la clause `GROUP BY`**
+  Vous pouvez utiliser la clause `GROUP BY` pour collecter les données de plusieurs enregistrements. Cette option est souvent utilisée avec une fonction d'agrégation comme somme, décompte, min ou max. L'exemple suivant retourne une liste des commandes les plus importantes des clients ayant passé plus de trois commandes. 

  ```
  CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) 
  STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
  TBLPROPERTIES ("dynamodb.table.name" = "Purchases",
  "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items");
  
  SELECT customerId, max(total_cost) from hive_purchases GROUP BY customerId HAVING count(*) > 3;
  ```

**Pour joindre deux tables DynamoDB**
+  L'exemple suivant mappe deux tables Hive avec des données stockées dans DynamoDB. Il appelle ensuite une jointure entre ces deux tables. La jointure est calculée sur le cluster, puis renvoyée. La jointure n’a pas lieu dans DynamoDB. Cet exemple renvoie une liste de clients et de leurs achats pour ceux ayant passé plus de deux commandes. 

  ```
  CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) 
  STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
  TBLPROPERTIES ("dynamodb.table.name" = "Purchases",
  "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items");
  
  CREATE EXTERNAL TABLE hive_customers(customerId bigint, customerName string, customerAddress array<String>) 
  STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
  TBLPROPERTIES ("dynamodb.table.name" = "Customers",
  "dynamodb.column.mapping" = "customerId:CustomerId,customerName:Name,customerAddress:Address");
  
  Select c.customerId, c.customerName, count(*) as count from hive_customers c 
  JOIN hive_purchases p ON c.customerId=p.customerId 
  GROUP BY c.customerId, c.customerName HAVING count > 2;
  ```

**Pour joindre deux tables de différentes sources**
+  Dans l'exemple suivant, Customer\$1S3 est une table Hive qui charge un fichier CSV stocké dans Amazon S3 et hive\$1purchases est une table qui fait référence aux données de DynamoDB. L'exemple suivant joint les données client stockées comme fichier CSV dans Amazon S3 et les données relatives aux commandes stockées dans DynamoDB pour renvoyer un ensemble de données représentant les commandes passées par les clients ayant « Miller » dans leur nom. 

  ```
  CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) 
  STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
  TBLPROPERTIES ("dynamodb.table.name" = "Purchases",
  "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items");
  
  CREATE EXTERNAL TABLE Customer_S3(customerId bigint, customerName string, customerAddress array<String>)
  ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
  LOCATION 's3://amzn-s3-demo-bucket/path/subpath/';
  
  Select c.customerId, c.customerName, c.customerAddress from 
  Customer_S3 c 
  JOIN hive_purchases p 
  ON c.customerid=p.customerid 
  where c.customerName like '%Miller%';
  ```

**Note**  
 Dans les exemples précédents, les instructions CREATE TABLE ont été incluses dans chaque exemple pour des raisons de clarté et d'exhaustivité. Lorsque vous exécutez plusieurs requêtes ou opérations d'exportation sur une table Hive donnée, vous ne devez créer la table qu'une seule fois, au début de la session Hive. 

# Optimisation des performances pour les opérations Amazon EMR dans DynamoDB
<a name="EMR_Hive_Optimizing"></a>

 Les opérations Amazon EMR sur une table DynamoDB sont considérées comme des opérations de lecture, et sont soumises aux paramètres de débit approvisionnés de la table. Amazon EMR implémente sa propre logique pour l'équilibrage de la charge sur votre table DynamoDB, afin de minimiser la possibilité de dépassement du débit approvisionné. À la fin de chaque requête Hive, Amazon EMR renvoie des informations sur le cluster utilisé pour traiter la requête, y compris le nombre de fois où votre débit alloué a été dépassé. Vous pouvez utiliser ces informations, ainsi que CloudWatch les mesures relatives à votre débit DynamoDB, pour mieux gérer la charge sur votre table DynamoDB lors des demandes suivantes. 

 Les facteurs suivants influencent les performances des requêtes Hive lorsque vous travaillez avec des tables DynamoDB. 

## Unités de capacité de lecture allouées
<a name="ProvisionedReadCapacityUnits"></a>

 Lorsque vous exécutez les requêtes Hive sur une table DynamoDB, vous devez vous assurer que vous avez alloué une quantité suffisante d'unités de capacité de lecture. 

 Par exemple, supposons que vous ayez provisionné 100 unités de capacité en lecture pour votre table DynamoDB. Vous pourrez ainsi effectuer 100 lectures, ou 409 600 octets, par seconde. Si cette table contient 20 Go de données (21 474 836 480 octets) et que votre requête Hive exécute une analyse complète de la table, vous pouvez estimer la durée d'exécution de la requête : 

 * 21 474 836 480 / 409 600 = 52 429 secondes = 14,56 heures * 

 Le seul moyen de diminuer le temps nécessaire consiste à ajuster les unités de capacité de lecture sur la table DynamoDB source. L'ajout de nœuds supplémentaires au cluster Amazon EMR ne sera d'aucune utilité. 

 Dans la sortie Hive, le pourcentage d'achèvement est mis à jour lorsqu'un ou plusieurs processus de mappeurs sont terminés. Pour une table DynamoDB volumineuse avec un paramètre de faible capacité allouée en lecture, la sortie du pourcentage d'achèvement peut ne pas être mise à jour pendant longtemps. Dans le cas décrit ci-dessus, la tâche apparaît complète à 0 % pendant plusieurs heures. Pour un état plus détaillé de l'avancement de votre tâche, accédez à la console Amazon EMR ; vous serez en mesure d'afficher l'état des tâches de chaque mappeur et des statistiques de lecture des données. 

 Vous pouvez également vous connecter à l'interface Hadoop sur le nœud maître et voir les statistiques Hadoop. Vous visualisez ainsi l'état des tâches de chaque carte et certaines statistiques de lecture des données. Pour plus d'informations, consultez [Interfaces web hébergées sur le nœud principal](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-web-interfaces.html) dans le *Guide de gestion d'Amazon EMR*.

## Paramètre de pourcentage de lecture
<a name="ReadPercent"></a>

 Par défaut, Amazon EMR gère la charge de requête sur votre table DynamoDB selon votre débit alloué actuel. Cependant, quand Amazon EMR renvoie des informations sur votre tâche avec un nombre élevé de réponses de dépassement du débit alloué, vous pouvez ajuster la vitesse de lecture par défaut à l'aide du paramètre `dynamodb.throughput.read.percent` lorsque vous configurez la table Hive. Pour plus d'informations sur la configuration du paramètre de pourcentage de lecture, consultez [Options Hive](EMR_Interactive_Hive.md#EMR_Hive_Options). 

## Paramètre de pourcentage d'écriture
<a name="WritePercent"></a>

 Par défaut, Amazon EMR gère la charge de requête sur votre table DynamoDB selon votre débit alloué actuel. Cependant, quand Amazon EMR renvoie des informations sur votre tâche avec un nombre élevé de réponses de dépassement du débit alloué, vous pouvez ajuster la vitesse d'écriture par défaut à l'aide du paramètre `dynamodb.throughput.write.percent` lorsque vous configurez la table Hive. Pour plus d'informations sur la configuration du paramètre de pourcentage d'écriture, consultez [Options Hive](EMR_Interactive_Hive.md#EMR_Hive_Options). 

## Paramètre de durée de nouvelle tentative
<a name="emr-ddb-retry-duration"></a>

 Par défaut, Amazon EMR exécute à nouveau une requête Hive si elle n'a pas renvoyé de résultat dans les deux minutes, l'intervalle de nouvelle tentative par défaut. Vous pouvez ajuster cet intervalle en définissant le paramètre `dynamodb.retry.duration` lorsque vous exécutez une requête Hive. Pour plus d'informations sur la configuration du paramètre de pourcentage d'écriture, consultez [Options Hive](EMR_Interactive_Hive.md#EMR_Hive_Options). 

## Nombre de tâches de mappage
<a name="NumberMapTasks"></a>

 Les démons de mappeur que Hadoop lance pour traiter vos requêtes afin d'exporter et d'interroger des données stockées dans DynamoDB sont limités à une vitesse de lecture maximale de 1 Mio par seconde afin de limiter la capacité de lecture utilisée. Si vous avez un débit alloué supplémentaire disponible sur DynamoDB, vous pouvez améliorer les performances de l'exportation Hive et des opérations d'interrogation en augmentant le nombre de démons de mappeur. Pour ce faire, vous pouvez augmenter le nombre d'instances EC2 dans votre cluster *ou* accroître le nombre de démons de mappeur s'exécutant sur chaque instance EC2. 

 Vous pouvez augmenter le nombre d'instances EC2 dans un cluster en arrêtant le cluster actuel et en le relançant avec un plus grand nombre d'instances EC2. Vous spécifiez le nombre d'instances EC2 dans la boîte de dialogue **Configurer les instances EC2** si vous lancez le cluster à partir de la console Amazon EMR, ou avec l'option `‑‑num-instances` si vous lancez le cluster à partir de la CLI. 

 Le nombre de tâches de mappage exécutées sur une instance dépend du type d'instance EC2. Pour plus d'informations sur les types d'instance EC2 pris en charge et le nombre de mappeurs que chacun fournit, consultez [Configuration de la tâche](emr-hadoop-task-config.md). Là, vous trouverez une section « Configuration des tâches » pour chacune des configurations prises en charge. 

 Un autre moyen d'augmenter le nombre de démons de mappeur consiste à modifier le paramètre de configuration `mapreduce.tasktracker.map.tasks.maximum` de Hadoop sur une valeur plus élevée. Cela a l'avantage de vous donner un plus grand nombre de mappeur sans augmenter le nombre ou la taille des instances EC2, ce qui vous permet d'économiser de l'argent. Un inconvénient est qu'une définition trop élevée de cette valeur peut entraîner une saturation de la mémoire des instances EC2 dans votre cluster. Pour définir `mapreduce.tasktracker.map.tasks.maximum`, lancez le cluster et spécifiez une valeur pour `mapreduce.tasktracker.map.tasks.maximum` en tant que propriété de la classification de configuration mapred-site. Voici un exemple : Pour de plus amples informations, veuillez consulter [Configuration des applications](emr-configure-apps.md).

```
{
    "configurations": [
    {
        "classification": "mapred-site",
        "properties": {
            "mapred.tasktracker.map.tasks.maximum": "10"
        }
    }
    ]
}
```

## Demandes de données en parallèle
<a name="ParallelDataRequests"></a>

 Plusieurs demandes de données, à partir de plusieurs utilisateurs ou de plusieurs applications vers une seule table, peuvent diminuer la vitesse de lecture allouée et ralentir les performances. 

## Durée du processus
<a name="ProcessDuration"></a>

 La cohérence des données dans DynamoDB dépend de l’ordre des opérations de lecture et d’écriture sur chaque nœud. Quand une requête Hive est en cours, une autre application peut charger de nouvelles données dans la table DynamoDB, voire modifier ou supprimer des données existantes. Dans ce cas, les résultats de la requête Hive peuvent ne pas tenir compte des modifications apportées aux données pendant l’exécution de la requête. 

## Eviter le dépassement de débit
<a name="AvoidExceedingThroughput"></a>

 Lors de l'exécution de requêtes Hive sur DynamoDB, veillez à ne pas dépasser votre débit alloué, vous risquez sinon de réduire la capacité nécessaire des appels à `DynamoDB::Get` de votre application. Pour éviter que cela ne se produise, vous devez surveiller régulièrement le volume de lecture et la limitation des appels aux applications `DynamoDB::Get` en consultant les journaux et les métriques de surveillance sur Amazon. CloudWatch 

## Durée de la demande
<a name="RequestTime"></a>

 La planification des requêtes Hive qui accèdent à une table DynamoDB à un moment où la demande sur celle-ci est inférieure a pour effet d’améliorer les performances. Par exemple, si la plupart des utilisateurs de votre application vivent à San Francisco, vous pouvez choisir d'exporter les données chaque jour à 4h00 HNP, lorsque la majorité des utilisateurs dort, sans mettre à jour les enregistrements de votre base de données DynamoDB. 

## Tables basées sur le temps
<a name="TimeBasedTables"></a>

 Si les données sont organisées en tant que série de tables DynamoDB basées sur le temps, telles qu'une table par jour, vous pouvez exporter les données lorsque la table n'est plus active. Vous pouvez utiliser cette technique pour sauvegarder les données sur Amazon S3 en continu. 

## Données archivées
<a name="ArchivedData"></a>

 Si vous prévoyez d'exécuter plusieurs requêtes Hive sur les données stockées dans DynamoDB et que votre application peut tolérer les données archivées, il se peut que vous souhaitiez exporter les données vers HDFS ou Amazon S3, et exécuter les requêtes Hive sur une copie des données au lieu de DynamoDB. Cela permet de conserver vos opérations de lecture et votre débit alloué. 