HBase med Java
1. Oversikt
I denne artikkelen ser vi på HBase database Java Client-bibliotek. HBase er en distribuert database som bruker Hadoop-filsystemet til å lagre data.
Vi oppretter en Java-eksempelklient og en tabell som vi vil legge til noen enkle poster.
2. HBase datastruktur
I HBase er data gruppert i kolonnefamilier. Alle kolonnemedlemmer i en kolonnefamilie har samme prefiks.
For eksempel kolonnene familie1: kvalifisering1 og familie1: kvalifisering2 er begge medlemmer av familie1 kolonnefamilie. Alle kolonnefamiliemedlemmer er lagret sammen på filsystemet.
Inne i kolonnefamilien kan vi sette en rad som har en spesifisert kvalifisering. Vi kan tenke på en kvalifisering som et slags kolonnenavn.
La oss se et eksempel 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 av dem har tre kvalifikasjoner med noen celledata i. Hver rad har en radnøkkel - det er en unik radidentifikator. Vi bruker radetasten til å sette inn, hente og slette dataene.
3. HBase Client Maven Avhengighet
Før vi kobler til HBase, må vi legge til hbase-klient og hbase avhengigheter:
org.apache.hbase hbase-client $ {hbase.version} org.apache.hbase hbase $ {hbase.version}
4. HBase-oppsett
Vi må sette opp HBase for å kunne koble fra et Java-klientbibliotek til det. Installasjonen er utenfor omfanget av denne artikkelen, men du kan sjekke ut noen av HBase installasjonsveiledninger online.
Deretter må vi starte en HBase-mester lokalt ved å utføre:
hbase master start
5. Koble til HBase fra Java
For å koble programmatisk fra Java til HBase, må vi definere en XML-konfigurasjonsfil. Vi startet HBase-forekomsten vår på localhost, så vi må legge den inn i en konfigurasjonsfil:
hbase.zookeeper.quorum localhost hbase.zookeeper.property.clientPort 2181
Nå må vi peke en HBase-klient til den konfigurasjonsfilen:
Configuration config = HBaseConfiguration.create (); Strengsti = this.getClass () .getClassLoader () .getResource ("hbase-site.xml") .getPath (); config.addResource (ny sti (sti));
Deretter sjekker vi om en forbindelse til HBase var vellykket - i tilfelle en feil, MasterNotRunningException vil bli kastet:
HBaseAdmin.checkHBaseAvailable (config);
6. Opprette en databasestruktur
Før vi begynner å legge til data i HBase, må vi opprette datastrukturen for å sette inn rader. Vi lager en tabell med to kolonnefamilier:
private TableName table1 = TableName.valueOf ("Table1"); private String family1 = "Family1"; private String family2 = "Family2";
For det første må vi opprette en forbindelse til databasen og få admin objekt, som vi vil bruke til å manipulere en databasestruktur:
Connection connection = ConnectionFactory.createConnection (config) Admin admin = connection.getAdmin ();
Deretter kan vi lage en tabell ved å sende en forekomst av HTableDescriptor klasse til en createTable () metoden på admin gjenstand:
HTableDescriptor desc = ny HTableDescriptor (tabell1); desc.addFamily (ny HColumnDescriptor (familie1)); desc.addFamily (ny HColumnDescriptor (familie2)); admin.createTable (desc);
7. Legge til og hente elementer
Når tabellen er opprettet, kan vi legge til nye data i den ved å opprette en Sette objekt og kaller en sette() metoden på Bord gjenstand:
byte [] rad1 = Bytes.toBytes ("rad1") Sett p = ny Put (rad1); p.addImmutable (family1.getBytes (), qualifier1, Bytes.toBytes ("cell_data")); table1.put (p);
Å hente tidligere opprettet rad kan oppnås ved å bruke a Få klasse:
Få g = ny Get (rad1); Resultat r = tabell1.get (g); byte [] verdi = r.getValue (familie1.getBytes (), kvalifiserings1);
De rad1 er en radidentifikator - vi kan bruke den til å hente en bestemt rad fra databasen. Når du ringer:
Bytes.bytesToString (verdi)
det returnerte resultatet blir tidligere satt inn cell_data.
8. Skanning og filtrering
Vi kan skanne tabellen og hente alle elementene i en gitt kvalifikasjon ved å bruke a Skann objekt (merk deg at ResultScanner strekker Lukkbar, så husk å ringe Lukk() på det når du er ferdig):
Skann skanning = ny skanning (); scan.addColumn (family1.getBytes (), qualifier1); ResultScanner skanner = table.getScanner (skanning); for (Resultatresultat: skanner) {System.out.println ("Funnet rad:" + resultat); }
Denne operasjonen vil skrive ut alle rader inne i a kvalifisering1 med litt tilleggsinformasjon som tidsstempel:
Rad funnet: keyvalues = {Row1 / Family1: Qualifier1 / 1488202127489 / Put / vlen = 9 / seqid = 0}
Vi kan hente spesifikke poster ved å bruke filtre.
For det første lager vi to filtre. De filter1 spesifiserer at skanningsforespørsel vil hente elementer som er større enn rad1, og filter2 angir at vi bare er interessert i rader som har en kvalifisering lik kvalifisering1:
Filter filter1 = nytt prefiksfilter (rad1); Filter filter2 = ny QualifierFilter (CompareOp.GREATER_OR_EQUAL, ny BinaryComparator (kvalifikator1)); Listefiltre = Arrays.asList (filter1, filter2);
Da kan vi få et resultatsett fra a Skann spørsmål:
Skann skanning = ny skanning (); scan.setFilter (ny FilterList (Operator.MUST_PASS_ALL, filtre)); prøv (ResultScanner skanner = table.getScanner (skanning)) {for (Resultat resultat: skanner) {System.out.println ("Funnet rad:" + resultat); }}
Når du oppretter en Filterliste vi passerte en Operatør.MUST_PASS_ALL - det betyr at alle filtre må oppfylles. Vi kan velge en Operasjon.MUST_PASS_ONE hvis bare ett filter må oppfylles. I det resulterende settet vil vi bare ha rader som samsvarer med spesifiserte filtre.
9. Slette rader
Til slutt, for å slette en rad, kan vi bruke en Slett klasse:
Slett slett = nytt Slett (rad1); delete.addColumn (family1.getBytes (), qualifier1); tabell. slett (slett);
Vi sletter en rad1 som ligger inne i en familie1.
10. Konklusjon
I denne raske opplæringen fokuserte vi på å kommunisere med en HBase-database. Vi så hvordan du kobler til HBase fra Java-klientbiblioteket og hvordan du kjører forskjellige grunnleggende operasjoner.
Implementeringen av alle disse eksemplene og kodebiter finner du i GitHub-prosjektet; dette er et Maven-prosjekt, så det skal være enkelt å importere og kjøre som det er.