Démarrer séquentiellement HDFS, MySQL, Hive, Kudu et Impala.
Se connecter au shell d'Impala :
Impala-shell
1 : Utilisez la commande impala-shell pour démarrer le shell d'Impala. Par défaut, impala-shell essaie de se connecter au démon d'Impala sur localhost, port 21000. Pour vous connecter à un autre hôte, utilisez l'option -i <hôte:port>. Pour vous connecter automatiquement à une base de données Impala spécifique, utilisez l'option -d <base de données>. Par exemple, si toutes vos tables Kudu se trouvent dans la base de données impala_kudu dans Impala, vous pouvez utiliser -d impala_kudu.
2 : Pour quitter le shell d'Impala, utilisez la commande : quit;
Lors de la création de nouvelles tables Kudu avec Impala, vous pouvez créer ces tables comme des tables internes ou externes.
Tables internes
Les tables internes sont gérées par Impala. Lorsque vous les supprimez d'Impala, les données et la table sont effectivement supprimées. Lorsque vous créez une nouvelle table avec Impala, il s'agit généralement d'une table interne.
Création d'une table interne avec impala :
CREATE TABLE premiere_table
(
id BIGINT,
nom STRING,
PRIMARY KEY(id)
)
PARTITION BY HASH PARTITIONS 16
STORED AS KUDU
TBLPROPERTIES (
'kudu.master_addresses' = 'serveur01:7051,serveur02:7051,serveur03:7051',
'kudu.table_name' = 'premiere_table'
);
Ici, dans l'instruction CREATE TABLE, vous devez d'abord lister les colonnes qui constituent la clé primaire.
La table créée ici est une table interne. Lorsque vous supprimez la table d'impala, la table sous-jacante dans Kudu est également supprimée.
drop table if exists premiere_table;
import org.apache.kudu.ColumnSchema;
import org.apache.kudu.Schema;
import org.apache.kudu.Type;
import org.apache.kudu.client.CreateTableOptions;
import org.apache.kudu.client.KuduClient;
import org.apache.kudu.client.KuduException;
import java.util.ArrayList;
import java.util.List;
public class CreationTable {
private static ColumnSchema nouvelleColonne(String nom, Type type, boolean cle) {
ColumnSchema.ColumnSchemaBuilder colonne = new ColumnSchema.ColumnSchemaBuilder(nom, type);
colonne.cle(cle);
return colonne.build();
}
public static void main(String[] args) throws KuduException {
// adresse master
final String adresseMaster = "serveur01,serveur02,serveur03";
// création de la connexion à la base Kudu
KuduClient client = new KuduClient.KuduClientBuilder(adresseMaster).defaultSocketReadTimeoutMs(6000).build();
// définition du schéma de la table
List<ColumnSchema> colonnes = new ArrayList<ColumnSchema>();
colonnes.add(nouvelleColonne("IDEntreprise", Type.INT32, true));
colonnes.add(nouvelleColonne("IDTravail", Type.INT32, false));
colonnes.add(nouvelleColonne("Nom", Type.STRING, false));
colonnes.add(nouvelleColonne("Genre", Type.STRING, false));
colonnes.add(nouvelleColonne("Photo", Type.STRING, false));
Schema schema = new Schema(colonnes);
// toutes les options fournies lors de la création de la table
CreateTableOptions options = new CreateTableOptions();
// configuration des répliques et des partitions de la table
List<String> colonnesPartition = new ArrayList<String>();
colonnesPartition.add("IDEntreprise");
// configuration du nombre de répliques
options.setNumReplicas(1);
// configuration de la partition range
options.setRangePartitionColumns(colonnesPartition);
// configuration de la partition hash et de son nombre
options.addHashPartitions(colonnesPartition, 3);
try {
client.createTable("EMPLOYE", schema, options);
} catch (KuduException e) {
e.printStackTrace();
}
client.close();
}
}
Insertion de données dans Kudu :
import org.apache.kudu.client.*;
import org.apache.kudu.client.SessionConfiguration.FlushMode;
public class InsertionDonnees {
public static void main(String[] args) throws KuduException {
// adresse master
final String adresseMaster = "serveur01,serveur02,serveur03";
// création de la connexion à la base Kudu
KuduClient client = new KuduClient.KuduClientBuilder(adresseMaster).build();
// ouverture de la table
KuduTable table = client.openTable("EMPLOYE");
// création de la session d'écriture, Kudu doit écrire via une session
KuduSession session = client.newSession();
// configuration du mode de rafraîchissement manuel
session.setFlushMode(FlushMode.MANUAL_FLUSH);
session.setMutationBufferSpace(3000);
for (int i = 1; i < 10; i++) {
Insert insertion = table.newInsert();
// configuration du contenu des champs
insertion.getRow().addInt("IDEntreprise", i);
insertion.getRow().addInt("IDTravail", i);
insertion.getRow().addString("Nom", "dupont" + i);
insertion.getRow().addString("Genre", "masculin");
insertion.getRow().addString("Photo", "employe" + i);
session.flush();
session.apply(insertion);
}
session.close();
client.close();
}
}
Mapper la table Kudu vers Impala :
CREATE EXTERNAL TABLE kudu_EMPLOYE
STORED AS KUDU
TBLPROPERTIES (
'kudu.master_addresses' = 'serveur01:7051,serveur02:7051,serveur03:7051',
'kudu.table_name' = 'EMPLOYE'
);
Utilisation de CREATE TABLE ... AS SELECT pour créer une nouvelle table
CREATE TABLE nouvelle_table
PRIMARY KEY (id_entreprise)
PARTITION BY HASH(id_entreprise) PARTITIONS 8
STORED AS KUDU
AS SELECT id_entreprise, id_travail, nom ,genre,photo FROM kudu_EMPLOYE;
Résultat :
[serveur1:21000] > CREATE TABLE nouvelle_table
> PRIMARY KEY (id_entreprise)
> PARTITION BY HASH(id_entreprise) PARTITIONS 8
> STORED AS KUDU
> AS SELECT id_entreprise, id_travail, nom ,genre,photo FROM kudu_EMPLOYE;
Query: create TABLE nouvelle_table
PRIMARY KEY (id_entreprise)
PARTITION BY HASH(id_entreprise) PARTITIONS 8
STORED AS KUDU
AS SELECT id_entreprise, id_travail, nom ,genre,photo FROM kudu_EMPLOYE
+-------------------+
| summary |
+-------------------+
| Inserted 9 row(s) |
+-------------------+
Fetched 1 row(s) in 1.05s
Tables externes
Les tables externes (créées avec CREATE EXTERNAL TABLE) ne sont pas gérées par Impala. La suppression de cette table n'entraîne pas la suppression de la table de son emplacement source (ici Kudu). Au contraire, elle ne supprime que le mappage entre Impala et Kudu. C'est la syntaxe fournie par Kudu pour mapper une table existante vers Impala.
Création d'une table Kudu avec Java :
public class CreationTable {
private static ColumnSchema nouvelleColonne(String nom, Type type, boolean cle) {
ColumnSchema.ColumnSchemaBuilder colonne = new ColumnSchema.ColumnSchemaBuilder(nom, type);
colonne.cle(cle);
return colonne.build();
}
public static void main(String[] args) throws KuduException {
// adresse master
final String adresseMaster = "serveur01,serveur02,serveur03";
// création de la connexion à la base Kudu
KuduClient client = new KuduClient.KuduClientBuilder(adresseMaster).defaultSocketReadTimeoutMs(6000).build();
// définition du schéma de la table
List<ColumnSchema> colonnes = new ArrayList<ColumnSchema>();
colonnes.add(nouvelleColonne("IDEntreprise", Type.INT32, true));
colonnes.add(nouvelleColonne("IDTravail", Type.INT32, false));
colonnes.add(nouvelleColonne("Nom", Type.STRING, false));
colonnes.add(nouvelleColonne("Genre", Type.STRING, false));
colonnes.add(nouvelleColonne("Photo", Type.STRING, false));
Schema schema = new Schema(colonnes);
// toutes les options fournies lors de la création de la table
CreateTableOptions options = new CreateTableOptions();
// configuration des répliques et des partitions de la table
List<String> colonnesPartition = new ArrayList<String>();
colonnesPartition.add("IDEntreprise");
// configuration du nombre de répliques
options.setNumReplicas(1);
// configuration de la partition range
options.setRangePartitionColumns(colonnesPartition);
// configuration de la partition hash et de son nombre
options.addHashPartitions(colonnesPartition, 3);
try {
client.createTable("EMPLOYE", schema, options);
} catch (KuduException e) {
e.printStackTrace();
}
client.close();
}
}
Création d'une table externe avec impala, mappant la table Kudu vers Impala :
CREATE EXTERNAL TABLE table_mappage
STORED AS KUDU
TBLPROPERTIES (
'kudu.master_addresses' = 'serveur01:7051,serveur02:7051,serveur03:7051',
'kudu.table_name' = 'EMPLOYE'
);