编程知识 cdmana.com

Architecture, Shell et API de base de données non relationnelle à grande échelle

HBaseCaractéristiques:

  • Stockage massif: Le niveau inférieur est basé surHDFSStockage de grandes quantités de données
  • Stockage en colonne:HBaseLes données du tableau sont stockées en fonction de la famille de colonnes,Une famille de colonnes contient plusieurs colonnes
  • Très extensible:Dépendance sous - jacenteHDFS,Quand il n'y a pas assez d'espace disque,Il suffit d'augmenter dynamiquementDataNodeLe noeud de service peut
  • Forte concurrence:Prise en charge des demandes de lecture et d'écriture très simultanées
  • Clairsemé:La rareté vise principalementHBaseFlexibilité des colonnes,Dans la famille des colonnes,Vous pouvez spécifier autant de colonnes que vous voulez,Lorsque les données de la colonne sont vides Conditions,Il n'y aura pas d'espace de stockage.
  • Plusieurs versions des données:HBaseLes données du tableau peuvent avoir plusieurs valeurs de version,Par défaut, le numéro de version est utilisé pour distinguer,Le numéro de version est juste Est l'horodatage des données insérées
  • Type de données unique:Toutes les données sontHBaseEst stocké dans un tableau d'octets

HBaseScénarios d'application pour:

  HBaseAdapté au stockage de grandes quantités de données détaillées,Et une bonne performance de requête est nécessaire plus tard(Plus d'un million de montres、Des centaines de millions, Et les exigences de concurrence sont élevées)

HBaseModèle de données:

 

HBaseStructure générale:

 

 

 Zookeeper

  • C'est fait.HMasterHaute disponibilité
  • SauvegardéHBaseInformations sur les métadonnées pour,C'est tout.HBase Entrée d'adressage du tableau
  • C'est exact.HMasterEtHRegionServer Surveillance réalisée

HMaster(Master)

  • PourHRegionServerRépartitionRegion Maintenir l'équilibrage de la charge dans l'ensemble du cluster
  • Tenir à jour les métadonnées du cluster
  • Trouvé invalide Region, Et sera invalidé Region Affecté à la normale HRegionServerAllez.

HRegionServer(RegionServer)

  • Responsable de la gestionRegion Accepter les demandes de données en lecture et en écriture des clients
  • La coupe devient plus grande en cours d'exécution Region

Region

  • ChaqueHRegionPar plusieursStoreComposition, ChaqueStore Enregistrer une famille de colonnes (Columns Family), Le tableau contient plusieurs familles de colonnes , Et quelques Store,
  • ChaqueStorePar unMemStoreEt plusieursStoreFileComposition,MemStore- Oui.Store Contenu en mémoire ,Écrivez dans le fichier Après ça.StoreFile.
  • StoreFile Le rez - de - chaussée est HFile Enregistrer dans le format de

HBase shell Fonctionnement de base:

Entrée:hbase shell

hbase(main):001:0> create 'lagou', 'base_info', 'extra_info'
Ou(Hbase Le tableau doit spécifier les informations de la famille de colonnes )
create 'lagou', {NAME => 'base_info', VERSIONS => '3'},{NAME =>
'extra_info',VERSIONS => '3'}
VERSIONS  Indique que les données de cette cellule peuvent être conservées dans la plus proche  3 Versions

Ajouter une opération de données :

Verslagou Insérer des informations dans le tableau ,row keyPour rk1, Famille de colonnes base_infoAjoutername Glyphe de colonne ,La valeur est:wang
put 'lagou', 'rk1', 'base_info:name', 'wang'

Verslagou Insérer des informations dans le tableau ,row keyPourrk1, Famille de colonnes base_infoAjouterage Glyphe de colonne ,La valeur est:30
put 'lagou', 'rk1', 'base_info:age', 30
Verslagou Insérer des informations dans le tableau ,row keyPourrk1, Famille de colonnes extra_infoAjouteraddress Glyphe de colonne ,La valeur est:shanghai put 'lagou', 'rk1', 'extra_info:address', 'shanghai'

Requête,Mise à jour,Supprimer:

 Obtenir dans le tableau row keyPourrk1Toutes les informations sur
get 'lagou', 'rk1'
AccèslagouDans le tableaurow keyPourrk1,base_info Toutes les informations sur la famille de colonnes 
get 'lagou', 'rk1', 'base_info'
 Obtenir dans le tableau row keyPourrk1,base_info De la famille des colonnes name、age Informations sur les glyphes de colonne 
get 'lagou', 'rk1', 'base_info:name', 'base_info:age'

AccèslagouDans le tableaurow keyPourrk1,base_info、extra_info Informations sur les familles de colonnes 
hbase(main):010:0> get 'lagou', 'rk1', 'base_info', 'extra_info'
Ou
hbase(main):011:0> get 'lagou', 'rk1', {COLUMN => ['base_info', 'extra_info']}
Ou
hbase(main):012:0> get 'lagou', 'rk1', {COLUMN => ['base_info:name',
'extra_info:address']}

 Obtenir dans le tableau row keyPourrk1,cellLa valeur dewangInformations sur
get 'lagou', 'rk1', {FILTER => "ValueFilter(=,
'binary:wang')"}

 Obtenir dans le tableau row keyPourrk1, Les glyphes de colonne contiennent aInformations sur
get 'lagou', 'rk1', {FILTER => "
(QualifierFilter(=,'substring:a'))"}

Requêtelagou Toutes les informations du tableau :
 scan 'lagou'

 La famille de colonnes du tableau de requête est  base_info Informations sur:
hbase(main):001:0> scan 'lagou', {COLUMNS => 'base_info'}
hbase(main):002:0> scan 'lagou', {COLUMNS => 'base_info', RAW => true, VERSIONS
=> 3}
## Scan Vous pouvez définir si on RawMode,OuvertRaw Le mode renvoie les données qui incluent les étiquettes de suppression qui ont été ajoutées mais qui n'ont pas été réellement supprimées 
## VERSIONS Spécifiez le nombre maximum de versions pour la requête 

 Spécifiez plusieurs familles de colonnes et Brouillez la requête par valeur de données :
Requêtelagou Les familles de colonnes du tableau sont  base_info Et extra_info Et l'identificateur de colonne contient a Informations sur les caractères 

hbase(main):001:0> scan 'lagou', {COLUMNS => ['base_info', 'extra_info'], FILTER
=> "(QualifierFilter(=,'substring:a'))"}

rowkey Requête de valeur de plage pour (Très important.)
Requêtelagou Les familles de colonnes du tableau sont base_info,rkLe champ d'application est[rk1, rk3)Données(rowkey Le stockage sous - jacent est un ordre de Dictionnaire )
Appuyez.rowkeyStockage séquentiel.
scan 'lagou', {COLUMNS => 'base_info', STARTROW => 'rk1',
ENDROW => 'rk3'}

RequêtelagouDans le tableaurow keyParrkDébut du caractère
hbase(main):001:0> scan 'lagou',{FILTER=>"PrefixFilter('rk')"}

  Mettre à jour les valeurs des données :
Prends ça.lagouDans le tableaurowkeyPourrk1Debase_info Colonnes sous familles de colonnes nameModifier comme suit:liang
put 'lagou', 'rk1', 'base_info:name', 'liang'


 Supprimer les données et les tableaux :
SupprimerlagouTableaurow keyPourrk1, Les glyphes de colonne sont  base_info:name Données
> delete 'lagou', 'rk1', 'base_info:name'

Désignationrowkey, Supprimer les noms de colonnes et les informations d'horodatage 
SupprimerlagouTableaurow keyPourrk1, Les glyphes de colonne sont base_info:nameDonnées
delete 'lagou', 'rk1', 'base_info:name',1600660619655

Supprimer base_info  Famille de colonnes 
 alter 'lagou', 'delete' => 'base_info'

SupprimerlagouDonnées du tableau
truncate 'lagou'

SupprimerlagouTableau
#D'abord.disable Encore.drop
hbase(main):036:0> disable 'lagou'
hbase(main):037:0> drop 'lagou'
# Si ce n'est pas fait disable,DirectdropDes erreurs seront signalées
ERROR: Table user is enabled. Disable it first.

HBase JAVA  API:

<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
</dependencies>

Créer une connexion:

package com.lagou.hbase.client;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;

public class HbaseClientDemo {
    Configuration conf = null;
    Connection conn = null;

    @Before
    public void init() throws IOException {
        // Obtenir un objet de profil 
        conf = HBaseConfiguration.create();

        conf.set("hbase.zookeeper.quorum", "linux121,linux122");
        conf.set("hbase.zookeeper.property.clientPort", "2181");
        //AdoptionconfObtenirhbase Connexion au cluster 
        conn = ConnectionFactory.createConnection(conf);
    }

    //Relâchez la connexion
    @After
    public void realse() {
        if (conn != null) {
            try {
                conn.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

 

Créer une table:

 //Créer une pagehbaseTableau
    @Test
    public void createTable() throws IOException {
        //AccèsHbaseAdmin Objet utilisé pour créer une table 
        HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();
        //CréationHtabledesc Descripteur , Descripteur de table 
        final HTableDescriptor worker = new HTableDescriptor(TableName.valueOf("worker"));
        // Spécifier la famille de colonnes 
        worker.addFamily(new HColumnDescriptor("info"));
        admin.createTable(worker);
        System.out.println("worker Tableau créé avec succès !!");
    }

 

Insérer des données:

  //Insérer une donnée
    @Test
    public void putData() throws IOException {
        // Besoin d'obtenir un tableObjet
        final Table worker = conn.getTable(TableName.valueOf("worker"));

        //Préparez - vous.putObjet
        final Put put = new Put(Bytes.toBytes("110"));//Désignationrowkey

        put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("addr"), Bytes.toBytes("beijing"));
        //Insérer des données,Le type de paramètre estput
        worker.put(put);
        //Préparez - vous.list<puts>, L'insertion par lots peut être effectuée 
        //FermertableObjet
        worker.close();
        System.out.println(" Insérer les données dans workerTableau réussi!!");
    }

 

Recherche de données:

//Recherche de données
    @Test
    public void getData() throws IOException {
        //Préparez - vous.tableObjet
        final Table worker = conn.getTable(TableName.valueOf("worker"));
        //Préparez - vous.getObjet
        final Get get = new Get(Bytes.toBytes("110"));
        // Spécifiez une famille de colonnes ou une colonne à interroger 
        get.addFamily(Bytes.toBytes("info"));
        //Exécuter la requête
        final Result result = worker.get(get);
        //ObtenirresultTouscellObjet
        final Cell[] cells = result.rawCells();
        // Impression transversale 
        for (Cell cell : cells) {
            final String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
            final String f = Bytes.toString(CellUtil.cloneFamily(cell));
            final String column = Bytes.toString(CellUtil.cloneQualifier(cell));
            final String value = Bytes.toString(CellUtil.cloneValue(cell));

            System.out.println("rowkey-->" + rowkey + "--;cf-->" + f + "---;column--->" + column + "--;value-->" + value);
        }
        worker.close();
    }

Supprimer les données:

   //Supprimer une donnée
    @Test
    public void deleteData() throws IOException {
        // Besoin d'obtenir un tableObjet
        final Table worker = conn.getTable(TableName.valueOf("worker"));

        //Préparez - vous.deleteObjet
        final Delete delete = new Delete(Bytes.toBytes("110"));
//Effectuer la suppression
        worker.delete(delete);
        //FermertableObjet
        worker.close();
        System.out.println("Suppression réussie des données!!");
    }

 

 

AdoptionScanBalayage complet de la table:

/**
* Balayage complet de la table
*/
@Test
public void scanAllData() throws IOException {
HTable teacher = (HTable) conn.getTable(TableName.valueOf("teacher"));
Scan scan = new Scan();
ResultScanner resultScanner = teacher.getScanner(scan);
for (Result result : resultScanner) {
Cell[] cells = result.rawCells();// Obtenez tous les cellObjet
for (Cell cell : cells) {
//AdoptioncellAccèsrowkey,cf,column,value
String cf = Bytes.toString(CellUtil.cloneFamily(cell));
String column = Bytes.toString(CellUtil.cloneQualifier(cell));
String value = Bytes.toString(CellUtil.cloneValue(cell));
String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
System.out.println(rowkey + "----" + cf + "--" + column + "---"
+ value);
}
}
teacher.close();

}

AdoptionstartRowKeyEtendRowKeyEffectuer un balayage:

//Désignationscan C'est parti.rowkeyEt la finrowkey, Cette méthode de requête est recommandée pour , Préciser le début et la fin rowkey Intervalle pour éviter un balayage complet de la table 
@Test
public void scanStartEndData() throws IOException {
    //Préparez - vous.tableObjet
    final Table worker = conn.getTable(TableName.valueOf("worker"));
    //Préparez - vous.scanObjet
    final Scan scan = new Scan();
    // Spécifie la requête rowkeySection,rowkeyInhbase Dans l'ordre du Dictionnaire 
    scan.setStartRow(Bytes.toBytes("001"));
    scan.setStopRow(Bytes.toBytes("004"));
    //Effectuer un scan
    final ResultScanner resultScanner = worker.getScanner(scan);
    for (Result result : resultScanner) {
        //ObtenirresultTouscellObjet
        final Cell[] cells = result.rawCells();
        // Impression transversale 
        for (Cell cell : cells) {
            final String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
            final String f = Bytes.toString(CellUtil.cloneFamily(cell));
            final String column = Bytes.toString(CellUtil.cloneQualifier(cell));
            final String value = Bytes.toString(CellUtil.cloneValue(cell));
            System.out.println("rowkey-->" + rowkey + "--;cf-->" + f + ";column--->" + column + "--;value-->" + value);
        }
    }

    worker.close();
}

 

版权声明
本文为[Wangheng1409]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/09/20210915073956243w.html

Scroll to Top