HBase med Java

1. Oversigt

I denne artikel ser vi på HBase database Java Client-bibliotek. HBase er en distribueret database, der bruger Hadoop-filsystemet til lagring af data.

Vi opretter en Java-eksempelklient og en tabel, hvor vi vil tilføje nogle enkle poster.

2. HBase-datastruktur

I HBase er data grupperet i kolonnefamilier. Alle kolonnemedlemmer i en kolonnefamilie har det samme præfiks.

For eksempel kolonnerne familie1: kvalifikation1 og familie1: kvalifikator2 begge er medlemmer af familie1 kolonne familie. Alle familier i kolonnen er gemt sammen på filsystemet.

Inde i kolonnefamilien kan vi placere en række, der har en specificeret kvalifikator. Vi kan tænke på en kvalifikation som en slags kolonnenavn.

Lad os se et eksempel på en rekord fra Hbase:

Family1: {'Qualifier1': 'row1: cell_data', 'Qualifier2': 'row2: cell_data', 'Qualifier3': 'row3: cell_data'} Family2: {'Qualifier1': 'row1: cell_data', 'Qualifier2': 'row2: cell_data', 'Qualifier3': 'row3: cell_data'}

Vi har to kolonnefamilier, hver af dem har tre kvalifikatorer med nogle celledata i. Hver række har en rækkenøgle - det er en unik rækkeidentifikator. Vi bruger række-tasten til at indsætte, hente og slette dataene.

3. Afhængighed af HBase Client Maven

Før vi opretter forbindelse til HBase, skal vi tilføje hbase-klient og hbase afhængigheder:

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

4. HBase-opsætning

Vi skal konfigurere HBase for at kunne oprette forbindelse fra et Java-klientbibliotek til det. Installationen er uden for denne artikels anvendelsesområde, men du kan tjekke nogle af HBase installationsvejledninger online.

Dernæst skal vi starte en HBase-master lokalt ved at udføre:

hbase master start

5. Opretter forbindelse til HBase fra Java

For at oprette forbindelse programmatisk fra Java til HBase skal vi definere en XML-konfigurationsfil. Vi startede vores HBase-forekomst på localhost, så vi skal indtaste det i en konfigurationsfil:

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

Nu skal vi pege en HBase-klient på den konfigurationsfil:

Configuration config = HBaseConfiguration.create (); Strengsti = this.getClass () .getClassLoader () .getResource ("hbase-site.xml") .getPath (); config.addResource (ny sti (sti)); 

Dernæst kontrollerer vi, om en forbindelse til HBase var vellykket - i tilfælde af en fejl, den MasterNotRunningException vil blive kastet:

HBaseAdmin.checkHBaseAvailable (config);

6. Oprettelse af en databasestruktur

Før vi begynder at tilføje data til HBase, skal vi oprette datastrukturen til indsættelse af rækker. Vi opretter en tabel med to kolonnefamilier:

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

For det første skal vi oprette en forbindelse til databasen og få admin objekt, som vi vil bruge til at manipulere en databasestruktur:

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

Derefter kan vi oprette en tabel ved at sende en forekomst af HTableDescriptor klasse til en createTable () metode til admin objekt:

HTableDescriptor desc = ny HTableDescriptor (tabel1); desc.addFamily (ny HColumnDescriptor (familie1)); desc.addFamily (ny HColumnDescriptor (familie2)); admin.createTable (desc);

7. Tilføjelse og hentning af elementer

Med den oprettede tabel kan vi tilføje nye data til den ved at oprette en Sætte objekt og kalder en sætte() metode til Bord objekt:

byte [] række1 = Bytes.toBytes ("række1") Put p = nyt sæt (række1); p.addImmutable (family1.getBytes (), qualifier1, Bytes.toBytes ("cell_data")); tabel1.put (p);

Hentning af tidligere oprettet række kan opnås ved hjælp af en klasse:

Få g = ny Get (række1); Resultat r = tabel1.get (g); byte [] værdi = r.getValue (familie1.getBytes (), kvalifikator1);

Det række1 er en rækkeidentifikator - vi kan bruge den til at hente en bestemt række fra databasen. Når du ringer:

Bytes.bytesToString (værdi)

det returnerede resultat indsættes tidligere cell_data.

8. Scanning og filtrering

Vi kan scanne tabellen og hente alle elementer inde i en given kvalifikation ved hjælp af en Scanning objekt (bemærk, at ResultScanner strækker sig Kan lukkes, så sørg for at ringe tæt() på det, når du er færdig):

Scan scan = ny Scan (); scan.addColumn (family1.getBytes (), qualifier1); ResultScanner scanner = tabel.getScanner (scanning); for (Resultatresultat: scanner) {System.out.println ("Fundet række:" + resultat); } 

Denne handling udskriver alle rækker inden i a kvalifikation1 med nogle yderligere oplysninger som tidsstempel:

Fundet række: keyvalues ​​= {Row1 / Family1: Qualifier1 / 1488202127489 / Put / vlen = 9 / seqid = 0}

Vi kan hente specifikke poster ved hjælp af filtre.

For det første opretter vi to filtre. Det filter1 angiver, at scanningsforespørgsel vil hente elementer, der er større end række1, og filter2 angiver, at vi kun er interesseret i rækker, der har en kvalifikation svarende til kvalifikation1:

Filter filter1 = nyt præfiksfilter (række1); Filter filter2 = nyt QualifierFilter (CompareOp.GREATER_OR_EQUAL, ny BinaryComparator (qualifier1)); Listefiltre = Arrays.asList (filter1, filter2);

Så kan vi få et resultatsæt fra en Scanning forespørgsel:

Scan scan = ny Scan (); scan.setFilter (ny FilterList (Operator.MUST_PASS_ALL, filtre)); prøv (ResultScanner scanner = tabel.getScanner (scanning)) {for (Resultat resultat: scanner) {System.out.println ("Fundet række:" + resultat); }}

Når du opretter en Filterliste vi passerede en Operatør.MUST_PASS_ALL - det betyder, at alle filtre skal opfyldes. Vi kan vælge en Operation.MUST_PASS_ONE hvis kun et filter skal opfyldes. I det resulterende sæt har vi kun rækker, der matcher angivne filtre.

9. Sletning af rækker

Endelig kan vi bruge en til at slette en række Slet klasse:

Slet slet = nyt Slet (række1); delete.addColumn (family1.getBytes (), qualifier1); table.delete (slet);

Vi sletter en række1 der ligger inde i en familie1.

10. Konklusion

I denne hurtige vejledning fokuserede vi på at kommunikere med en HBase-database. Vi så, hvordan man opretter forbindelse til HBase fra Java-klientbiblioteket, og hvordan man kører forskellige grundlæggende operationer.

Implementeringen af ​​alle disse eksempler og kodestykker findes i GitHub-projektet; dette er et Maven-projekt, så det skal være let at importere og køre som det er.