HBase s Javom

1. Pregled

U ovom ćemo članku pogledati HBase baza podataka Java Client knjižnica. HBase je distribuirana baza podataka koja koristi datotečni sustav Hadoop za pohranu podataka.

Stvorit ćemo Java primjer klijenta i tablicu u koju ćemo dodati nekoliko jednostavnih zapisa.

2. Struktura podataka HBase

U HBaseu podaci se grupiraju u obitelji stupaca. Svi članovi stupca obitelji stupaca imaju isti prefiks.

Na primjer, stupci obitelj1: kvalifikator1 i obitelj1: kvalifikator2 obojica su članovi obitelj1 obitelj kolona. Svi članovi obitelji stupaca pohranjeni su zajedno na datotečnom sustavu.

Unutar obitelji stupaca možemo staviti redak koji ima navedeni kvalifikator. Kvalifikator možemo smatrati vrstom naziva stupca.

Pogledajmo primjer zapisa iz Hbasea:

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'}

Imamo dvije obitelji kolona, ​​svaka od njih ima tri kvalifikacije s nekim staničnim podacima. Svaki redak ima ključ retka - to je jedinstveni identifikator retka. Pomoću tipke retka unosit ćemo, dohvaćati i brisati podatke.

3. Ovisnost HBase klijenta o Mavenu

Prije nego što se povežemo s HBase, moramo dodati hbase-klijent i hbase ovisnosti:

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

4. Postavljanje HBase

Moramo postaviti HBase kako bismo se mogli povezati s bibliotekom Java klijenta na nju. Instalacija je izvan dosega ovog članka, ali neke od vodiča za instalaciju HBase možete provjeriti na mreži.

Dalje, moramo lokalno pokrenuti HBase master izvršavanjem:

hbase master start

5. Spajanje na HBase s Jave

Da bismo se programski povezali s Jave na HBase, moramo definirati XML konfiguracijsku datoteku. Pokrenuli smo našu instancu HBase na localhostu pa je moramo unijeti u konfiguracijsku datoteku:

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

Sada moramo uputiti HBase klijenta na tu konfiguracijsku datoteku:

Konfiguracija config = HBaseConfiguration.create (); Niz puta = this.getClass () .getClassLoader () .getResource ("hbase-site.xml") .getPath (); config.addResource (novi put (put)); 

Dalje provjeravamo je li veza s HBase bila uspješna - u slučaju kvara, MasterNotRunningException bit će bačen:

HBaseAdmin.checkHBaseAvailable (konfiguracija);

6. Stvaranje strukture baze podataka

Prije nego počnemo dodavati podatke u HBase, moramo stvoriti strukturu podataka za umetanje redaka. Stvorit ćemo jednu tablicu s dvije obitelji stupaca:

private TableName table1 = TableName.valueOf ("Table1"); private String family1 = "Obitelj1"; private String family2 = "Obitelj2";

Prvo, moramo stvoriti vezu s bazom podataka i dobiti admin objekt koji ćemo koristiti za manipulaciju strukturom baze podataka:

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

Zatim možemo stvoriti tablicu prosljeđivanjem instance HTableDescriptor razred do a createTable () metoda na admin objekt:

HTableDescriptor desc = novi HTableDescriptor (tablica1); desc.addFamily (novi HColumnDescriptor (obitelj1)); desc.addFamily (novi HColumnDescriptor (obitelj2)); admin.createTable (desc);

7. Dodavanje i dohvaćanje elemenata

Stvorenom tablicom možemo joj dodavati nove podatke stvaranjem a Staviti objekt i pozivanje a staviti() metoda na Stol objekt:

byte [] row1 = Bytes.toBytes ("row1") Put p = novi Put (row1); p.addImmutable (family1.getBytes (), kvalifikator1, Bytes.toBytes ("data_data")); table1.put (p);

Dohvaćanje prethodno stvorenog retka može se postići pomoću a Dobiti razred:

Get g = novi Get (row1); Rezultat r = table1.get (g); bajt [] vrijednost = r.getValue (family1.getBytes (), kvalifikator1);

The red1 je identifikator retka - pomoću njega možemo dohvatiti određeni redak iz baze podataka. Kada zovete:

Bytes.bytesToString (vrijednost)

vraćeni rezultat bit će prethodno umetnut podaci o ćeliji.

8. Skeniranje i filtriranje

Možemo skenirati tablicu, dohvaćajući sve elemente unutar datog kvalifikatora pomoću a Skenirati objekt (imajte na umu da Skener rezultata proteže se Može se zatvoriti, zato obavezno nazovite Zatvoriti() na njemu kad završite):

Skeniranje skeniranja = novo Skeniranje (); scan.addColumn (family1.getBytes (), kvalifikator1); ResultScanner scanner = table.getScanner (skeniranje); za (Rezultat rezultata: skener) {System.out.println ("Pronađen redak:" + rezultat); } 

Ta će operacija ispisati sve retke unutar a kvalifikator1 s nekim dodatnim informacijama poput vremenske oznake:

Pronađen redak: keyvalues ​​= {Red1 / Obitelj1: Kvalifikator1 / 1488202127489 / Put / vlen = 9 / seqid = 0}

Pomoću filtara možemo dohvatiti određene zapise.

Prvo, stvaramo dva filtra. The filter1 određuje da će upit za skeniranje dohvatiti elemente veće od red1, i filter2 određuje da nas zanimaju samo redovi koji imaju kvalifikator jednak kvalifikator1:

Filter filter1 = novi PrefixFilter (redak1); Filtriraj filter2 = novi kvalifikatorFilter (CompareOp.GREATER_OR_EQUAL, novi BinaryComparator (kvalifikator1)); Filteri popisa = Arrays.asList (filter1, filter2);

Tada možemo dobiti skup rezultata iz a Skenirati upit:

Skeniranje skeniranja = novo Skeniranje (); scan.setFilter (novi FilterList (Operator.MUST_PASS_ALL, filtri)); probajte (ResultScanner scanner = table.getScanner (scan)) {for (Rezultat rezultata: skener) {System.out.println ("Pronađen redak:" + rezultat); }}

Prilikom stvaranja a FilterList prošli smo an Operator.MUST_PASS_ALL - to znači da svi filtri moraju biti zadovoljeni. Možemo odabrati Operacija.MUST_PASS_ONE ako treba zadovoljiti samo jedan filtar. U rezultirajućem skupu imat ćemo samo retke koji se podudaraju s navedenim filtrima.

9. Brisanje redaka

Konačno, za brisanje retka možemo koristiti a Izbrisati razred:

Delete delete = novo Delete (row1); delete.addColumn (family1.getBytes (), kvalifikator1); table.delete (brisanje);

Brišemo a red1 koja se nalazi unutar a obitelj1.

10. Zaključak

U ovom smo se brzom vodiču usredotočili na komunikaciju s bazom podataka HBase. Vidjeli smo kako se povezati s HBase iz biblioteke Java klijenta i kako pokrenuti razne osnovne operacije.

Implementacija svih ovih primjera i isječaka koda može se naći u projektu GitHub; ovo je Mavenov projekt, pa bi ga trebalo biti lako uvesti i pokrenuti kakav jest.