谈谈对Flume的理解

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 谈谈对Flume的理解

今天给大家分享一下Flume的面试点,按照这个回答,面试官会吐血,哈哈!

01Flume起源

Flume最早是Cloudera开发的实时日志收集系统,最早的时候Flume的版本称为Flume OG(original generation),随着功能的扩展和代码的重构,随之出现了我们熟知的Flume NG(next generation),后来也捐给了Apache基金会成为了Apache的顶级项目。Apache Flume 是一个分布式、高可靠(事务)、高可用(failover)的用来收集、聚合、转移不同来源的大量日志数据到中央数据仓库的工具。

02Flume架构

Event:Flume定义的一个数据流传输的最小单元,数据被封装到Event中往后传输。Event由Header和Byte Payload组成:

Header:一系列可选的string属性(键值对Map)

Byte Payload:装载数据的字节数组(网络传输都是传输字节)

Agent:Flume最小的独立运行单位,一个Agent就是一个Flume的实例,本质是一个JVM进程,该JVM进程控制Event数据流从外部日志生产者那里传输到目的地(或者是下一个Agent)。同时,一个Agent就对应一个配置文件。

Source:对接输入源,监控外部数据源的数据,传输给Channel。

Source类型:

支持Avro(RPC)协议

监控指定目录内数据变更(上传文件)

监控某个端口,将流经端口的每一个文本行数据作为Event输入

监控消息队列数据Channel:简单理解,就是缓存数据。

Channel类型:

Memory Channel:内存中队列,适用于不需要关心数据丢失的情景

File Channel:将所有Event写到磁盘,在程序关闭或机器宕机的情况下不会丢失数据

Kafka channel :直接使用消息队列作为数据缓存Sink:我们采集数据的目的地,Sink不断地轮询Channel中的Event且批量地移除它们,并将这些Event批量写入到存储系统或者发送到另一个Agent。

Sink类型:

HDFS:数据写入到HDFS

Avro:数据被转换成Avro event,然后发送到配置的RPC端口上(Avro Source)

File Roll:存储数据到本地文件系统

HBase:数据写入HBase数据库

Logger:数据写入到日志文件(往往是写到控制台)

03Flume事务流程

Channel使用被动存储机制,依靠Source完成数据写入(推送)、依靠Sink完成数据读取(拉取)。

Channel是Event队列,先进先出:Source -> EventN,...,Event2,Event1 -> Sink

Sink是完全事务性的。

在从Channel批量删除数据之前,每个Sink用Channel启动一个事务。

批量Event一旦成功写出到存储系统或下一个Agent,Sink就利用Channel提交事务。

事务一旦被提交,该Channel从自己的内部缓冲区删除Event

Flume 推送事务流程

doPut:将批数据先写入临时缓冲区putList,不是来一条Event就处理,是来一批Event才处理

doCommit:检查Channel内存队列空间是否充足,充足则直接写入Channel内存队列,不足则doRollback回滚数据到putList,等待重新传递,回滚数据指的是putList的Event索引回退到之前

Flume拉取事务流程

doTake:先将数据取到临时缓冲区takeList

doCommit:如果数据全部发送成功,则清除临时缓冲区takeList

doRollback:数据发送过程中如果出现异常,将临时缓冲区takeList中的数据doRollback归还给Channel内存队列,等待重新传递

04Flume参数调优

Source

1、增加Source个数,可以增大Source读取数据的能力。例如:当某一个目录产生的文件过多时需要将这个文件目录拆分成多个文件目录,同时配置好多个 Source以保证Source有足够的能力获取到新产生的数据。

2、适当调大batchSize,可以提高Source搬运Event到Channel时的性能。

Channel

1、type选择memory时Channel的性能最好,但是如果Flume进程意外挂掉可能会丢失数据。

2、type选择file时Channel的容错性更好,但是性能上会比memory Channel差。使用file Channel时 dataDirs配置多个不同盘下的目录(注意不是同一个盘不同目录哦)可以提高性能。3、capacity参数决定Channel可容纳最大的Event条数。

Sink

1、增加Sink的个数可以增加Sink消费Event的能力。Sink也不是越多越好够用就行,过多的Sink会占用系统资源,造成系统资源不必要的浪费。

2、适当调大batchSize,可以提高Sink从Channel搬出Event的性能。

05Flume的一个bug插曲

有一次我使用file作为channel重启时候碰见一个错误,长这样:

ERROR org.apache.flume.SinkRunner: Unable to deliver event. Exception follows.

java.lang.IllegalStateException: Channel closed [channel=fileChannel]. Due to java.io.EOFException: null

   at org.apache.flume.channel.file.FileChannel.createTransaction(FileChannel.java:340)

   at org.apache.flume.channel.BasicChannelSemantics.getTransaction(BasicChannelSemantics.java:122)

   at org.apache.flume.sink.hdfs.HDFSEventSink.process(HDFSEventSink.java:368)

   at org.apache.flume.sink.DefaultSinkProcessor.process(DefaultSinkProcessor.java:68)

   at org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:147)

   at java.lang.Thread.run(Thread.java:745)

Caused by: java.io.EOFException

   at java.io.RandomAccessFile.readInt(RandomAccessFile.java:827)

   at java.io.RandomAccessFile.readLong(RandomAccessFile.java:860)

   at org.apache.flume.channel.file.EventQueueBackingStoreFactory.get(EventQueueBackingStoreFactory.java:80)

   at org.apache.flume.channel.file.Log.replay(Log.java:426)

   at org.apache.flume.channel.file.FileChannel.start(FileChannel.java:290)

   at org.apache.flume.lifecycle.LifecycleSupervisor$MonitorRunnable.run(LifecycleSupervisor.java:251)

   at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)

   at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)

   at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)

   at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)

   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

   ... 1 more

后来查到这是Flume的一个bug:

 https://issues.apache.org/jira/browse/FLUME-2282

当时这个业务不是必须保证不丢数据,我就清空了下面两个目录:

/channel/flume/collector/checkpoint

/channel/flume/collector/data

然后重启大法,成功了!


相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
机器学习/深度学习 算法 Python
LightGBM中的特征选择与重要性评估
LightGBM中的特征选择与重要性评估【2月更文挑战第1天】
2538 0
|
自然语言处理 关系型数据库 MySQL
MySQL索引之全文索引(FULLTEXT)
MySQL索引之全文索引(FULLTEXT) MySQL创建全文索引 使用索引时数据库性能优化的必备技能之一。
7729 0
MySQL索引之全文索引(FULLTEXT)
|
机器学习/深度学习 编解码 人工智能
一种基于YOLOv8改进的高精度表面缺陷检测网络, NEU-DET和GC10-DET涨点明显(原创自研)
【7月更文挑战第3天】一种基于YOLOv8改进的高精度表面缺陷检测, 在NEU-DET和GC10-DET任务中涨点明显;
476 1
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
619 3
|
机器学习/深度学习 人工智能 自然语言处理
人工智能在当代社会中的应用与未来发展趋势 摘要:
人工智能(AI)作为一种新兴技术,在当代社会中扮演着越来越重要的角色。本文将探讨人工智能的基本概念、当前在各个领域的应用情况以及未来的发展趋势。首先,我们将介绍人工智能的定义和分类,然后详细讨论人工智能在医疗、金融、制造业、交通、教育等领域的应用案例。接着,我们将分析人工智能发展面临的挑战,包括数据隐私、伦理道德等问题,并探讨如何解决这些问题以推动人工智能的发展。最后,我们将展望人工智能的未来发展趋势,包括深度学习、自然语言处理、机器人技术等方面的进展,以及人工智能对社会和经济的影响。
2040 1
|
JavaScript 前端开发 开发者
使用 Vue.js 和 Vuex 构建响应式前端应用
【10月更文挑战第2天】使用 Vue.js 和 Vuex 构建响应式前端应用
116 1
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
159 9
|
SQL 监控 关系型数据库
MySQL慢查询日志配置指南:发现性能瓶颈,提升数据库效率
MySQL慢查询日志配置指南:发现性能瓶颈,提升数据库效率
1498 0
|
Prometheus Cloud Native 网络安全
Prometheus+Grafana+Alertmanager部署教程(超详细)
Prometheus+Grafana+Alertmanager部署教程(超详细)
1481 1
优化求解器之Pyomo建模工具简介
在使用优化求解器解决实际问题的过程中,通过程序接口输入优化模型往往会耗费大量时间和精力,且容易出错。为了简化这一步骤,建模语言应运而生。建模语言最初的概念是在1976年提出的,后经过不断的发展,形成了如今蓬勃的技术、产品和应用市场。建模语言往往并不对实际问题进行求解,而专注在模型建立本身,其目的是将复杂的优化问题简化为抽象的代数表达形式;让用户在开发上只需要专注于代数模型的建立,模型完成后再将数据分别引入。如此不但加快开发流程,更有效减少模型输入错误的可能性。接下来我们将发布一系列文章,对常见的AMPL, Pyomo, PuLP等建模语言进行简要的介绍。
优化求解器之Pyomo建模工具简介