NoSQL Hadoop felett - Apache HBase

Összefoglalás

Ez az olvasólecke gyakorlati ismereteket nyújt az Apache HBase rendszer használatáról. Bemutatjuk, hogyan kell önálló és elosztott módban telepíteni a HBase szervert, illetve hogyan tudjuk virtualizált környezetben elindítani azt. Részletes példákon keresztül bemutatjuk a hbase shell parancssori alkalmazás használatát, az egyes adat modell és adat manipulációs HBase utasításokkal együtt. Betekintést kaphat az olvasó abba is, hogyan lehet Java kódból natív módon elérni a HBase szervert és hozzáférni a tárolt adatokhoz.
A lecke fejezetei:
  • 1. fejezet: Apache HBase telepítése, docker stack indítása és a parancssori kliens használata (olvasó)
  • 2. fejezet: Apache HBase programozása a natív Java API-n keresztül (olvasó)
Téma típusa: gyakorlati
Olvasási idő: 50 perc

Book to read, knowledge, lecture, open book, reading book icon 1. fejezet

Apache HBase indítása, parancssori kliens használata

HBase telepítése és docker stack indítása

Ahogy a kapcsolódó előadás olvasóleckéiben (7e_BigData-nosql-over-hadoop-SPOC) már láttuk, az Apache HBase [1] egy NoSQL adatbázis, ami a HDFS-t használja az adatok elosztott tárolásához. A HBase telepítése a megfelelő bináris csomag letöltéséből, kicsomagolásából, valamint a környezeti változók és konfigurációs állományok beállításából áll. Részletek a hivatalos dokumentációban [2] olvashatók. Mi a lokális gépre történő telepítés helyett egy előre előkészített docker container stack-et fogunk használni, mert a HBase használatához egy Hadoop klaszterre is szükség van. A következőkben bemutatott stack az összes szükséges docker image-t elindítja, ami szükséges a HBase azonnali használatához. A következő példák tetszőleges gépen futtathatók, ahol telepítve van a Dokcer környezet, valamint a Git verziókövető kliens.

A HBase stack indításához először töltsük le a docker leírókat és a teljes stack konfigurációt tartalmazó git repository-t a következő parancs segítségével:

A letöltött docker-hbase mappa két konfigurációs állományt is tartalmaz: docker-compose-standalone.yml és docker-compose-distributed-local.yml. Mi a docker-compose-standalone.yml-t fogjuk használni, amely ún. standalone módban indítja a HBase-t.

Standalone konfiguráció
Soha ne használjuk a HBase standalone módját éles környezetben! Ez csak és kizárólag a fejlesztést és tesztelést könnyítő konfigurációs lehetőség. Az éles környezetben a HBase-t mindig elosztott módon, klaszterben futtassuk, hogy kihasználhassuk a hatalmas adatok párhuzamos feldolgozásából adódó előnyöket!

A fent említett standalone konfiguráció az alábbi stack-et definiálja:

Az elosztott konfiguráció stack-je a HBase standalone szervere helyett három másik container-t indít:

A standalone stack indításához lépjünk be a docker-hbase mappába, és adjuk ki a következő docker parancsot:

A stack sikeres indítása után a következő paranccsal ellenőrizhetjük, hogy minden container sikeresen elindult:

Ütköző container nevek
Ha korábban egy másik docker stack-et is indítottunk, ahol bizonyos conainer-eknek ugyanaz volt a neve (pl. namenode, datanode elég gyakori), akkor a docker panaszkodhat, hogy ilyen nevű container már létezik. Az összes ilyen container-t töröljünk (az azonosítójuk is kiíródik) a következő parancssal: docker rm {container_id}!

HBase parancssori kliens használata

A HBase azonnali használatához a HBase parancssori kliens eszközt (hbase shell) [3] használhatjuk. Ehhez lépjünk be a hbase szerver container-be, és adjuk ki az alábbi parancsot:

Hozzunk létre egy táblát hr_table néven, két oszlop családdal: personal és salary. Az első a HR nyilvántartásban szereplő személyes adatait írja le, a másik pedig a fizetési adatokat. A bejegyzések hiányosak is lehetnek, azaz nem kell minden sorban minden adatot kitölteni, valamint lehetnek olyan értékek, ami csak bizonyos soroknál jelennek meg. Lássuk a tábla létrehozó utasítást!

A létrehozott tábla leírását a describe parancssal tudjuk lekérdni:

Két oszlop család jött létre, mindegyikhez láthatjuk azok tulajdonságait is (tömörítés, tárolás helye, stb.). Ezután szúrjunk be adatokat a put parancs segítségével:

Egy sort adtunk hozzá a táblához, a sor azonosítója az 123456AB, egy oszlop érték a név, ami a personal családba tartozik, és a name qualifier-t használja. Adjunk hozzá még néhány adatot a táblához!

HBase shell
A HBase shell nem támogatja egyszerre több cella beszúrását, így azokat egyesével kell hozzáadnunk. Azonban, ha az egyszerre történő hozzáadást szeretnénk szimulálni, használhatjuk implicit módon ugyanazt a timestamp-et.

Látszik, hogy nem ugyanazokat az oszlopokat töltöttük fel az egyes sorokhoz, noha van átfedés. Miután feltöltöttük adatokkal a táblát, nézzük a lekérdező műveleteket:

A scan művelettel a teljes tábla tartalmat kaphatjuk vissza, természetesen szűréseket adhatunk a lekérdezéshez. A get utasítás egy adott sorhoz ad vissza értékeket (azt, hogy mit, természetesen itt is szűrhető). Adatok törlésére pedig a delete művelet ad lehetőséget (a deleteall egy sor összes oszlop értékét törli):

Book to read, knowledge, lecture, open book, reading book icon 2. fejezet

Apache HBase programozása Java-ban

Ebben a fejezetben bemutatjuk, hogyan lehet a HBase-ben tárolt adatokhoz hozzáférni, azokat manipulálni programkódból. Mivel a HBase rendelkezik Thrift [4] interfész leíró szolgáltatással, azon keresztül gyakorlatilag tetszőleges nyelvű kliensből tudunk csatlakozni hozzá. Az alábbi példakód Java nyelven készült, ami viszont a HBase által nyújtott natív Java API-t használja. A példakód (code/8g_BigData-nosql-over-hadoop-SPOC/HBaseNativeClient.java) először újabb adatokat szúr be a hr_table táblába, majd lekérdezi és kiíratja azokat. A kód váza így néz ki:

A kapcsolódás inicializálása nagyon egyszerű, egy HBaseConfiguration objektum alapján egy Connection-t kell létrehozni, aminek a segítségével aztán a megfelelő adatmanipuláló műveleteket el tudjuk végezni. Mivel az alap beállításokkal dolgozunk, nem kell módosítani semmin, egyébként a konfigurációnak tudnánk property-ket beállítani. A projekthez a hbase-*.jar függőségek kellenek (lásd lib könyvtár). Az új adat beszúrását végző kódrészlet a következő:

A Connection segítségével lekérhetünk egy Table példányt, amin aztán put()´ és egyéb műveletet hajthatunk végre. Minden műveletnek megvan a megfelelő Java osztálya. Létrehozunk egy Put objektumot meglévő sor kulccsal és egy teljesen újat is. Az addColumn() segítségével hozzáadjuk az osztályt, qualifier-t és értéket, majd elvégezzük a műveletet és lezárjuk a táblázatot. A többi metódus hasonlóan épül fel, a kódjuk a következő:

A program fordítása és futtatása előtt néhány változtatást kell tennünk a docker stack-en. Módosítsuk a docker-compose-distributed-local.yml fájlt, adjuk hozzá a 16000:16000-es port átirányítást a hbase-master container-hez és a 16020:16020-at a hbase-region container-hez. Állítsuk le a standalone konfigurációt, majd indítsuk el a distributed local-t:

Ezen felül a lokális operációs rendszerünk hosts fájljába (/etc/hosts vagy C:\Windows\System32\Drivers\etc\hosts) be kell tennünk az alábbi két bejegyzést:

Ezek után fordítsuk le a Java programot és futtassuk az alábbi utasításokkal:

Check mark icon set. Green OK or V tick, red X, exclamation mark ...További feladatok

  1. Vigyük fel a personal_entries.json, billing_entries.json, és sales_entries.csv (a 2g_BigData-data-transform-SPOC leckéből) fájlok tartalmát egy HBase adattáblába a parancssori kliens segítségével!
  2. Írjunk egy Java programot, ami az előbb felvitt táblából lekéri az összes 1970 után született személy adatait, és kiírja azt!
  3. Valósítsuk meg 2. fejezetben bemutatott Java program funkcionalitását Python nyelven! Használjunk külső könyvtárat (pl. HappyBase [5]) a HBase eléréséhez!
  4. Hozzunk létre egy olyan Flume adatfolyamot, amely a netcat adat forrásból érkező adatokat közvetlenül egy HBase táblába menti! Lásd HBase sink [6, 7]!
  5. Integráljuk össze az Apache Hive és HBase rendszereket! Azaz tegyük elérhetővé a HiveQL lekérdezéseket egy HBase táblában tárolt adatok lekéréséhez!

Referenciák

[1] https://hbase.apache.org/

[2] https://hbase.apache.org/book.html

[3] https://hbase.apache.org/book.html#shell

[4] https://thrift.apache.org/

[5] https://happybase.readthedocs.io/en/latest/

[6] https://flume.apache.org/FlumeUserGuide.html

[7] https://blogs.apache.org/flume/entry/streaming_data_into_apache_hbase