Différences et considérations pour Hive sur Amazon EMR - 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.

Différences et considérations pour Hive sur Amazon EMR

Différences entre Apache Hive sur Amazon EMR et Apache Hive

Cette section décrit les différences entre Hive sur Amazon EMR et les versions par défaut de Hive disponibles à http://svn.apache.org/viewvc/hive/branches/.

Autorisation Hive

Amazon EMR prend en charge l'autorisation Hive pour HDFS, mais pas pour EMRFS et Amazon S3. Les clusters Amazon EMR s'exécutent avec l'autorisation désactivée par défaut.

Comportement de fusion de fichiers Hive avec Amazon S3

Apache Hive fusionne les petits fichiers à la fin d'une tâche de type map-only si hive.merge.mapfiles est défini sur true et la fusion est déclenchée uniquement si la taille de sortie moyenne de la tâche est inférieure au paramètre hive.merge.smallfiles.avgsize. Le comportement d'Amazon EMR Hive est identique si le chemin de la sortie finale est sur HDFS. Si le chemin de sortie se trouve dans Amazon S3, le paramètre hive.merge.smallfiles.avgsize est ignoré. Dans ce cas, la tâche de fusion est toujours déclenchée si hive.merge.mapfiles est défini sur true.

Transactions ACID et Amazon S3

Amazon EMR 6.1.0 et versions ultérieures prennent en charge les transactions Hive ACID (Atomicity, Consistency, Isolation, Durability) afin de respecter les propriétés ACID d'une base de données. Grâce à cette fonctionnalité, vous pouvez exécuter des opérations INSERT, UPDATE, DELETE et MERGE dans des tables gérées par Hive, avec des données dans Amazon Simple Storage Service (Amazon S3).

Fonctionnalités LLAP Hive

La fonctionnalité LLAP ajoutée dans la version 2.0 d'Apache Hive par défaut n'est pas prise en charge dans la version Hive 2.1.0 sur Amazon EMR version 5.0.

Amazon EMR version 6.0.0 et ultérieure prend en charge la fonctionnalité Live Long and Process (LLAP) pour Hive. Pour de plus amples informations, veuillez consulter Utilisation de LLAP pour Hive.

Différences Hive entre les versions Amazon EMR 4.x et 5.x

Cette section indique les différences à prendre en compte avant de migrer une implémentation de Hive de la version Hive 1.0.0 sur la version 4.x d'Amazon EMR à la version Hive 2.x sur la version 5.x d'Amazon EMR.

Différences et considérations opérationnelles

  • Ajout de la prise en charge des transactions ACID (atomicité, cohérence, isolation et durabilité) : cette différence entre Hive 1.0.0 sur Amazon EMR 4.x et Apache Hive par défaut a été supprimée.

  • Suppression des écritures directes vers Amazon S3 : cette différence entre Hive 1.0.0 sur Amazon EMR et Apache Hive par défaut a été supprimée. Désormais, Hive 2.1.0 sur la version 5.x d'Amazon EMR crée, lit et écrit des fichiers temporaires stockés dans Amazon S3. Par conséquent, vous n'avez plus besoin de créer une table temporaire dans le système de fichiers HDFS local du cluster pour lire la même table et y écrire. Si vous utilisez des compartiments activés pour la gestion des versions, veillez à gérer ces fichiers temporaires comme indiqué ci-dessous.

  • Gestion des fichiers temporaires lors de l'utilisation de compartiments Amazon S3 versionnés : lorsque vous exécutez des requêtes Hive pour lesquelles la destination des données générées est Amazon S3, de nombreux fichiers temporaires et répertoires sont créés. Il s'agit du nouveau comportement, comme indiqué précédemment. Si vous utilisez des compartiments S3 activés pour la gestion des versions, ces fichiers temporaires encombrement Amazon S3 et entraînent des coûts s'ils ne sont pas supprimés. Ajustez vos règles de cycle de vie afin que les données ayant un préfixe /_tmp soient supprimées après un délai court, par exemple cinq jours. Pour plus d'informations, consultez Configuration de cycle de vie.

  • Mise à jour de Log4j par log4j 2 : si vous utilisez log4j, vous devrez peut-être modifier votre configuration de journalisation en raison de cette mise à niveau. Pour plus d'informations, consultez Apache log4j 2.

Différences et considérations en termes de performances

  • Différences de performances avec Tez : avec la version 5.x d'Amazon EMR, Tez est le moteur d'exécution par défaut pour Hive au lieu de. MapReduce Tez offre des performances améliorées pour la plupart des flux de travail.

  • Tables avec plusieurs partitions : les requêtes qui génèrent un grand nombre de partitions dynamiques peuvent échouer et les requêtes qui effectuent des sélections sur des tables comportant un grand nombre de partitions peuvent nécessiter des temps d'exécution plus longs que prévu. Par exemple, une sélection effectuée sur 100 000 partitions peut prendre 10 minutes ou plus.

Fonctionnalités supplémentaires de Hive sur Amazon EMR

Amazon EMR ajoute à Hive de nouvelles fonctionnalités qui prennent en charge l'intégration de Hive à d'autres AWS services, telles que la possibilité de lire et d'écrire sur Amazon Simple Storage Service (Amazon S3) et DynamoDB.

Variables dans Hive

Vous pouvez inclure des variables dans vos scripts en utilisant le symbole dollar et des accolades.

add jar ${LIB}/jsonserde.jar

Vous transmettez les valeurs de ces variables à Hive sur la ligne de commande à l'aide du paramètre -d, comme dans l'exemple suivant :

-d LIB=s3://elasticmapreduce/samples/hive-ads/lib

Vous pouvez également transmettre les valeurs via des étapes qui exécutent des scripts Hive.

Pour transmettre des valeurs de variables dans des étapes Hive à l'aide de la console
  1. Ouvrez la console Amazon EMR à l'adresse https://console.aws.amazon.com/emr.

  2. Choisissez Créer un cluster.

  3. Dans la section Étapes, pour Add Step (Ajouter étapes), choisissez Programme Hive dans la liste et Configurer et ajouter.

  4. Dans la boîte de dialogue Ajouter une étape, spécifiez les paramètres en utilisant le tableau suivant comme guide, puis choisissez Ajouter.

    Champ Action
    Emplacement S3 du script* Spécifiez l'URI où votre script réside dans Amazon S3. La valeur doit être au format BucketName/chemin/ScriptName. Par exemple : s3://elasticmapreduce/samples/hive-ads/libs/response-time-stats.q.
    Emplacement S3 d'entrée Le cas échéant, spécifiez l'URI de l'emplacement de vos fichiers d'entrée dans Amazon S3. La valeur doit être sous la forme BucketName/chemin /. Si spécifié, elle sera transmise au script Hive comme un paramètre nommé INPUT. Par exemple : s3://elasticmapreduce/samples/hive-ads/tables/.
    Emplacement S3 de sortie Le cas échéant, spécifiez l'URI où vous voulez que le résultat soit stocké dans Amazon S3. La valeur doit être au format BucketName/path. Si spécifié, elle sera transmise au script Hive comme un paramètre nommé OUTPUT. Par exemple : s3://mybucket/hive-ads/output/.
    Arguments Le cas échéant, entrez une liste d'arguments (chaînes séparées par des espaces) à transmettre à Hive. Si vous avez défini une variable de chemin d'accès dans votre script Hive nommé ${SAMPLE}, par exemple :
    CREATE EXTERNAL TABLE logs (requestBeginTime STRING, requestEndTime STRING, hostname STRING) PARTITIONED BY (dt STRING) \ ROW FORMAT serde 'com.amazon.elasticmapreduce.JsonSerde' WITH SERDEPROPERTIES ( 'paths'='requestBeginTime, requestEndTime, hostname' ) LOCATION '${SAMPLE}/tables/impressions';

    Pour transmettre une valeur pour la variable, saisissez ce qui suit dans la fenêtre Arguments :

    -d SAMPLE=s3://elasticmapreduce/samples/hive-ads/.

    Action sur échec

    Cela détermine ce que le cluster fait en réponse à toute erreur. Les valeurs possibles pour ce paramètre sont :

    • Arrêter le cluster : si l'étape échoue, arrêtez le cluster. Si la protection de la résiliation du cluster est activée ET que la persistance est activée, il ne s'arrêtera pas.

    • Annuler et attendre : si l'étape échoue, annulez les étapes restantes. Si le cluster a la persistance activée, le cluster ne s'arrêtera pas.

    • Continuer : si l'étape échoue, passez à l'étape suivante.

  5. Sélectionnez les valeurs si nécessaire, puis choisissez Créer un cluster.

Pour transmettre des valeurs variables aux étapes Hive à l'aide du AWS CLI

Pour transmettre des valeurs variables aux étapes Hive à l'aide du paramètre AWS CLI, utilisez le --steps paramètre et incluez une liste d'arguments.

  • Note

    Les caractères de continuation de ligne Linux (\) sont inclus pour des raisons de lisibilité. Ils peuvent être supprimés ou utilisés dans les commandes Linux. Pour Windows, supprimez-les ou remplacez-les par un caret (^).

    aws emr create-cluster --name "Test cluster" --release-label emr-7.1.0 \ --applications Name=Hive Name=Pig --use-default-roles --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3 \ --steps Type=Hive,Name="Hive Program",ActionOnFailure=CONTINUE,Args=[-f,s3://elasticmapreduce/samples/hive-ads/libs/response-time-stats.q,-d,INPUT=s3://elasticmapreduce/samples/hive-ads/tables,-d,OUTPUT=s3://mybucket/hive-ads/output/,-d,SAMPLE=s3://elasticmapreduce/samples/hive-ads/]

    Pour plus d'informations sur l'utilisation des commandes Amazon EMR dans le AWS CLI, consultez. https://docs.aws.amazon.com/cli/latest/reference/emr

Pour transmettre des valeurs de variables dans des étapes Hive à l'aide de Java SDK
  • L'exemple suivant montre comment transmettre des variables dans des étapes à l'aide du SDK. Pour plus d'informations, consultez la section Classe StepFactory dans la référence de AWS SDK for Java l'API.

    StepFactory stepFactory = new StepFactory(); StepConfig runHive = new StepConfig() .withName("Run Hive Script") .withActionOnFailure("TERMINATE_JOB_FLOW") .withHadoopJarStep(stepFactory.newRunHiveScriptStep(“s3://mybucket/script.q”, Lists.newArrayList(“-d”,”LIB= s3://elasticmapreduce/samples/hive-ads/lib”));

Requêtes Amazon EMR Hive pour prendre en compte les schémas DynamoDB partiels

Amazon EMR Hive offre une flexibilité maximale lors de l'interrogation de tables DynamoDB en vous permettant de spécifier un sous-ensemble de colonnes sur lequel vous pouvez filtrer des données, plutôt que d'exiger que votre requête inclue toutes les colonnes. Cette technique de requête de schéma partiel est efficace lorsque vous avez un schéma de base de données fragmenté et que vous souhaitez filtrer des enregistrements en fonction de quelques colonnes, par exemple le filtrage des horodatages.

L'exemple suivant montre comment utiliser une requête Hive pour :

  • Créez une table DynamoDB.

  • Sélectionner un sous-ensemble d'éléments (lignes) dans DynamoDB et réduire les données à certaines colonnes.

  • Copier les données qui en résultent dans Amazon S3.

DROP TABLE dynamodb; DROP TABLE s3; CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, fullColumn map<String, String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ( "dynamodb.table.name" = "myTable", "dynamodb.throughput.read.percent" = ".1000", "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey"); CREATE EXTERNAL TABLE s3(map<String, String>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://bucketname/path/subpath/'; INSERT OVERWRITE TABLE s3 SELECT item fullColumn FROM dynamodb WHERE recordTimeStamp < "2012-01-01";

La table suivante illustre la syntaxe de requête pour la sélection de n'importe quelle combinaison d'éléments de DynamoDB.

Exemple de requête Description du résultat
SÉLECTIONNER * DE nom_table; Sélectionne tous les éléments (lignes) dans une table donnée et inclut des données à partir de toutes les colonnes disponibles pour ces éléments.
SÉLECTIONNER * DE nom_tablenom_champ =valeur; Sélectionne certains éléments (lignes) dans une table donnée et inclut des données à partir de toutes les colonnes disponibles pour ces éléments.
SÉLECTIONNER nom_colonne1, nom_colonne2, nom_colonne3 DEPUIS nom_table; Sélectionne tous les éléments (lignes) dans une table donnée et inclut des données à partir de certaines colonnes disponibles pour ces éléments.
SÉLECTIONNER nom_colonne1, nom_colonne2, nom_colonne3 DEPUIS nom_tablenom_champ =valeur; Sélectionne certains éléments (lignes) dans une table donnée et inclut des données à partir de certaines colonnes disponibles pour ces éléments.

Copie des données entre les tables DynamoDB dans différentes régions AWS

Amazon EMR Hive fournit une propriété dynamodb.region que vous pouvez définir pour chaque table DynamoDB. Lorsque dynamodb.region est définie différemment sur deux tables, toute données que vous copiez entre les tables se produit automatiquement entre les régions spécifiées.

L'exemple suivant vous montre comment créer une table DynamoDB avec un script Hive qui définit la propriété dynamodb.region :

Note

Les propriétés de région par table remplacent les propriétés Hive globales.

CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, map<String, String> fullColumn) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ( "dynamodb.table.name" = "myTable", "dynamodb.region" = "eu-west-1", "dynamodb.throughput.read.percent" = ".1000", "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey");

Définition des valeurs de débit de DynamoDB par table

Amazon EMR Hive vous permet de définir le DynamoDB readThroughputPercent et les writeThroughputPercent paramètres par table dans la définition de la table. Le script Hive Amazon EMR suivant montre comment définir les valeurs de débit. Pour plus d'informations sur les valeurs de débit DynamoDB, consultez Spécification d'exigences de lecture et d'écriture pour des tables.

CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, map<String, String> fullColumn) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ( "dynamodb.table.name" = "myTable", "dynamodb.throughput.read.percent" = ".4", "dynamodb.throughput.write.percent" = "1.0", "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey");