Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data

Preview:

Citation preview

#JSS2014

Les journées

SQL Server 2014

Un événement organisé par GUSS

#JSS2014

Les journées

SQL Server 2014

Un événement organisé par GUSS

Hive ou la convergence entre datawarehouse et Big Data

Julien BuretDavid Joubert

#JSS2014

Merci à nos sponsors

#JSS2014

Speakers

Julien BuretDirecteur technique

@julienburet

David JoubertConsultant Data & Analytics

@Dj_Uber

www.djuber.net

#JSS2014

On va parler de• Un peu d’Hadoop• Beaucoup de Hive

– Historique– Moteurs d’exécution– Stockage– Optimisation de

requêtes• Pas mal de démos

On ne vas pas en parler• De tout le reste

Autres sessions Big Data• APS, l’appliance Big Data,

Lundi à 15h30• Big Data et Real Time,

Mardi à 14h

Agenda

#JSS2014

• Framework aidant au développement d’application distribué et scalable

• Projet débuté en 2005– Basé sur 2 papiers de Google (GFS &

MapReduce)

• Projet Apache depuis 2009

Hadoop : un peu d’histoire

#JSS2014

Map Reduceclass CompositeKeyWritableRSJ implements Writable, WritableComparable<CompositeKeyWritableRSJ> {

// Data members private String joinKey;// EmployeeID private int sourceIndex;// 1=Employee data; 2=Salary (current) data; 3=Salary historical data

public CompositeKeyWritableRSJ() { }

public CompositeKeyWritableRSJ(String joinKey, int sourceIndex) { this.joinKey = joinKey; this.sourceIndex = sourceIndex; }

@Override public String toString() { return (new StringBuilder().append(joinKey).append("\t").append(sourceIndex)).toString(); }

public void readFields(DataInput dataInput) throws IOException { joinKey = WritableUtils.readString(dataInput); sourceIndex = WritableUtils.readVInt(dataInput); }

public void write(DataOutput dataOutput) throws IOException { WritableUtils.writeString(dataOutput, joinKey); WritableUtils.writeVInt(dataOutput, sourceIndex); }

public int compareTo(CompositeKeyWritableRSJ objKeyPair) {

int result = joinKey.compareTo(objKeyPair.joinKey); if (0 == result) { result = Double.compare(sourceIndex, objKeyPair.sourceIndex); } return result; }

public String getjoinKey() { return joinKey; }

public void setjoinKey(String joinKey) { this.joinKey = joinKey; }

public int getsourceIndex() { return sourceIndex; }

public void setsourceIndex(int sourceIndex) { this.sourceIndex = sourceIndex; }}

public class MapperRSJ extends Mapper<LongWritable, Text, CompositeKeyWritableRSJ, Text> {

CompositeKeyWritableRSJ ckwKey = new CompositeKeyWritableRSJ(); Text txtValue = new Text(""); int intSrcIndex = 0; StringBuilder strMapValueBuilder = new StringBuilder(""); List<Integer> lstRequiredAttribList = new ArrayList<Integer>();

@Override protected void setup(Context context) throws IOException, InterruptedException {

// {{ // Get the source index; (employee = 1, salary = 2) // Added as configuration in driver FileSplit fsFileSplit = (FileSplit) context.getInputSplit(); intSrcIndex = Integer.parseInt(context.getConfiguration().get( fsFileSplit.getPath().getName())); // }}

// {{ // Initialize the list of fields to emit as output based on // intSrcIndex (1=employee, 2=current salary, 3=historical salary) if (intSrcIndex == 1) // employee { lstRequiredAttribList.add(2); // FName lstRequiredAttribList.add(3); // LName lstRequiredAttribList.add(4); // Gender lstRequiredAttribList.add(6); // DeptNo } else // salary { lstRequiredAttribList.add(1); // Salary lstRequiredAttribList.add(3); // Effective-to-date (Value of // 9999-01-01 indicates current // salary)

} // }}

}

public class ReducerRSJ extends Reducer<CompositeKeyWritableRSJ, Text, NullWritable, Text> {

StringBuilder reduceValueBuilder = new StringBuilder(""); NullWritable nullWritableKey = NullWritable.get(); Text reduceOutputValue = new Text(""); String strSeparator = ","; private MapFile.Reader deptMapReader = null; Text txtMapFileLookupKey = new Text(""); Text txtMapFileLookupValue = new Text("");

@Override protected void setup(Context context) throws IOException, InterruptedException {

// {{ // Get side data from the distributed cache Path[] cacheFilesLocal = DistributedCache.getLocalCacheArchives(context .getConfiguration());

for (Path eachPath : cacheFilesLocal) {

if (eachPath.getName().toString().trim() .equals("departments_map.tar.gz")) { URI uriUncompressedFile = new File(eachPath.toString() + "/departments_map").toURI(); initializeDepartmentsMap(uriUncompressedFile, context); } } // }} }

#JSS2014

• Projet interne Facebook lancé en 2007

• Opensourcé en 2009• Aujourd’hui le standard de

fait pour exécuter du SQL sur Hadoop

• Disponible sur toute les distributions populaires

Hive : un peu d’histoire

#JSS2014

Hive fonctionnement globale

Block n

Block n

Block n

Block n

foo/foo1.txt

Hive METASTORE

FOO -> /dw/foo

select id, count(0) from

FOO group by id

1. Créer des jobs en se servant des metadonnées

2. Génère et soumet le traitement au cluster

task

task

task

task

Hive DRIVER

#JSS2014

Interprétation SQL par Hive

Parser

Analyse Sémantique

Générateur plan

d’éxecution logique

Générateur plan

d’éxecution physique

HiveQL

AST

QB

Operator Tree

Task Tree

#JSS2014

M/R comme moteur d’exécution SQL

M

M

M

M

M

R

R

R

HDFS

HDFS

M

M

R HDFS M R HDFS

IO

IO

IO

#JSS2014

demoHive

#JSS2014

Hive Quelle usage ?

Base de donneés

Hive

Langage SQL HiveQL (SQL-92)

Update Oui Non

Delete Oui Non

Transactions Oui Non

Index Extensive Non / Limité

Latence Très faible Elevée

Volume de données

To Po

Gestion des données

Validation à l’ecriture, contrainte

« schema on read »

#JSS2014

Hive Quelle usage ?

PAS DE REQUÊTES INTERACTIVES

Datwarehouse

DB

Log

DBSQL/

NoSQL

Réseaux

sociaux

#JSS2014

Requête interactive sur Hadoop

STINGER

#JSS2014

La fin de M/R pour le sql sur Hadoop

hive> set hive.execution.engine=tez

Et bientôthive> set

hive.execution.engine=spark

#JSS2014

• MPP• Requête SQL « interactive » sur

Hadoop• Compatible Hive

– Même API– Partage le metastore

Impala

#JSS2014

Spark

#JSS2014

• Nouveau moteur d’exécution pour Hadoop– Supporte M/R + Join– Permet de construire des plans d’exécution plus

complexe que M/R• Pipelining• Utilisation de la mémoire à la place du disque• Multiple Reduce Stage

Tez

#JSS2014

Traitement complexe M/RM

M

M

M

M

R

R

R

HDFS

HDFS

M

M

R HDFS M R HDFS

IO

IO

IO

IO

IO

IO

IO

#JSS2014

Traitement complexe M/RM

M

M

M

M

R

R

R

HDFS

HDFS

M

M

R HDFS M R HDFS

IO

IO

IO

#JSS2014

Même traitement avec TezM

M

M

M

M

R

R

R

R

R HDFS

R

#JSS2014

demoComparaison de performances entre Hive en mode MapReduce et Hive en mode Tez

#JSS2014

• Hive peut analyser des formats textuels (CSV, texte brut avec RegEx, Json, …)– Permet de travailler sur de la donnée brut (log,

export d’API, …)

• Parsing couteux • Problème de la compression

Hive sur donnée brut

#JSS2014

• SequenceFile, Avro, …– Parsing moins couteux

• Compression par bloc de données• Stockage adapté pour M/R

Format Binaire

#JSS2014

Format orienté colonne

a b c

a1 b1 c1

a2 b2 c2

a3 b3 c3

a4 b4 c4

a5 b5 c5

a1 b1 c1 a2 b2 c2 a3 b3 c3

a1 a2 a3 b1

b2

b3

c1 c2 c3

Représentation logique des données

Stockage ligne

Stockage colonne

Metadata + Encoding + Compression

#JSS2014

• ORC et Parquet• Permet un stockage des données en

colonnes• Améliore les performances en lecture,

écriture et traitement• Optimisation du stockage grâce à la

compression induite par le format

Format orienté colonne

#JSS2014

demoComparaison de performances entre stockage natif et stockage colonne

#JSS2014

• Hive traite les données ligne à ligne – Inefficace notamment pour des agrégations

• Mais résolue dans le monde « SQL » par la Vectorization

• Contribution hortonwork + microsoft sur Hive– Modification du Query Engine pour traiter des

« vecteurs de colonnes »– Meilleur utilisation du CPU et des caches

Vectorisation

#JSS2014

• Optimisation de l’arbre d’exécution– Peu d’optimisations• Partition pruning• Projection pruning• Filter push down

• Pas d’optimisation lié à la donnée– Ordre des tables dans les jointures importants– Pas de hint

Hive < 0.14 : RBO

#JSS2014

• Hive 0.14 with Apache Optiq• Impala 2.0

CBO

#JSS2014

• Première optimisation – Join reordering

Hive 0.14

SQLparser

Semantic

Analyser

LogicalOptimiz

er

PhysicalOptimiz

er

Map Reduce

Translate

Optiq

AST optimisé

#JSS2014

• Même problématique que pour une base SQL– Les statistiques doivent être calculé et

représentative des données

Hive : Calcul des statistiques

#JSS2014

demoVectorization + CBO

#JSS2014

SQLLangage de requêtes SQLTraitement en mode batchFormat orienté colonne (columnstore index, moteur vertipaq)Moteur d’exécution basé sur des statistiques

HiveLangage de requêtes HiveQLVectorisationFormat ORC (oriented row columnar)

Query planner

Pourquoi parler de convergence ?

#JSS2014

• SQL-20XX – Supporté les fonctions analytics– WINDOWS, ROOLUP, CUBE

• Transaction• LLAP• Materialized Views• Requête multi-datasource

– Prestodb (Facebook)– APS PolyBase– Oracle Bigdata

Le futur du SQL sur Hadoop

#JSS2014

Questions

#JSS2014#JSS2014