Technique #1: USE TEZ
TEZ : Moteur d’exécution qui améliore les performances du paradigme
MapReduce
Repose sur le système de DAG (à l’instar de Spark) : calcule le plan d’exécution le
plus optimal pour minimiser le shuffling des données
Pour l’utiliser :
set hive.execution.engine=tez;
Format : ORC
Compression efficiente : stocke par colonne et compressé, ce qui mène à de plus
petites lectures disques et de meilleures performances.
Transactions ACID (atomicité, cohérence, isolation, durabilité), soit un ensemble
de propriété garantissant la fiabilité d’une transaction
Souvent utilisé pour des gains de performance
A préférer pour des structures de fichiers plats
Format : ORC
Exemple :
CREATE TABLE A_ORC (
playerID int, name string, age int
) STORED AS ORC
tblproperties (“orc.compress" = “SNAPPY”);
Format : PARQUET
Stocke ses éléments en arborescence tel que Google Dremel le réalise.
Compressé par défaut en Snappy (contrairement à ORC)
A préférer du format ORC lorsque les données sont imbriquées (principe de
stockage en arborescence)
Ne supporte pas les transaction ACID (contrairement à l’ORC)
Format : PARQUET
Exemple :
CREATE TABLE A_PARQUET (
playerID int, name string, age int
) STORED AS PARQUET
Technique #3: USE VECTORIZATION
Il s’agit d’une fonctionnalité de Hive qui permet de réduire les usages de CPU
pour les requêtes classiques (filtres, agrégations, jointures)
Permet de traiter des batchs de lignes plutôt que des ligne par ligne
Commande :
set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true;
Technique #4: COST BASED QUERY OPTIMIZATION
CBO : plan d’exécution moins couteux pour chaque requête SQL. Ce plan
permettra la réduction de l’allocation des ressources (CPU, Memory, I/O…),
Pour utiliser CBO, définissez les paramètres suivants :
set hive.cbo.enable=true;
set hive.compute.query.using.stats=true;
set hive.stats.fetch.column.stats=true;
set hive.stats.fetch.partition.stats=true;
Technique #5 : PARTITIONNING
Accélère l’accès aux données avec des champs récurrents avec de faibles
cardinalités
Exemple :
CREATE TABLE mytable (
name string,
city string,
employee_id int
)
PARTITIONED BY (year STRING, month STRING, day STRING) ;
Technique #6 : BUCKETING
Bucketing( ou clustering) : fonctionnalité de Hive permettant de séparer les données en
multiple fichiers ou répertoires. Utilisé pour un requêtage plus efficient.
set hive.enforce.bucketing = true
Exemple :
CREATE TABLE mytable (
employee_id int,
name string,
) CLUSTERED BY (employee_id ) INTO 256 BUCKETS
hdfs getconf -confKey dfs.blocksize
Technique #6 : BUCKETING
Pour déterminer le nombre de buckets à choisir, il est intéressant de calculer le rapport
entre le nombre de données et la taille des bloc HDFS. Cela permet ainsi d’éviter d’allouer
de la mémoire HDFS aux fichiers qui sont pour la plupart vides.
On peut déterminer la taille des blocs HDFS via la commande suivante
hdfs getconf -confKey dfs.blocksize
Ex : pour 2 TB de données, on obtient le nombre de buckets par le calcul suivant:
nb_buckets = 2TB/ taille du bloc HDFS
Technique #7 : OTHERS RECOMMANDATIONS
D’autres recommandations de paramètres à définir sont également préconisées(2)
pour optimiser les performances de Hive :
hive.optimize.reducededuplication.min.reducer=4
hive.optimize.reducededuplication=true
hive.merge.mapfiles=true
hive.merge.mapredfiles=false
hive.merge.smallfiles.avgsize=16000000
hive.merge.size.per.task=256000000
hive.merge.sparkfiles=true
hive.auto.convert.join=true
hive.auto.convert.join.noconditionaltask=true
hive.auto.convert.join.noconditionaltask.size=20Mhive.optimize.bucketmapjoin.sortedmerge=false hive.map.aggr.hash.percentmemory=0.5
hive.map.aggr=true