Video: Hadoop Processing Frameworks 2024
Sommige gegevens die in het Hadoop Distributed File System (HDFS) terechtkomen, kunnen daar terechtkomen via laadbewerkingen van databases of andere soorten batchprocessen, maar wat als u de gegevens wilt vastleggen die in high-throughput-datastreams worden gegenereerd, zoals toepassingsloggegevens? Apache Flume is de huidige standaardmanier om dat eenvoudig, efficiënt en veilig te doen.
Apache Flume , een ander topproject van de Apache Software Foundation, is een gedistribueerd systeem voor het verzamelen en verplaatsen van grote hoeveelheden streaminggegevens van verschillende bronnen naar een gecentraliseerde gegevensopslag.
Anders gezegd, Flume is ontworpen voor de continue opname van gegevens in HDFS. De gegevens kunnen elk soort gegevens zijn, maar Flume is met name geschikt voor het verwerken van loggegevens, zoals de loggegevens van webservers. Eenheden van de gegevens die door Flume worden verwerkt, worden gebeurtenissen genoemd; een voorbeeld van een gebeurtenis is een logboekrecord.
Om te begrijpen hoe Flume werkt in een Hadoop-cluster, moet u weten dat Flume wordt uitgevoerd als een of meer agents en dat elke agent drie pluggable componenten heeft: bronnen, kanalen en putten:
-
Bronnen haal gegevens op en verzend deze naar kanalen.
-
Kanalen bevatten gegevenswachtrijen en dienen als leidingen tussen bronnen en putten, wat handig is wanneer de binnenkomende stroomsnelheid de uitgaande stroomsnelheid overschrijdt.
-
Sinks verwerken gegevens die zijn ontvangen van kanalen en leveren deze af naar een bestemming, zoals HDFS.
Een agent moet ten minste één van elke component laten uitvoeren en elke agent bevindt zich in zijn eigen exemplaar van de Java Virtual Machine (JVM).
Een gebeurtenis die door een bron naar een kanaal is geschreven, wordt niet van dat kanaal verwijderd totdat een gootsteen deze via een transactie verwijdert. Als er zich een netwerkfout voordoet, houden kanalen hun gebeurtenissen in de wacht totdat ze door de gootsteen naar het cluster kunnen worden geschreven. Een in-geheugen kanaal kan gebeurtenissen snel verwerken, maar het is vluchtig en kan niet worden hersteld, terwijl een op bestanden gebaseerd kanaal persistentie biedt en kan worden hersteld in het geval van een storing.
Elke agent kan verschillende bronnen, kanalen en putten hebben en hoewel een bron naar veel kanalen kan schrijven, kan een sink gegevens van slechts één kanaal halen.
Een agent is slechts een JVM waarop Flume wordt uitgevoerd en de sinks voor elk agentknooppunt in de Hadoop-cluster verzenden gegevens naar verzamelingsknooppunten , die de gegevens van veel agents verzamelen vóór schrijven naar HDFS, waar het kan worden geanalyseerd met andere Hadoop-tools.
Agents kunnen aan elkaar worden gekoppeld, zodat de sink van de ene agent gegevens naar de bron verzendt van een andere agent.Avro, het externe call-en-serialisatiekader van Apache, is de gebruikelijke manier om gegevens over een netwerk met Flume te verzenden, omdat het als een nuttig hulpmiddel dient voor efficiënte serialisatie of transformatie van gegevens in een compact binair formaat.
In de context van Flume is compatibiliteit belangrijk: een Avro-gebeurtenis vereist bijvoorbeeld een Avro-bron en een gootsteen moet gebeurtenissen leveren die geschikt zijn voor de bestemming.
Wat deze geweldige reeks bronnen, kanalen en putten doet werken, is de Flume-agentconfiguratie, die wordt opgeslagen in een lokaal tekstbestand dat is gestructureerd als een Java-eigenschappenbestand. U kunt meerdere agents in hetzelfde bestand configureren. Bekijk een voorbeeldbestand met de naam flume-agent. conf - het is ingesteld om een agent genaamd shaman te configureren:
# Identificeer de componenten op agent sjamaan: sjamaan. bronnen = netcat_s1 sjamaan. putten = hdfs_w1 sjamaan. channels = in-mem_c1 # Configureer de bron: sjamaan. bronnen. netcat_s1. type = netcat sjamaan. bronnen. netcat_s1. bind = localhost sjamaan. bronnen. netcat_s1. poort = 44444 # Beschrijf de gootsteen: sjamaan. wastafels. hdfs_w1. type = hdfs sjamaan. wastafels. hdfs_w1. HDFS. pad = hdfs: // sjamaan. wastafels. hdfs_w1. HDFS. writeFormat = Tekst sjamaan. wastafels. hdfs_w1. HDFS. fileType = DataStream # Configureer een kanaal dat gebeurtenissen in het geheugen buffert: sjamaan. kanalen. in-mem_c1. type = geheugen sjamaan. kanalen. in-mem_c1. capaciteit = 20000 sjamaan. kanalen. in-mem_c1. transactionCapacity = 100 # Bind de bron en zink naar het kanaal: sjamaan. bronnen. netcat_s1. channels = in-mem_c1 sjamaan. wastafels. hdfs_w1. channels = in-mem_c1
Het configuratiebestand bevat eigenschappen voor elke bron, kanaal en sink in de agent en geeft aan hoe ze zijn verbonden. In dit voorbeeld heeft agent-sjamaan een bron die luistert naar gegevens (berichten naar netcat) op poort 44444, een kanaal dat gebeurtenisgegevens in het geheugen buffert, en een gootsteen die gebeurtenisgegevens bij de console registreert.
Dit configuratiebestand zou kunnen zijn gebruikt om meerdere agents te definiëren; hier configureert u er maar één om de dingen eenvoudig te houden.
Om de agent te starten, gebruikt u een shellscript met de naam flume-ng, dat zich in de bin-map van de gootverdeling bevindt. Geef de opdracht agent uit vanaf de opdrachtregel door het pad naar het configuratiebestand en de naam van de agent op te geven.
De volgende voorbeeldopdracht start de Flume-agent:
flume-ng agent -f / -n shaman
Het logboek van de Flume-agent moet beschikken over vermeldingen die controleren of de bron, het kanaal en de sink met succes zijn gestart.
Om de configuratie verder te testen, kunt u telnet naar poort 44444 van een andere terminal gaan en Flume een gebeurtenis sturen door een willekeurige tekstreeks in te voeren. Als alles goed gaat, zal de originele Flume-terminal de gebeurtenis uitvoeren in een logbericht dat u in het logboek van de agent moet kunnen zien.