HBase met Java

1. Overzicht

In dit artikel zullen we kijken naar de HBase database Java Client-bibliotheek. HBase is een gedistribueerde database die het Hadoop-bestandssysteem gebruikt voor het opslaan van gegevens.

We maken een Java-voorbeeldclient en een tabel waaraan we enkele eenvoudige records zullen toevoegen.

2. HBase-gegevensstructuur

In HBase worden gegevens gegroepeerd in kolomfamilies. Alle kolomleden van een kolomfamilie hebben hetzelfde voorvoegsel.

Bijvoorbeeld de kolommen family1: qualifier1 en gezin1: qualifier2 zijn beide lid van de gezin1 kolom familie. Alle leden van de kolomfamilie worden samen op het bestandssysteem opgeslagen.

Binnen de kolomfamilie kunnen we een rij plaatsen met een gespecificeerde kwalificatie. We kunnen een kwalificatie zien als een soort kolomnaam.

Laten we een voorbeeldrecord van Hbase bekijken:

Familie1: {'Qualifier1': 'row1: cell_data', 'Qualifier2': 'row2: cell_data', 'Qualifier3': 'row3: cell_data'} Familie2: {'Qualifier1': 'row1: cell_data', 'Qualifier2': 'row2: cell_data', 'Qualifier3': 'row3: cell_data'}

We hebben twee kolomfamilies, elk met drie kwalificaties met enkele celgegevens erin. Elke rij heeft een rijsleutel - het is een unieke rij-ID. We zullen de rijsleutel gebruiken om de gegevens in te voegen, op te halen en te verwijderen.

3. Afhankelijkheid van HBase Client Maven

Voordat we verbinding maken met de HBase, moeten we hbase-client en hbase afhankelijkheden:

 org.apache.hbase hbase-client $ {hbase.version} org.apache.hbase hbase $ {hbase.version} 

4. HBase-installatie

We moeten HBase instellen om er vanuit een Java-clientbibliotheek verbinding mee te kunnen maken. De installatie valt buiten het bestek van dit artikel, maar u kunt enkele van de HBase-installatiehandleidingen online bekijken.

Vervolgens moeten we lokaal een HBase-master starten door het volgende uit te voeren:

hbase master start

5. Verbinding maken met HBase vanuit Java

Om programmatisch verbinding te maken van Java naar HBase, moeten we een XML-configuratiebestand definiëren. We zijn onze HBase-instantie gestart op localhost, dus we moeten dat invoeren in een configuratiebestand:

  hbase.zookeeper.quorum localhost hbase.zookeeper.property.clientPort 2181 

Nu moeten we een HBase-client naar dat configuratiebestand verwijzen:

Configuratie config = HBaseConfiguration.create (); Tekenreekspad = this.getClass () .getClassLoader () .getResource ("hbase-site.xml") .getPath (); config.addResource (nieuw pad (pad)); 

Vervolgens controleren we of een verbinding met HBase is gelukt - in het geval van een fout kan het MasterNotRunningException zal worden gegooid:

HBaseAdmin.checkHBaseAvailable (config);

6. Creëren van een databasestructuur

Voordat we beginnen met het toevoegen van gegevens aan HBase, moeten we de gegevensstructuur maken voor het invoegen van rijen. We zullen een tabel maken met twee kolomfamilies:

private TableName table1 = TableName.valueOf ("Table1"); private String family1 = "Family1"; private String family2 = "Family2";

Ten eerste moeten we een verbinding maken met de database en krijgen beheerder object, dat we zullen gebruiken voor het manipuleren van een databasestructuur:

Verbindingsverbinding = ConnectionFactory.createConnection (config) Admin admin = connection.getAdmin ();

Vervolgens kunnen we een tabel maken door een instantie van de HTableDescriptor klas naar een createTable () methode op de beheerder voorwerp:

HTableDescriptor desc = nieuwe HTableDescriptor (table1); desc.addFamily (nieuwe HColumnDescriptor (family1)); desc.addFamily (nieuwe HColumnDescriptor (family2)); admin.createTable (desc);

7. Elementen toevoegen en ophalen

Met de gemaakte tabel kunnen we er nieuwe gegevens aan toevoegen door een Leggen bezwaar maken en een leggen() methode op de Tafel voorwerp:

byte [] row1 = Bytes.toBytes ("row1") Put p = nieuwe Put (row1); p.addImmutable (family1.getBytes (), qualifier1, Bytes.toBytes ("cell_data")); table1.put (p);

Het ophalen van een eerder gemaakte rij kan worden bereikt door een Krijgen klasse:

Get g = new Get (rij1); Resultaat r = table1.get (g); byte [] waarde = r.getValue (family1.getBytes (), qualifier1);

De rij1 is een rij-ID - we kunnen het gebruiken om een ​​specifieke rij uit de database op te halen. Bij het bellen:

Bytes.bytesToString (waarde)

het geretourneerde resultaat is eerder het ingevoegde cell_data.

8. Scannen en filteren

We kunnen de tabel scannen en alle elementen binnen een bepaalde kwalificatie ophalen met behulp van een Scannen object (merk op dat ResultScanner strekt zich uit Afsluitbaar, dus bel zeker dichtbij() erop als je klaar bent):

Scan scan = nieuwe Scan (); scan.addColumn (family1.getBytes (), qualifier1); ResultScanner scanner = table.getScanner (scan); for (Resultaat resultaat: scanner) {System.out.println ("Gevonden rij:" + resultaat); } 

Met die bewerking worden alle rijen binnen een kwalificatie 1 met wat aanvullende informatie zoals tijdstempel:

Gevonden rij: keyvalues ​​= {Rij1 / Familie1: Kwalificatie1 / 1488202127489 / Put / vlen = 9 / seqid = 0}

We kunnen specifieke records ophalen door filters te gebruiken.

Ten eerste maken we twee filters. De filter1 specificeert dat de scanquery elementen ophaalt die groter zijn dan rij1, en filter2 geeft aan dat we alleen geïnteresseerd zijn in rijen met een kwalificatie die gelijk is aan kwalificatie 1:

Filter filter1 = nieuw PrefixFilter (rij1); Filter filter2 = nieuwe QualifierFilter (CompareOp.GREATER_OR_EQUAL, nieuwe BinaryComparator (qualifier1)); Lijstfilters = Arrays.asList (filter1, filter2);

Dan kunnen we een resultatenset krijgen van a Scannen vraag:

Scan scan = nieuwe Scan (); scan.setFilter (nieuwe FilterList (Operator.MUST_PASS_ALL, filters)); probeer (ResultScanner scanner = table.getScanner (scan)) {voor (Resultaat resultaat: scanner) {System.out.println ("Gevonden rij:" + resultaat); }}

Bij het maken van een Filterlijst we passeerden een Operator.MUST_PASS_ALL - het betekent dat aan alle filters moet worden voldaan. We kunnen een Operatie.MUST_PASS_ONE als er maar aan één filter moet worden voldaan. In de resulterende set hebben we alleen rijen die overeenkomen met opgegeven filters.

9. Rijen verwijderen

Ten slotte, om een ​​rij te verwijderen, kunnen we een Verwijderen klasse:

Delete delete = new Delete (row1); delete.addColumn (family1.getBytes (), qualifier1); table.delete (verwijderen);

We verwijderen een rij1 dat zich in een gezin1.

10. Conclusie

In deze korte tutorial hebben we ons gericht op communicatie met een HBase-database. We hebben gezien hoe u verbinding kunt maken met HBase vanuit de Java-clientbibliotheek en hoe u verschillende basisbewerkingen kunt uitvoeren.

De implementatie van al deze voorbeelden en codefragmenten is te vinden in het GitHub-project; dit is een Maven-project, dus het moet gemakkelijk te importeren en uit te voeren zijn zoals het is.


$config[zx-auto] not found$config[zx-overlay] not found