Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
-
Upload
david-joubert -
Category
Data & Analytics
-
view
100 -
download
0
Transcript of Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
#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