1. 简述什么是Flume ?
flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用。Flume 初始的发行版本目前被统称为 Flume OG(original generation),属于 cloudera。
但随着 FLume 功能的扩展,Flume OG 代码工程臃肿、核心组件设计不合理、核心配置不标准等缺点暴露出来,尤其是在 Flume OG 的最后一个发行版本 0.9.4. 中,日志传输不稳定的现象尤为严重,为了解决这些问题,2011 年 10 月 22 号,cloudera 完成了 Flume-728,对 Flume 进行了里程碑式的改动:重构核心组件、核心配置以
及代码架构,重构后的版本统称为 Flume NG(next generation);改动的另一原因是将 Flume 纳入 apache 旗下,cloudera Flume 改名为 Apache Flume。
2. 简述Flume特点 ?
flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;
同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力 。
flume的数据流由事件(Event)贯穿始终。事件是Flume的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些Event由Agent外部的Source生成,当Source捕获事件后会进行特定的格式化,然后Source会把事件推入(单个或多个)Channel中。你可以把Channel看作是一个缓冲区,它将保存事件直到Sink处理完该事件。
Sink负责持久化日志或者把事件推向另一个Source。
1)flume的可靠性
当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume提供了三种级别的可靠性保障,从强到弱依次分别为:end-to-end(收到数据agent首先将
event写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送。),Store on failure(这也是scribe采用的策略,当数据接收方crash时,将
数据写到本地,待恢复后,继续发送),Besteffort(数据发送到接收方后,不会进行确认)。
2)flume的可恢复性
还是靠Channel。推荐使用FileChannel,事件持久化在本地文件系统里(性能较差)。
3. 请解释以下Flume核心概念关键词 ?
- Event
Event 是 Flume NG 数据传输的基本单元。类似于 JMS 和消息系统中的消息。一个 Event 由标题和正文组成:前者是键/值映射,后者是任意字节数组。 - Source
数据收集组件,从外部数据源收集数据,并存储到 Channel 中。 - Channel
Channel 是源和接收器之间的管道,用于临时存储数据。可以是内存或持久化的文件系统:
Memory Channel : 使用内存,优点是速度快,但数据可能会丢失 (如突然宕机);
File Channel : 使用持久化的文件系统,优点是能保证数据不丢失,但是速度慢。 - Sink
Sink 的主要功能从 Channel 中读取 Event,并将其存入外部存储系统或将其转发到下一个 Source,成功后再从 Channel 中移除 Event。 - Agent
是一个独立的 (JVM) 进程,包含 Source、 Channel、 Sink 等组件。
4. 简述Flume架构 ?
外部数据源以特定格式向 Flume 发送 events (事件),当 source 接收到 events 时,它将其存储到一个或多个 channel,channe 会一直保存 events 直到它被 sink 所消费。sink 的主要功能从 channel 中读取 events,并将其存入外部存储系统或转发到下一个 source,成功后再从 channel 中移除 events。
5. 简述 Flume 支持哪几种架构模式 ?
1 multi-agent flow
Flume 支持跨越多个 Agent 的数据传递,这要求前一个 Agent 的 Sink 和下一个 Agent 的 Source 都必须是 Avro 类型,Sink 指向 Source 所在主机名 (或 IP 地址) 和端口(详细配置见下文案例三)。
2 Consolidation
日志收集中常常存在大量的客户端(比如分布式 web 服务),Flume 支持使用多个 Agent 分别收集日志,然后通过一个或者多个 Agent 聚合后再存储到文件系统中。
3 Multiplexing the flow
Flume 支持从一个 Source 向多个 Channel,也就是向多个 Sink 传递事件,这个操作称之为 Fan Out(扇出)。默认情况下 Fan Out 是向所有的 Channel 复制 Event,即所有 Channel 收到的数据都是相同的。同时 Flume 也支持在 Source 上自定义一个复用选择器 (multiplexing selector) 来实现自定义的路由规则。
6. 简述Flume Agent 内部原理 ?
1)ChannelSelector
ChannelSelector 的作用就是选出 Event 将要被发往哪个 Channel。其共有两种类型, 分别是 Replicating(复制)和 Multiplexing(多路复用)。
ReplicatingSelector 会将同一个 Event 发往所有的 Channel,Multiplexing 会根据相 应的原则,将不同的 Event 发往不同的 Channel。
2)SinkProcessor
SinkProcessor 共 有 三 种 类 型 , 分 别 是 DefaultSinkProcessor 、 LoadBalancingSinkProcessor 和 FailoverSinkProcessor
DefaultSinkProcessor 对应的是单个的Sink,LoadBalancingSinkProcessor 和 FailoverSinkProcessor 对应的是 Sink Group,LoadBalancingSinkProcessor 可以实现负载均衡的功能,FailoverSinkProcessor 可以错误恢复的功能。
7. 简述Flume的安装步骤和流程 ?
1 安装和配置环境变量
1.1 准备软件包
将apache-flume-1.8.0-bin.tar.gz 上传到linux系统中的/root/soft/目录中
1.2 解压软件包
[root@qianfeng01 soft]#pwd
/root/soft
[root@qianfeng01 soft]#tar -zxvf apache-flume-1.8.0-bin.tar.gz -C /usr/local/
1.3 更名操作
[root@qianfeng01 soft]#cd /usr/local/
[root@qianfeng01 local]#mv apache-flume-1.8.0-bin/ flume
1.4 配置环境变量
[root@qianfeng01 local]#vi /etc/profile
…省略…
export FLUME_HOME=/usr/local/flume
export PATH= F L U M E H O M E / b i n : FLUME_HOME/bin: FLUMEHOME/bin:PATH
#加载环境变量
[root@qianfeng01 apps]#source /etc/profile
1.5 验证环境变量
[root@qianfeng01 local]#flume-ng version
Flume 1.8.0
Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git
Revision: 99f591994468633fc6f8701c5fc53e0214b6da4f
Compiled by denes on Fri Sep 15 14:58:00 CEST 2017
From source with checksum fbb44c8c8fb63a49be0a59e27316833d
2 配置文件
[root@qianfeng01 local]#cd flume/conf/
[root@qianfeng01 conf]#ll #查看里面是否有一个flume-env.sh.template文件
[root@qianfeng01 conf]#cp flume-env.sh.template flume-env.sh
[root@qianfeng01 conf]#vi flume-env.sh
…省略…
export JAVA_HOME=/usr/local/jdk
…省略…
8. 解释 Flume 中不同的通道类型。哪种通道类型更快?
Flume 内置的三种通道类型如下:
MEMORY Channel –事件从源读取并存储在内存中,然后再发送到接收器。
JDBC 通道 – JDBC 通道在嵌入式 Derby 数据库中记录事件。
FILE Channel –从源读取事件后,FILE Channel 将数据发布到文件系统上的文件。仅当内容成功传送到接收器后,该文件才会被删除。
MEMORY Channel 是三个通道中最快的,但可能会丢失数据。您选择的渠道完全取决于大数据应用的性质和每个事件的重要性。
9. Flume支持的数据源类型有哪些?
Flume支持多种数据源类型,包括Avro、Thrift、HTTP、JMS、Spooling Directory等。可以根据不同的需求选择适合的数据源类型。
10. Flume的事件是什么?
事件是包含字符串属性集合的数据单元。Web 服务器或其他外部源将事件传输到源。在内部,Flume 具有理解源格式的能力。
每个日志文件都被视为一个事件。每个事件包括包含标题信息和给定标题的相应值的标题和值扇区。
11. 简述Flume有几种数据模型 ?
单一数据模型
在单个 Agent 内由单个 Source, Channel, Sink 建立一个单一的数据流模型,如下图所示,整个数据流为 Web Server --> Source --> Channel --> Sink --> HDFS。
多数据流模型
1)**多 Agent 串行传输数据流模型
2)**多 Agent 汇聚数据流模型
3)**单 Agent 多路数据流模型
12. 解释 Flume 中的复制和多路复用选择器、
频道选择器用于同时管理多个频道。根据 Flume 标头值,可以将事件写入单个或多个通道。如果没有为源指定通道选择器,则默认使用复制选择器。使用复制选择器将相同的事件写入源频道列表中的所有频道。当应用程序必须将不同的事件传递到不同的通道时,使用多路复用通道选择
13. Flume如何与HBase一起使用?
Apache Flume 可能连接到两个 HBase 接收器。–
HBаseSink (оrg.арасhe.flume.sink.hbаse.HBаseSink) 支持安全的 HBаse 集群以及在 HBаse 0.96 版本中引入的新型 HBаse IРС。
АsynсHBаseSink (оrg.арасhe.flume.sink.hbаse.АsynсHBаseSink) 比 HBаse sink 具有更好的性能,因为它可以很容易地使非阻塞调用 HBаse。
HBaseSink 的工作 -
Flume 事件被转换为 HBase 增量或放入 HBaseSink。序列化器实现了 HBaseEventSerializer,它在接收器开始运行时被实例化。对于每个事件,sink 调用序列化器中的初始化方法,然后将 Flume Event 转换为 HBase 增量并将其发送到 HBase 集群。
AsyncHBaseSink 的工作 -
AsyncHBaseSink 实现了 AsyncHBaseEventSerializer。接收器在启动时只使用一次初始化函数。接收器调用 setEvent 方法,然后调用 getIncrements 和 getActions 方法,类似于 HBase 接收器。当 sink 停止时,序列化程序调用 cleanUp 函数
14. Flume 的哪两个特点比较突出?
Flume 有效地从多个来源收集、聚合和传输大量日志数据到一个集中的数据存储库。Flume 不仅限于日志数据聚合;它可以传输大量事件数据,包括但不限于网络流量数据、社交媒体生成的数据、电子邮件消息以及几乎任何数据存储
15. 简述有哪些常用的flume sources ?
#Avro source:
avro
#Syslog TCP source:
syslogtcp
#Syslog UDP Source:
syslogudp
#HTTP Source:
http
#Exec source:
exec
#JMS source:
jms
#Thrift source:
thrift
#Spooling directory source:
spooldir
#Kafka source:
org.apache.flume.source.kafka,KafkaSource
…
16. 简述有哪些常用的flume channels ?
#Memory Channel
memory
#JDBC Channel
jdbc
#Kafka Channel
org.apache.flume.channel.kafka.KafkaChannel
#File Channel
file
17. 简述有哪些常用的flume sinks ?
#HDFS Sink
hdfs
#HIVE Sink
hive
#Logger Sink
logger
#Avro Sink
avro
#Kafka Sink
org.apache.flume.sink.kafka.KafkaSink
#Hbase Sink
hbase
18. Flume提供的数据流模型中最重要的几个原则 ?
Source–> Channel
1.单个Source组件可以和多个Channel组合建立数据流,既可以replicating 和 multiplexing。
2.多个Sources可以写入单个 Channel
Channel–>Sink
1.多个Sinks又可以组合成Sinkgroups从Channel中获取数据,既可以loadbalancing和failover机制。
2.多个Sinks也可以从单个Channel中取数据。
3.单个Sink只能从单个Channel中取数据
19. 简述什么是 Flume NG?
用于流式传输 Hadoop 数据的实时数据加载器。信息保存在 HDFS 和 HBase 中。您应该开始使用 Flume NG,它优于原始水槽
20. 解释 Apache Flume 中的可靠性和故障处理?
Flume NG 利用基于通道的事务来确保消息传递的可靠性。当消息从一个代理传递到另一个代理时,会启动两个事务:一个在发送事件的代理上,另一个在接收事件的代理上。为了让发送代理提交其事务,它必须从接收代理接收成功指示。接收代理仅在其事务成功提交时才提供成功指示符。这确保了流在跃点之间确保了传递语义
21. Apache Flume 是否支持第三方插件?
是的,Flume 有 100% 基于插件的架构。它可以从外部源加载数据并将其发送到与 Flume 不同的外部目的地。所以大多数大数据分析都使用这个工具来处理流数据。
22. Flume Configurations有哪些复杂的步骤?
Flume 可以处理流数据。因此,一旦启动,过程就没有结束。代理可以将数据从源异步传输到 HDFS。首先,代理必须了解各种组件如何链接到加载数据。因此,设置用作加载流数据的触发器。要从 Twitter 获取数据,consumerkey、consumersecret、accessToken 和 accessTokenSecret 是必需的参数
23. Flume 是否保证数据流 100% 的可靠性?
是的,它确保了端到端的流量可靠性。默认情况下,Flume 采用事务性数据流策略。通道包含事务存储库内的源和接收器。
24. 大概阐述Flume Put事务流程 ?
事务开始的时候会调用一个doPut方法,doPut方法将一批数据(多个event)batch data 放在putList中,而这批数据“批”的大小取决于配置的 batch size 的参数的值。而putList的大小取决于配置channel的参数transaction capacity的大小,这个参数的大小就体现在putList上了。(tips:channel的另一个参数 capacity 指的是channel的容量)。
现在这批数据顺利的放到putList之后,接下来可以调用 doCommit方法,把putList中所有的event放到channel中,成功放完之后就清空putList。
25. 解释如果事务进行的过程中出问题了怎么解决呢?
第一种问题:数据传输到channel过程出问题
在doCommit提交之后,事务在向channel放的过程中,事务容易出问题。比如:sink那边取数据慢,而source这边放数据速度快,就容易造成channel中的数据的积压,这个时候就会造成putList中的数据放不进去。那现在事务出问题了,如何解决呢?
通过调用doRollback方法,doRollback方法会进行两项操作:1、将putList清空; 2、抛出channelException异常。这个时候source就会捕捉到doRollback抛出的异常,然后source就会把刚才的一批数据重新采集一下(不一定采集得到),采集完之后重新走事务的流程。这就是事务的回滚。
(putList的数据在向channel发送之前先检查一下channel的容量能否放得下,如果放不下,就一个都不放。)
第二种问题:数据采集过程出问题
有这么种场景,source采集数据时候采用的是tailDir source,而我们因为某种原因将监控的目录文件删除,这个时候就会出现问题,同样地,出现问题的解决方式是调用doRollback方法来对事务进行回滚。
26. 阐述Take事务和对应的流程 ?
1 doTake:将数据取到临时缓冲区takeList,并将数据发送到HDFS
2 doCommit:如果数据全部发送成功,则清除临时缓冲区takeList
3 doRollback:数据发送过程中如果出现异常,rollback将临时缓冲区takeList中的数据归还给channel内存队列。
Take事务同样也有takeList,HDFS sink配置也有一个 batch size,这个参数决定sink从channel取数据的时候一次取多少个,所以这batch size 得小于takeList的大小,而takeList的大小取决于transaction capacity的大小,同样是channel 中的参数。
Take事务流程:事务开始后,doTake方法会将channel中的event剪切到takeList中,当然,后面接的是HDFS Sink的话,在把channel中的event剪切到takeList中的同时也往写入HDFS的IO缓冲流中放一份event(数据写入HDFS是先写入IO缓冲流然后flush到HDFS)。
当takeList中存放了batch size 数量的event之后,就会调用doCommit方法,doCommit方法会做两个操作:
1、针对HDFS Sink,手动调用IO流的flush方法,将IO流缓冲区的数据写入到HDFS磁盘中;
2、然后直接清空takeList中的数据。
27. 如何设置Flume内存 ?
开发中在flume-env.sh中设置JVM heap为4G或更高,部署在单独的服务器上(4核8线程16G内存)
—Xmx与—Xms最好设置一致,减少内存抖动带来的性能影响,如果不一致容易导致频繁fullgc。
28. FlumeChannel如何进行优化 ?
通过配置多个dataDirs指向多个路径,每个路径对应不同的硬盘,增大Flume吞吐量
checkpointDir和backupCheckpointDir也尽量配置在不同的硬盘对应的目录中,保证checkpoint坏掉后,可以快速使用backupCheckpointDir恢复数据
29. 简述什么是Flume拓扑?
Flume拓扑是指由多个Flume组件(数据源、通道、汇)连接而成的流数据处理流程。它描述了数据流从源到目标的路径和转换过程。
30. Flume中的通道有哪些类型?
Flume提供了多种通道类型,包括内存通道(Memory Channel)、文件通道(File Channel)、JDBC通道(JDBC Channel)等。可以根据需求选择适合的通道类型
31. Flume的拓扑可以支持哪些类型的数据传输?
Flume的拓扑可以支持一对一(one-to-one)、一对多(one-to-many)和多对一(many-to-one)等类型的数据传输。可以根据需求设置不同的拓扑结构
32. Flume的事件重复问题如何解决?
Flume通过为事件分配全局唯一的ID,并在事件传输过程中对重复事件进行去重,以解决事件重复问题
33. 简述Flume与Logstash的区别 ?
1、功能上的比较
Flume偏重数据传输,几乎没有数据的预处理,仅仅是数据的产生,封装成event然后传输。
Logstash比较偏重于字段的预处理,在异常情况下可能会出现数据丢失,只是在运维日志场景下,一般认为这个可能不重要;
Logstash的input和filter还有output之间都存在buffer,进行缓冲;Flume直接使用channel做持久化
传输方面,flume比logstash多考虑了一些可靠性。因为数据会持久化在channel中(一般有两种可以选择,memoryChannel存在内存中,FileChannel存储在文件中),数据只有存储在下一个存储位置(可能是最终的存储位置,如HDFS;也可能是下一个Flume节点的channel),数据才会从当前的channel中删除。整个过程通过事务控制保证数据的可靠性。
Flume数据只有sink完成后,才会从当前的channel中删除。这个过程是通过事务控制的,这样就保证了数据的可靠性。但是这里也会产生一个问题:内存如果超过一定的量,也会造成数据丢失;如果使用文件存储,性能会变差。
logstash比较注重于字段的预处理,logstash有几十个插件,配置灵活。flume则是强调用户的自定义开发(source和sink的种类不多,功能也比较单一)。
Logstash性能以及资源消耗比较严重,且不支持缓存;
2、操作上的比较
结合实际业务,我简单尝试了一下flume的几种配置:
flume使用avro source 可以实时读到控制台输出的日志,暂未尝试加上拦截器之后读取速度是否会变慢。需要使用Apache下对应的log包以及配置一个log4j.properties文件:
flume使用spool source可以读取.log日志文件,但是被读取过的文件会有complete的标记,并不适用现有的日志滚动生成机制。
flume使用taildir source可以读取指定文件夹下的日志文件,这个是1.8版本中的实验性功能,目前只支持linux系统。
(原因:taildir会生成一个json文件来记录每个日志的消费偏移量,使得宕机后能从偏移量继续消费,解决数据重复发送的问题,但是这个偏移量在windows系统中无法使用)。
flume连接es(sink.type = elasticsearch)报错。目前问题定位在flume1.8版本无法连接到es5.4版本。
(网上给出的解决方案:1、将es版本降低至1.7;2、修改源码)
3、部署的比较
flume与logstash都需要单独安装在服务器上,通过配置文件控制其采集的数据源与数据接收方。
4、现阶段给出的方案
目前logstash存在的问题:
读取速度跟不上日志产生速度时会出现数据丢失问题——已有解决方案
需要单独安装——flume目前的资料来看也是需要单独安装的
若要使用flume需要:
定制source,定义日志过滤的逻辑等,出jar包,放置lib目录下;
修改es sink的源码,使其能够连接成功,出jar包,放置lib目录下;
channel的逻辑是否需要定制、选择内存or文件的持久化方式需结合实际场景。
34. Flume的数据持久化机制是什么?
Flume使用文件通道(File Channel)和内存通道(Memory Channel)作为数据的持久化存储机制。这些通道可以保证在Flume代理崩溃或网络故障的情况下不会丢失数据
35. 简述Flume与Sqoop的区别 ?
Flume和Sqoop是Hadoop数据集成和收集系统,两者的定位不一样。Flume有集群的概念,是一种分布式,可靠且可用的服务,主要用于高效地收集,汇总和移动大量日志数据。而我们的Sqoop是一种用于在Apache Hadoop和结构化数据存储(如关系数据库)之间高效传输批量数据的工具(没有集群的概念)。Sqoop有助于在hadoop和其他数据库之间移动数据,并且可以并行传输数据以提高性能。两者可以做同样的工作,但是各自擅长的领域不同,因此应用场景也不同。
36. 大概阐述一些Flume调优的措施和方案 ?
source :
1 ,增加 source 个数,可以增大 source 读取能力。
2 ,具体做法 : 如果一个目录下生成的文件过多,可以将它拆分成多个目录。每个目录都配置一个 source 。
3 ,增大 batchSize : 可以增大一次性批处理的 event 条数,适当调大这个参数,可以调高 source 搬运数据到 channel 的性能。
channel :
1 ,memory :性能好,但是,如果发生意外,可能丢失数据。
2 ,使用 file channel 时,dataDirs 配置多个不同盘下的目录可以提高性能。
3 ,transactionCapacity 需要大于 source 和 sink 的 batchSize 参数
sink :
增加 sink 个数可以增加消费 event 能力
37. 简述什么是Flume的拦截器 ?
Source将Event写入到Channel之前可以使用拦截器对Event进行各种形式的处理,Source和Channel之间可以有多个拦截器,不同拦截器使用不同的规则处理Event,包括时间、主机、UUID、正则表达式等多种形式的拦截器
1、Flume自带拦截器
Flume有各种自带的拦截器比如:TimestampInterceptor、StaticInterceptor、HostInterceptor、RegexExtractorInterceptor等,通过使用不同的拦截器,实现不同的功能。但是以上的这些拦截器,不能改变原有日志数据的内容或者对日志信息添加一定的处理逻辑。
2、静态拦截器:
如果没有使用静态拦截器
Event: { headers:{} body: 36 Sun Jun 2 18:26 }
使用静态拦截器之后 自己添加kv标识对
Event: { headers:{type=access} body: 36 Sun Jun 2 18:26 }
Event: { headers:{type=nginx} body: 36 Sun Jun 2 18:26 }
Event: { headers:{type=web} body: 36 Sun Jun 2 18:26 }
后续在存放数据的时候可以使用flume的规则语法获取到拦截器添加的kv内容
%{type}
3、自定义ETL拦截器
主要是用来判断json数据是否完整,将Json不完整的数据过滤掉。没有做复杂的清洗操作主要是防止过多的操作降低传输速率。
4、自定义时间戳拦截器
主要是解决零点漂移问题
hdfs sink默认会用linux系统时间,作为输出到HDFS路径的时间。
获取日志产生的实际时间,将时间写入拦截器的header头,header的key必须是timestamp,flume框架会根据key的值识别为时间,写入到HDFS
38. Flume数据怎么采集到 Kafka 实现方式?
步骤一:安装 Flume 和 Kafka
请按照 Flume 安装文档和 Kafka 安装文档中的步骤进行安装。
步骤二:配置 Kafka
在 Kafka 安装目录下的 config 目录中,打开 server.properties 文件,并确保以下属性已经设置:
listeners=PLAINTEXT://localhost:9092
advertised.listeners=PLAINTEXT://localhost:9092
其中,listeners 属性指定了 Kafka 的监听地址和端口号,advertised.listeners 属性指定了 Kafka 的可访问地址和端口号。
步骤三:创建 Kafka 主题
执行以下命令创建一个名为 test 的 Kafka 主题:
$ bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
步骤四:创建 Flume 配置文件
在 Flume 安装目录下的 conf 目录中,创建一个名为 flume-kafka.conf 的配置文件,并将以下内容复制到该文件中:
#Name the components on this agent
agent.sources = r1
agent.sinks = k1
agent.channels = c1
#Describe the source
agent.sources.r1.type = netcat
agent.sources.r1.bind = localhost
agent.sources.r1.port = 44444
#Describe the Kafka sink
agent.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
agent.sinks.k1.kafka.topic = test
agent.sinks.k1.kafka.bootstrap.servers = localhost:9092
agent.sinks.k1.kafka.flumeBatchSize = 20
agent.sinks.k1.kafka.producer.acks = 1
agent.sinks.k1.kafka.producer.linger.ms = 1
#Use a channel which buffers events in memory
agent.channels.c1.type = memory
agent.channels.c1.capacity = 1000
agent.channels.c1.transactionCapacity = 100
#Bind the source and sink to the channel
agent.sources.r1.channels = c1
agent.sinks.k1.channel = c1
在上述配置中,指定了一个名为 r1 的 NetCat Source,它会从本地的 44444 端口上读取数据,并通过一个 Memory Channel 将数据传输到名为 k1 的 Kafka Sink 中。其中,Kafka Sink 的 kafka.topic 参数指定了要发送到的 Kafka 主题名称,kafka.bootstrap.servers 参数指定了 Kafka 的 Broker 地址和端口号,kafka.producer.acks 参数指定了生产者确认级别,kafka.producer.linger.ms 参数指定了生产者发送数据之前等待的时间。
步骤五:启动 Flume
执行以下命令启动 Flume:
$ bin/flume-ng agent --name kafka-agent --conf-file conf/flume-kafka.conf
步骤六:发送数据
在另一个终端窗口中,使用 NetCat 向 Flume 发送数据:
$ echo “Hello, World!” | nc localhost 44444
Flume 将会把接收到的数据发送到 Kafka 中。
步骤七:查看结果
您可以使用 Kafka 命令行工具或 Kafka Web 界面来查看存储在 Kafka 中的数据
39. 综合简述Flume组成、每个组件的常用类型及其特点 ?
一、Source
Taildir Source:断点续传、多目录。Flume1.6以前没有,需要自己自定义Source记录每次读取文件位置,实现断点续传。
Avro Source:Avro端口监听并接收来自外部的Avro客户流的事件。
Exec Source:Exec Source的配置就是设定一个Unix(linux)命令,然后通过这个命令不断输出数据。如果进程退出,Exec Source也一起退出,不会产生进一步的数据。
Spooling Directory Source:Spooling Directory Source监测配置的目录下新增的文件,并将文件中的数据读取出来。
二、Channel
File Channel:数据存储在磁盘,宕机数据可以保存。但是传输速率慢。适合对数据传输可靠性要求高的场景,比如,金融行业。
Memory Channel:数据存储在内存中,宕机数据丢失。传输速率快。适合对数据传输可靠性要求不高的场景,比如,普通的日志数据。
Kafka Channel:减少了Flume的Sink阶段,提高了传输效率。
三、Sink
HDFS Sink:当需要将事件消息写入到Hadoop分布式文件系统(HDFS)时,可以使用HDFS Sink。
Avro Sink:和 Avro Source一起工作,用于构建Flume分层收集数据消息结构。
Kafka Sink:通过该Sink可将事件消息数据发布到Kafka topic 上。其目标是将Flume与Kafka集成,以便基于拉式的处理系统可以处理来自各种Flume Source的数据。 目前支持Kafka 0.9.x以上系列版本。
40. 如何实现Flume数据传输的监控 ?
使用第三方框架Ganglia实时监控Flume
41. Flume采集数据会丢失吗?
生产环境中使用TailDirSource + FileChannel 所有没有出现丢数据的情况。
根据Flume的架构原理,Flume是不可能丢失数据的,其内部有完善的事务机制,Source到Channel是事务性的,Channel到Sink是事务性的,因此这两个环节不会出现数据的丢失。
可能丢失数据的情况是Channel采用memoryChannel,agent宕机导致数据丢失,或者Channel存储数据已满,导致Source不再写入,未写入的数据丢失。
Flume不会丢失数据,但是有可能造成数据的重复,例如数据已经成功由Sink发出,但是没有接收到响应,Sink会再次发送数据,此时可能会导致数据的重复。