Flume
Flume工具相对来说,比较简单。面试中常问的问题,多为考察Flume的使用,涉及底层原理的考察较少。
1. *Flume组成和事务?
Flume组成为 Source,Channel,Sink,事务包含Put事务,Task事务。
常用的Source,Channel:
- Taildir Source:断点续传,多目录。Flume1.6以前需要自己自定义Source记录每次读取文件位置,实现断点续传。
- File Channel:数据存储在磁盘,宕机数据可以保存。但是传输速率慢。适合对数据传输可靠性要求高的场景,比如,金融行业。
- Memory Channel:数据存储在内存中,宕机数据丢失。传输速率块。适合对数据传输可靠性要求不高的场景,比如,普通的日志数据。
- Kafka Channel:减少了Flume的Sink阶段,提高了传输效率。
Source 到 Channel 是Put事务。
Channel 到 Sink 是Task 事务。
技巧
考察Flume的组件和相关的事务。比较基础的问题。需掌握常用的一些组件。以及在面试中结合自己的项目进行说明。
2. *介绍一下 Memory Channel
读写速度快,但是存储数据量小,Flume进程挂掉,服务器停机或者重启都会导致数据丢失。资源充足,不关心数据丢失的场景下可以用。
技巧
考察具体的Channel的特性,基础问题。重点需回答出有丢失数据风险。
3. *说说 File Channel
将 event写入磁盘文件,与 Memory Channel相比存储容量大,无数据丢失风险。File Channel数据存储路径可以配置多磁盘文件路径,通过磁盘并行写入提高 File Channel 性能。Flume 将 Event 顺序写入到 File Channel文件的末尾。可以在配置文件中通过设置maxFileSize参数配置数据文件大小,当被写入的文件大小达到上限的时候,Flume 会重新创建新的文件存储写入 Event。当一个已经关闭的只读数据文件的 Event 被读取完成,并且Sink已经提交读取完成的事务,则 Flume把存储该数据的文件删除。另外,通过配置dataDirs指向多个路径,每个路径对应不同的硬盘,增大Flume吞吐量。
技巧
考察具体的Channel 的特性,基础问题。重点回答出相对于 Memory Channel,无数据丢失风险。
4. 说说 Kafka Channel
Memory Channel有很大的丢失数据风险,而且容量一般,File channel虽然能缓存更多的消息,但如果缓存下来的消息还没写入Sink,此时Agent出现故障则 File Channel中的消息一样不能被继续使用,直到该Agent恢复。而Kafka Channel容量大,容错能力强。
有了 Kafka Channel可以在日志收集层只配置Source组件和Kafka组件,不需要再配置Sink组件,减少了日志收集层启动的进程数,有效降低服务器内存,磁盘等资源的使用率。
而日志汇聚层,可以只配置Kafka Channel 和 Sink,不需要再配置 Source。
技巧
考察具体的Channel的特性。需要回答出相应的特性,需要能回答出其应用场景。
5. 介绍一下 Flume几种Sink
- HDFS Sink:将Event 写入 HDFS 文件存储,能够有效长期存储大量数据。
- Kafka Sink:Flume 通过 Kafka Sink 将 Event 写入到 Kafka 中的主题,其他应用通过订阅主题消费数据。Kafka.producer.acks 可以设置 Producer 端发送消息到 Broker 之后不需要等待 Broker 返回成功送达的信号。
- 0 表示Producer 发送消息到 Broker 之后不需要等待 Broker 返回成功送达的信号,这种方式吞吐量高,但存在丢失数据的风险。
- 1 表示Broker接收到消息成功写入本地log文件后向Producer返回成功接收的信号,不需要等待所有的Follower全部同步完消息后再做反应,这种方式在数据丢失风险和吞吐量之间做了平衡。
- -1 表示Broker接收到Producer的消息成功写入本地log并且等待所有的Follower成功写入本地log后向Producer返回成功接收的信号,这种方式能够保证消息不丢失,但是性能最差(层层递进)。
技巧
考察Flume的几种Sink,需要能够回答出常用的为HDFS Sink 和 Kafka Sink。
6. *知道 Flume的拦截器吗?
Source 将 Event 写入到 Channel 之前可以使用拦截器对 Event 进行各种形式的处理,Source 和 Channel 之间可以有多个拦截器,不同拦截器使用不同的规则处理Event,包括时间,主机,UUID,正则表达式等多种形式的拦截器。
一般在开发中使用自定义拦截器。
技巧
考察拦截器的使用。需要能够回答出拦截器的作用,可以对数据进行过滤,用于数据清洗。
7. 介绍一下什么是选择器
Source 发送的 Event 通过 Channel 选择器来选择以哪种方式写入到 Channel 中,Flume 提供三种类型 Channel 选择器,分别是复制,复用和自定义选择器。
- 复制选择器:一个Source 以复制的方式将一个 Event同时写入到多个 Channel中,不同的Sink可以从不同的Channel中获取相同的 Event,比如一份日志数据同时写 Kafka 和 HDFS,一个 Event同时写入两个 Channel,然后不同类型的Sink发送到不同的外部存储。
- 复用选择器:需要和拦截器配合使用,根据 Event的头信息中不同键值数据来判断Event应该写入哪个Channel中。
技巧
考察选择器的使用。回答出选择器的应用场景即可。一般在开发中使用的比较多的都是自定义选择器。
8. 了解 Flume 的负载均衡和故障转移吗?
目的是为了提高整个系统的容错能力和稳定性。简单配置就可以轻松实现,首先需要设置 Sink 组,同一个 Sink组内有多个子Sink,不同 Sink 之间可以配置成负载均衡或者故障转移。
技巧
需要能够回答出负载均衡的配置方式。
9. 你是如何实现Flume数据传输的监控的?
使用第三方框架 Ganglia 实时监控Flume。
这种监控方式需要先安装 ganglia ,然后启动 ganglia,然后再启动 Flume 的时候加上监控配置,例如:
其中 -Dflume.monitoring.type=ganglia 表示使用 Ganglia 的方式来监控,而 -Dflume.monitoring.hosts=ip:port 表示 Ganglia安装的ip和启动的端口号。
Flume 监控还可以使用 Zabbix,但是这种方式需要在flume源码中添加监控模块,相对比较麻烦,由于不是 Flume自带的监控方式,这里不讨论这种方式。
因此,Flume自带的监控方式其实就是 http,Ganglia 两种,http监控只能通过一个http地址访问得到一个json格式的监控数据,而ganglia监控是拿到这个数据后用界面的方式展示出来了,相对比较直观。
技巧
能够回答出使用第三方框架Ganglia进行Flume监控即可。