Création de tables Kudu avec Impala : Tables internes et externes

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'
);

Étiquettes: Impala Kudu tables internes tables externes Hadoop

Publié le 5 juillet à 23h56