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

Wangheng1409 2021-09-15 07:42:52
architecture shell et api base


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://javamana.com/2021/09/20210915073956243w.html

  1. 国内一线互联网公司面试题汇总,2021年大厂Java岗面试必问,
  2. 啃完吃透保你涨薪5K,熬夜整理小米Java面试题,
  3. 和字节跳动大佬的技术面谈,Redis成神之路电子版教程已问世,
  4. Le terme professionnel le plus complet de l'histoire des micro - services interview 50 questions, Byte Jumping Java post Classic interview vrai problème,
  5. After using mybatisplus, I haven't written SQL for a long time
  6. [springboot2 starts from 0] how to write a springboot application?
  7. Huawei cloud guassdb (for redis) released a new version, and the two core features were officially unveiled
  8. 和字節跳動大佬的技術面談,Redis成神之路電子版教程已問世,
  9. 啃完吃透保你漲薪5K,熬夜整理小米Java面試題,
  10. Avec l'interview technique du gigolo, le tutoriel électronique redis est sorti.
  11. Après avoir mangé, assurez - vous d'augmenter votre salaire de 5K et de rester debout tard pour trier les questions d'entrevue Java de millet.
  12. Résumé des questions d'entrevue pour les entreprises Internet nationales de première ligne, qui doivent être posées lors de l'entrevue d'emploi Java de la grande usine en 2021,
  13. Le tri des crachats de sang, la force de l'équipe Tencent pour créer le tutoriel d'introduction au printemps,
  14. Java and scala concurrency Fundamentals
  15. Analysis of java thread source code based on Hotspot
  16. 國內一線互聯網公司面試題匯總,2021年大廠Java崗面試必問,
  17. Introduction au module de contrôle de Connexion MySQL
  18. 大厂高级测试面试题,Java面试基础技能罗列,
  19. Comprendre l'architecture sous - jacente d'InnoDB en exécutant une instruction
  20. Chargeur de classe 1 Tomcat
  21. 小白也能看懂的dubbo3应用级服务发现详解
  22. SpringBoot异步使用@Async原理及线程池配置
  23. Questions d'entrevue de test avancé de Dachang, liste des compétences de base de l'entrevue Java,
  24. SpringBoot异步使用@Async原理及線程池配置
  25. Springboot utilise asynchrone le principe @ async et la configuration du pool de threads
  26. Détails de la découverte du Service d'application Dubbo 3 que Xiaobai peut également comprendre
  27. Springboot utilise asynchrone le principe @ async et la configuration du pool de threads
  28. 如何强大且优雅的搞定Linux文件系统,算法题 JVM,
  29. 太牛了,阿里P7架构师带你看透maven的来龙去脉,
  30. Oracle central et Oracle décentralisé
  31. java JavaBean
  32. Java wrapper type
  33. Java super keyword
  34. Java static keyword
  35. Java this keyword
  36. Java interface
  37. 太牛了,阿裏P7架構師帶你看透maven的來龍去脈,
  38. C'est génial, l'architecte Ali p7 vous montre à travers Maven.
  39. Comment traiter le système de fichiers Linux avec puissance et élégance, algorithme JVM,
  40. Java + SSM Social Insurance Pension System for Computer Graduation Design
  41. Usage of Java scanner
  42. Java inheritance
  43. Java method review
  44. java JVM
  45. Java Basics
  46. Java file operation object IO stream
  47. Java console reads multi character input and output
  48. Java simple array sorting
  49. In addition to MySQL master-slave, you have another choice, Galera
  50. Configuration standard dockerfile et docker-composer.yml
  51. 字节大神强推千页PDF学习笔记,2021Java开发学习路线,
  52. 字节大牛耗时八个月又一力作,靠这份Java知识点PDF成功跳槽,
  53. 字节大牛教你手撕Java学习,最新大厂程序员进阶宝典,
  54. Comment l'automne est - il beau?Ces 24 ensembles de modèles d'automne et d'hiver sont grands, minces et vieillissants
  55. 字節大牛教你手撕Java學習,最新大廠程序員進階寶典,
  56. 字節大牛耗時八個月又一力作,靠這份Java知識點PDF成功跳槽,
  57. Byte Bull vous apprend à déchiqueter Java à la main, le dernier dictionnaire avancé des programmeurs de grandes usines,
  58. Byte Bull a pris huit mois à travailler dur et a réussi à changer d'emploi avec ce PDF Java Knowledge point.
  59. Byte God Push 1000 pages PDF Learning notes, 2021 Java Development Learning route,
  60. Five minutes to understand MySQL index push down