Az olvasó ebből a kombinált videó és olvasóleckéből gyakorlati tudást szerezhet az Apache Flume rendszer felépítéséről, valamint alapvető felhasználásának módjáról. Áttekintjük az eszköz architekturális felépítését, valamint az alapvetően támogatott komponenseit. Több konkrét példa konfiguráció segítségével bemutatjuk, hogyan használható a Flume különböző adat forrásokkal (hálózat, könyvtrá) és adatnyelőkkel (konzol, HDFS).
A lecke fejezetei:
- 1. fejezet: az Apache Flume eszköz felépítésének áttekintése, alapvető adatforrások és nyelők típusai (olvasó)
- 2. fejezet: az Apache Flume eszköz telepítése, futtatása és Hello World példa beüzemelése (olvasó)
- 3. fejezet: komoplexebb Apache Flume konfiguráció, HDFS sink bemutatása (videó)
Az Apache Flume egy elosztott, megbízható és nagy rendelkezésre állású szolgáltatás nagy mennyiségű napló adat gyűjtéséhez, egyesítéséhez és mozgatásához. Az architektúrája egyszerű és rugalmas, amely adatok folyamszerű átvitelére (stream) lett tervezve (lásd lenti ábra). A Flume robosztus, hibatűrő és megbízható számos beépített mechanizmus által. Egyszerű és könnyen bővíthető adatmodellt alkalmaz.
A Flume segítségével adat forrásokat (source) és adatnyelőket (sink) definiálhatunk, az adat forrásokból stream szerűen érkeznek az események, amelyeket egy csatorna az adatnyelőhöz vezet, ami eltárolja azt. A Flume számos adatforrást [1] és adatnyelőt támogat [2], ami persze bővíthető is. Számunkra a legérdekesebb a HDFS adatnyelő, amely tetszőleges stream forrás adatait valós időben tárolni tudja HDFS-re (lásd ábra). A Flume agent működéséről és a konfigurációjának módjáról a következő fejezetek tartalmaz további hasznos információt.
A Flume adatfolyam alapvető eleme az esemény (event), amely nem más, mint egy hasznos adatot tartalmazó bájtsorozat opcionális string attribútumokkal. A Flume ügynök (agent) egy JVM folyamat, amely futtatja a Flume komponenseket, amelyek segítségével a külső forrásból érkező események eljutnak a következő adat nyelőig (egy ugrás, vagy hop).
A Flume adat forrás elkapja és továbbítja azokat az eseményeket, amelyek valamilyen külső forrásból érkeznek hozzá, pl. egy web szervertől. A külső forrás olyan formátumban küldi az eseményeket a Flume adat forráshoz, amit az felismer. Azaz több speciális, előre implementált adat forrás típus és adatnyelő létezik, például egy Apache Avro [3] source az Apache Avro rendszer kliense által küldött, vagy másik vezeték Avro target-jéből származó eseményeket tudja kezelni. Amint egy Flume source fogad egy eseményt, azt azonnal egy vagy több csatornán (channel) továbbítja. A csatorna egy passzív tároló, amely addig tárolja az eseményeket, amíg azt egy Flume sink fel nem dolgozza. A fájl csatorna egy példa a csatornára, ami egy lokális fájlban tárolja az eseményeket. A sink eltávolítja az eseményt a csatornából és egy külső tárolóba helyezi, mint például a HDFS (a Flume HDFS sink segítségével), vagy továbbítja egy másik Flume source felé a következő Flume agent (következő ugrás, next hop) számára az folyamban. Egy ügynökön belül a forrás és nyelő aszinkron módon működnek, ahol a csatorna biztosítja az események pufferelését. A Flume tetszőleges ugrás számű komplex adatfolyamok definiálását is lehetővé teszi. További technikai részletekért tekintsük át a hivatalos dokumentációt [4].
A Flume által támogatott főbb adat források és nyelők típusai az alábbi két ábrán láthatók. Természetesen lehetőség van teljesen egyedi, saját forrás és nyelő implementálására is a megfelelő interfészek megvalósítása által.
Lássuk hogyan működik gyakorlatban az Apache Flume. Mielőtt telepítenénk a Flume ügynököt és létrehoznánk a megfelelő konfigurációt, indítsuk el a Docker alapú Hadoop klasztert, amit a 3g_BigData-hadoop-SPOC
olvasólecke 1. fejezetében ismertettünk. Ezután lépjünk be a namenode
container-re egy bash-t futtatva:
xxxxxxxxxx
$ docker exec -it namenode bash
Erre a csomópontra fogjuk telepíteni az Apache Flume ügynököt kényelmi okok miatt (a HDFS fájlrendszert localhost-on keresztül elérjük), de más, tetszőleges hálózaton belüli gépre is telepíthető lenne. A telepítés menete:
xxxxxxxxxx
root@b055549cdaca:/# curl https://archive.apache.org/dist/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz -o apache-flume-1.9.0-bin.tar.gz
xxxxxxxxxx
root@b055549cdaca:/# tar xzf apache-flume-1.9.0-bin.tar.gz
FLUME_HOME
környezeti változótxxxxxxxxxx
root@b055549cdaca:/# export FLUME_HOME=/apache-flume-1.9.0-bin
xxxxxxxxxx
root@b055549cdaca:/# $FLUME_HOME/bin/flume-ng version
Amennyiben látjuk a képernyőre kiírva, hogy Flume 1.9.0
, a telepítés sikeres (a folyamatot az alábbi ábra mutatja).
Sikeres telepítés után hozzuk létre az első Flume adat folyamunkat. Ehhez egy egyszerű ügynököt konfigurálunk be, amelyik a hálózat egy bizonyos portján figyeli az adatokat (netcat source), és minden ott beérkező üzenetet (event) a képernyőre ír ki egy konzol logger segítségével (logger sink). Az átviteli csatorna memóriában tárolja az eseményeket. Az example.conf
tartalma legyen a következő (saját gépen tetszőleges szövegszerkesztővel készítsük el, majd másoljuk át a docker container-be).
x# example.conf: A single-node Flume configuration
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
Miután elkészítettük a specifikációnak megfelelő Flume adatfolyam leírót, másoljuk át a fájlt a namenode
docker container-be a megfelelő Flume konfigurációs könyvtárba:
xxxxxxxxxx
$ docker cp example.conf namenode:/apache-flume-1.9.0-bin/conf/example.conf
Ezután készen állunk arra, hogy elindítsuk az ügynök szolgáltatást (Flume agent service) a következő utasítással:
xxxxxxxxxx
root@b055549cdaca:/apache-flume-1.9.0-bin# bin/flume-ng agent --conf conf --conf-file conf/example.conf --name a1 -Dflume.root.logger=INFO,console
A paraméterekkel megadjuk az agent nevét és a konfiguráció helyét, valamint mivel nincs log4j konfigurációnk, egy JVM paraméterrel beállítjuk, hogy konzolra történjen a log üzenetek kiírása (azaz az eventek kiírása). Az agent az elindulás után a namnode
44444-es portján figyel, és minden odaérkező üzenetet (event) elkap, majd acsatornán keresztül a sink felé továbbít, ami log üzenetben kiírja a kapott event-et. Tesztelés gyanánt nyissunk egy újabb terminál ablakot, és kapcsolódjunk a namenode
container-hez a fenti módon, majd küldjünk egy Hello Wolrd!
üzenetet a localhost:44444
-es címre netcat
program segítségével:
xxxxxxxxxx
$ docker exec -it namenode bash
root@b055549cdaca:/# netcat localhost 44444
Hello World!
OK
Ennek hatására az ügynököt futtató terminálban azt kell látnunk, hogy a konzolra log üzenetben kiíródott a Hello World!
üzenet!
Ebben a fejezetben a HDFS sink-re koncentrálunk. Az alábbi videó lecke bemutatja, hogyan kell módosítani a 2. fejezetben összeállított Flume konfigurációt ahhoz, hogy a forráson érkező eseményeket ne egyszerűen kiírassuk logger-rel, hanem egyenesen HDFS-re tároljuk. A videóban használt konfigurációs állomány (example-hdfs.conf
) az alábbi:
xxxxxxxxxx
# example-hdfs.conf: A single-node Flume configuration
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# Describe the sink HDFS
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://localhost:9000/flume/testdata
a1.sinks.k1.hdfs.rollInterval = 0
a1.sinks.k1.hdfs.fileType = DataStream
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
spool dir
), ahonnan a fájlokat a Flume folyam HDFS-re tárolja!syslog -> http
, A2: http -> hdfs
! [1] https://data-flair.training/blogs/flume-source/
[2] https://data-flair.training/blogs/flume-sink/
[4] https://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html#the-plugins-d-directory