Exemplu de POC HBase



Această postare discută despre un exemplu de dovadă a conceptului pentru HBase. Puteți găsi o explicație clară a conceptului pentru a vă înțelege mai bine HBase.

În acest blog vom discuta despre un exemplu de dovadă a conceptului pentru HBase.





Aici avem un set de date ca în imaginea de mai jos.

Sample_Hbase_Use_case



Acest set de date constă în detalii despre durata apelurilor totale primite, a apelurilor efectuate și a mesajelor trimise de la un anumit număr de telefon mobil la o anumită dată.

Primul câmp reprezintă data, al doilea câmp reprezintă numărul de telefon mobil, al treilea câmp reprezintă durata totală a apelurilor primite, al patrulea câmp reprezintă durata totală a apelurilor efectuate, iar al cincilea câmp reprezintă numărul total de mesaje trimise.

Acum sarcina noastră este să preluăm informațiile despre durata apelurilor și mesajelor trimise și primite de la un număr de telefon la o anumită dată.



În acest caz de utilizare, încerc să filtrez înregistrările 15aMartie 2014. Iată un program HBase pentru a realiza acest lucru.

Mai jos este codul complet al acestuia.

public clasă probă{

privat static Configurare conf

static HTable masa

public eșantion (String tableName, String colFams) aruncă IOException {

conf = HBaseConfiguration. crea ()

createTable (tableName, colFams)

masa = nou HTable ( conf , tableName)

}

nul createTable (String tableName, String colFams) aruncă IOException {

HBaseAdmin hbase = nou HBaseAdmin ( conf )

HTableDescriptor desc = nou HTableDescriptor (tableName)

HColumnDescriptor meta = nou HColumnDescriptor (colFams.getBytes ())

desc.addFamily (meta)

hbase.createTable (desc)

}

public static nul addColumnEntry (String tableName, String rând,

String colFamilyName, String colName, String valori)

aruncă IOException {

octet [] rowKey = Octeți. toBytes (rând)

Pune putdata = nou Pune (rowKey)

putdata.add (octeți. toBytes (colFamilyName), octeți. toBytes (colName),

Octet. toBytes (valori))

masa .put (putdata)

}

public static nul getAllRecord (String tableName, String startPartialKey,

String endPartialKey) aruncă IOException {

încerca {

Scanează s

dacă (startPartialKey == nul || endPartialKey == nul )

s = nou Scanează ()

altceva

s = nou Scanare (octeți. toBytes (startPartialKey),

Octet. toBytes (endPartialKey))

ResultScanner ss = masa .getScanner (s)

HashMapoutputRec = nou HashMap()

String imsi = „”

pentru (Rezultatul r: ss) {

HashMap keyVal = nou HashMap ()

pentru (KeyValue kv: r.raw ()) {

imsi = nou Șir (kv.getRow ()). Șir (10)

keyVal.put ( nou Șir (kv.getQualifier ()),

nou Șir (kv.getValue ()))

outputRec.put (imsi, keyVal)

dacă (keyVal.size () == 3)

Sistem. afară .println (ia + ”” + „Minute de intrare:”

+ keyVal.get („c1 ″) +” Minute viitoare: ”

+ keyVal.get („c2 ″) +” Mesaje: ”

+ keyVal.get („c3”))

}

}

} in cele din urma {

}

}

public static nul main (String [] args) aruncă IOException {

String tableName = „daterecords”

diferența dintre marionetă și bucătar

String colFamilyNames = „i”

test de probă = nou eșantion (tableName, colFamilyNames)

String fileName = „/ home / cloudera / Desktop / data”

// Aceasta va face referire la câte o linie

Linia șirului = nul

încerca {

// FileReader citește fișiere text în codificarea implicită.

FileReader fileReader = nou FileReader (fileName)

// Înfășurați întotdeauna FileReader în BufferedReader.

Reader tamponat nou BufferedReader (fileReader)

in timp ce ((line = bufferedReader.readLine ())! = nul ) {

String [] valori = line.split (”“)

addColumnEntry (tableName, valori [0] + „-” + valori [1],

colFamilyNames, „c1”, valori [2])

addColumnEntry (tableName, valori [0] + „-” + valori [1],

colFamilyNames, „c2”, valori [3])

addColumnEntry (tableName, valori [0] + „-” + valori [1],

colFamilyNames, „c3”, valori [4])

}

bufferedReader.close ()

} captură (FileNotFoundException ex) {)

Sistem. afară .println („Nu se poate deschide fișierul‘ ”+ nume fișier +„ ‘”)

} captură (IOException ex) {

Sistem. afară .println („Eroare la citirea fișierului‘ ”+ numele fișierului +„ ‘”)

// Sau am putea face acest lucru:

// ex.printStackTrace ()

}

getAllRecord (tableName, „20140315”, „20140316”)

}

}

Aici am creat un obiect de configurare, clasă HTable și crearea tabelului Hbase cu numele: daterecords și familia de coloane: eu .

În acest caz de utilizare, vom lua combinația dintre dată și număr de telefon separat prin „-” ca cheie de rând pentru acest tabel Hbase și duratele apelurilor primite, efectuate, numărul de mesaje trimise ca coloane „c1”, „ c2 ',' c3 'pentru familia de coloane' i '.

Avem datele de intrare stocate în sistemul de fișiere local al Cloudera. Deci, trebuie să scriem Java Logic care citește datele din fișier.

Mai jos este logica Java.

În această metodă stocăm datele în tabel pentru fiecare coloană a familiei de coloane.

Putem verifica datele stocate în tabelul Hbase ‘daterecords’ utilizând comanda de scanare.

Veți primi datele ca în imaginea de mai jos.

Acum am introdus datele în Tabelul HBase cu succes.

Să recuperăm înregistrările stocate în tabelul unei anumite date.

În acest caz de utilizare, încercăm să recuperăm înregistrările datei: 15aMartie 2014

Pentru a prelua înregistrările, am creat o metodă

getAllRecord (String tableName, String startPartialKey, String endPartialKey)

Primul parametru reprezintă numele tabelului, al doilea reprezintă data de începere de la care trebuie să preluăm datele, iar al treilea este data următoare a datei de începere.

De exemplu:

getAllRecord (tableName, „20140315”, „20140316”)

Acum să ne înțelegem logică a acestei metode.

Încercăm să scanăm tabelul Hbase folosind HBase API cu ajutorul startPartialKey și endPartialKey.

Deoarece StartPartialKey și endPartialkey nu sunt nule, va merge la altfel să blocheze și să scaneze înregistrările având valoarea startPartialKey.

Am creat un obiect al scanerului de rezultate care stochează înregistrările scanate ale tabelului Hbase și un HashMap pentru a stoca rezultatul care va fi rezultatul.

Creăm un obiect al rezultatului pentru a obține stocarea de date în scanerul de rezultate și executăm o buclă for.

imsi este șirul definit pentru a stoca numărul de mobil și keyVal este o Hash Map care stochează ieșirea preluată din coloana unui anumit telefon.

Am dat 20140315-1234567890 dupa cum cheie de rând la tabelul Hbase. În acest 20140315 reprezintă data și 1234567890 reprezintă numărul de telefon mobil.

Deoarece avem nevoie doar de numărul de telefon mobil, folosim metoda de șir pentru a-l prelua.

Preluăm datele din r.raw () și le stocăm în HashMap folosind Put.

În cele din urmă, încercăm să le imprimăm pe consolă.

Ieșirea va fi ca în imaginea de mai jos.

Am recuperat cu succes înregistrările datei: 15aMartie 2014.