Configuration d'une table Hive pour exécuter des commandes Hive - Amazon EMR

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.

Configuration d'une table Hive pour exécuter des commandes Hive

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

La procédure suivante suppose que vous avez déjà créé un cluster et que vous avez spécifié une paire de EC2 clés Amazon. Pour savoir comment commencer à créer des clusters, consultez Getting started with Amazon EMR dans le Amazon EMR Management Guide.

Configurer Hive pour utiliser MapReduce

Lorsque vous utilisez Hive sur Amazon EMR pour interroger des 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.

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" } } ]
Pour exécuter les commandes Hive de façon interactive
  1. Connectez-vous au nœud maître. Pour plus d'informations, consultez Connect to the master node SSH à l'aide de l'Amazon EMR Management Guide.

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

    Vous devez voir une invite Hive : hive>

  3. 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 EMR version d'Amazon, 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 les EMR versions 5.26.0 et antérieures d'Amazon, la table Hive ne contiendra pas la 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 EMR nœuds Amazon supplémentaires n'aidera pas.

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, rendez-vous sur la EMR console Amazon ; vous pourrez consulter le statut de chaque tâche du mappeur et les statistiques relatives aux lectures de 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 :

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.

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.

  2. À 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 arrêter le job Hadoop, où job-id est l'identifiant de la tâche Hadoop et peut être récupéré depuis l'interface utilisateur de Hadoop.

    hadoop job -kill job-id

Types de données pour Hive et DynamoDB

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

booléen () BOOL

array list (L)

number set (NS), string set (SS) ou binary set (BS)

map<string,string> article

map (M)

map<string,?> map (M)
nul (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 HDFS S3) sont également stockées sous forme de chaîne codée en Base64. Si vous importez des données depuis Amazon S3 ou HDFS dans le type binaire DynamoDB, elles doivent être codées sous forme de chaîne Base64.

Options Hive

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.

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;