0


大数据面试之flume重点

大数据面试之flume重点(一)
介绍下Flume
可回答:Flume主要是用来做什么的?

问过的一些公司:阿里,作业帮,快手参考答案:
1、什么是Flume
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。2009 年被捐赠了apache软件基金会,为hadoop相关组件之一。尤其近几年随着flume的不断被完善以及升级 版本的逐一推出,特别是flume-ng,同时flume内部的各种组件不断丰富,用户在开发的过程中使用的便 利性得到很大的改善,现已成为apache top项目之一。
Flume可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储 的工具/服务。flume具有高可用,分布式,配置工具,其设计的原理是基于数据流(流式架构,灵活简 单),如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。其结构如下图所 示:
在这里插入图片描述
Flume最主要的作用是实时读取服务器本地磁盘的数据,将数据写入HDFS或Kafka等。
2、Flume文件目录
文件夹 说明
bin 存放了启动脚本
lib 启动所需的所有组件jar包
conf 提供了几个测试配置文件
docs 文档
3、Flume的Agent组件
Flume内部有一个或者多个Agent,然而对于每一个Agent来说,它就是一共独立的守护进程(JVM),它从 客户端哪儿接收收集,或者从其他的 Agent哪儿接收,然后迅速的将获取的数据传给下一个目的节点sink,或者agent。
每个Agent包含了Source、Channel和Sink,具体介绍见下一题Flume架构。
4、Flume优缺点优点

  1. Flume可以将应用产生的数据存储到任何集中存储器中,比如HDFS,HBase。
  2. 当收集数据的速度超过将写入数据的时候,也就是当收集信息遇到峰值时,这时候收集的信息非常 大,甚至超过了系统的写入数据能力,这时候,Flume会在数据生产者和数据收容器间做出调整,保证 其能够在两者之间提供一共平稳的数据。
  3. 提供上下文路由特征。
  4. Flume的管道是基于事务,保证了数据在传送和接收时的一致性。
  5. Flume是可靠的,容错性高的,可升级的,易管理的,并且可定制的。
  6. 实时性,Flume有一个好处可以实时的将分析数据并将数据保存在数据库或者其他系统中。 缺点 Flume的配置很繁琐,source,channel,sink的关系在配置文件里面交织在一起,不便于管理。 5、应用场景
  7. 电子商务网站 比如我们在做一个电子商务网站,然后我们想从消费用户中访问点特定的节点区域来分析消费者的行为 或者购买意图。这样我们就可以更加快速的将他想要的推送到界面上,实现这一点,我们需要将获取到 的她访问的页面以及点击的产品数据等日志数据信息收集并移交给Hadoop平台上去分析,而Flume正是 帮我们做到这一点。
  8. 内容推送 现在流行的内容推送,比如广告定点投放以及新闻私人定制也是基于此。
  9. ETL工具 可以利用插件把关系型数据实时增量的导入到Hdfs外部数据源。 6、Flume插件
  10. Interceptors拦截器 用于source和channel之间,用来更改或者检查Flume的events数据
  11. 管道选择器channels Selectors 在多管道是被用来选择使用那一条管道来传递数据(events)。管道选择器又分为如下两种: 默认管道选择器: 每一个管道传递的都是相同的events 多路复用通道选择器: 依据每一个event的头部header的地址选择管道
  12. sink线程 用于激活被选择的sinks群中特定的sink,用于负载均衡 7、其它类似Flume框架 Facebook的Scribe,还有Apache另一个明星项目chukwa,还有淘宝Time Tunnel。

Flume架构
可回答:1)Flume的source、channel、sink分别有什么类型的?2)Flume收集工具有哪些部分组成。
问过的一些公司:腾讯,字节x2,bigo,阿里社招,快手x2,流利说,转转,猿辅导,宇信科技,创略 科技,多益x3,富途,兴业数金(2021.09)
参考答案:
Flume组成架构如下图所示
在这里插入图片描述

Agent
Agent是一个JVM进程,它以事件的形式将数据从源头送至目的。Agent主要有3个部分组成,Source、Channel、Sink。

Source
Source负责数据的产生或搜集,一般是对接一些RPC的程序或者是其他的flume节点的sink,从数据发生 器接收数据,并将接收的数据以Flume的event格式传递给一个或者多个通道Channel,Flume提供多种数 据接收的方式,包括avro、thrih、exec、jms、spooling directory、netcat、taildir、sequence generator、syslog、http、legacy、自定义。

类型 描述
Avro 监听Avro端口并接收Avro Client的流数据
Thrih 监听Thrih端口并接收Thrih Client的流数据
Exec 基于Unix的command在标准输出上生产数据
JMS 从JMS(Java消息服务)采集数据
Spooling Directory 监听指定目录
Twitter 1% 通过API持续下载Twitter数据(实验阶段)
Kafka 采集Kafka topic中的message
NetCat 监听端口(要求所提供的数据是换行符分隔的文本)
Sequence Generator 序列产生器,连续不断产生event,用于测试
Syslog 采集syslog日志消息,支持单端口TCP、多端口TCP和UDP日志采集
HTTP 接收HTTP POST和GET数据
Stress 用于source压力测试
Legacy 向下兼容,接收低版本Flume的数据
Custom 自定义source的接口
Scribe 从facebook Scribe采集数据

Channel
Channel 是一种短暂的存储容器,负责数据的存储持久化,可以持久化到jdbc、file、memory,将从
source处接收到的event格式的数据缓存起来,直到它们被sinks消费掉。可以把channel看成是一个队
列,队列的优点是先进先出,放好后尾部一个个event出来,Flume比较看重数据的传输,因此几乎没有 数据的解析预处理。仅仅是数据的产生,封装成event然后传输。数据只有存储在下一个存储位置(可 能是最终的存储位置,如HDFS,也可能是下一个Flume节点的channel),数据才会从当前的channel中 删除。这个过程是通过事务来控制的,这样就保证了数据的可靠性。
不过flume的持久化也是有容量限制的,比如内存如果超过一定的量,不够分配,也一样会爆掉。

类型 描述
Memory Event数据存储在内存中
JDBC Event数据存储在持久化存储中,当前Flume Channel内置支持Derby
Kafka Event存储在kafka集群
File Channel Event数据存储在磁盘文件中
Spillable Memory Channel Event数据存储在内存中和磁盘上,当内存队列满了,会持久化到磁盘文件
(当前试验性的,不建议生产环境使用)
Pseudo Transaction Channel
测试用途
Custom Channel 自定义Channel实现
Channel是位于Source和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不同的速率上。Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作。
注意
Memory Channel是内存中的队列。Memory Channel在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。
File Channel将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。

Sink
Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被 发送到另一个Flume Agent。
Sink组件目的地包括hdfs、Kafka、logger、avro、thrih、ipc、file、HBase、solr、自定义。

类型 描述
HDFS 数据写入HDFS
HIVE 数据导入到HIVE中
Logger 数据写入日志文件
Avro 数据被转换成Avro Event,然后发送到配置的RPC端口上
Thrih 数据被转换成Thrih Event,然后发送到配置的RPC端口上
IRC 数据在IRC上进行回放
File Roll 存储数据到本地文件系统
Null 丢弃到所有数据
Hive 数据写入Hive
HBase 数据写入HBase数据库
Morphline Solr 数据发送到Solr搜索服务器(集群)
ElasticSearch 数据发送到Elastic Search搜索服务器(集群)
Kite Dataset 写数据到Kite Dataset,试验性质的
Kafka 数据写到Kafka Topic
Custom 自定义Sink实现

Event
传输单元,Flume数据传输的基本单元,以Event的形式将数据从源头送至目的地。Event由Header和Body两部分组成,Header用来存放该event的一些属性,为K-V结构,Body用来存放该条数据,形式为字 节数组。

Flume有哪些Source
问过的一些公司:兴业数金(2021.09) 参考答案:
Source负责数据的产生或搜集,一般是对接一些RPC的程序或者是其他的flume节点的sink,从数据发生 器接收数据,并将接收的数据以Flume的event格式传递给一个或者多个通道Channel,Flume提供多种数 据接收的方式,包括avro、thrih、exec、jms、spooling directory、netcat、taildir、sequence generator、syslog、http、legacy、自定义。

类型 描述
Avro 监听Avro端口并接收Avro Client的流数据
Thrih 监听Thrih端口并接收Thrih Client的流数据
Exec 基于Unix的command在标准输出上生产数据
JMS 从JMS(Java消息服务)采集数据
Spooling Directory 监听指定目录
Twitter 1% 通过API持续下载Twitter数据(实验阶段)
Kafka 采集Kafka topic中的message
NetCat 监听端口(要求所提供的数据是换行符分隔的文本)
Sequence Generator 序列产生器,连续不断产生event,用于测试
Syslog 采集syslog日志消息,支持单端口TCP、多端口TCP和UDP日志采集
HTTP 接收HTTP POST和GET数据
Stress 用于source压力测试
Legacy 向下兼容,接收低版本Flume的数据
Custom 自定义source的接口
Scribe 从facebook Scribe采集数据

说下Flume事务机制
问过的一些公司:流利说参考答案:
Flume的事务机制(类似数据库的事务机制):Flume使用两个独立的事务分别负责从Soucrce到Channel,以及从Channel到Sink的事件传递。比如spooling directory source 为文件的每一行创建一个事件,一旦事务中所有的事件全部传递到Channel且提交成功,那么Soucrce就将该文件标记为完成。同
理,事务以类似的方式处理从Channel到Sink的传递过程,如果因为某种原因使得事件无法记录,那么事 务将会回滚。且所有的事件都会保持到Channel中,等待重新传递。

介绍下Flume采集数据的原理?底层实现?
问过的一些公司:百度,蘑菇街,大华参考答案:

  1. Flume的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之 前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。
  2. Flume传输的数据的基本单位是Event,如果是文本文件,通常是一行记录,这也是事务的基本单 位。Event从Source流向Channel,再到Sink,Event本身为一个byte数组,并可携带headers信息。Event 代表着一个数据流的最小完整单元,从外部数据源来,向外部的目的地去。 值得注意的是,Flume提供了大量内置的Source、Channel和Sink类型。不同类型的Source,Channel和Sink 可以自由组合。组合方式基于用户设置的配置文件,非常灵活。 比如:Channel可以把事件暂存在内存里,也可以持久化到本地硬盘上。Sink可以把日志写入HDFS, HBase,甚至是另外一个Source等等。Flume支持用户建立多级流, 也就是说,多个agent可以协同工作,并且支持Fan-in、Fan-out、Contextual Routing、Backup Routes, 这也正是Flume强大之处。如下图所示:在这里插入图片描述 Flume如何保证数据的可靠性 可回答:1)Flume的数据传输如何保证有消息(不漏传或者重复传);2)Flume使用的是什么 channel,如何去保证可靠性 问过的一些公司:大华,多益,陌陌(2021.07) 参考答案: 1、事务 Flume使用两个独立的事务分别负责从soucrce到channel,以及从channel到sink的事件传递。一旦事务中 所有的事件全部传递到channel且提交成功,那么source就将该文件标记为完成。同理,事务以类似的方 式处理从channel到sink的传递过程,如果因为某种原因使得事件无法记录,那么事务将会回滚。且所有 的事件都会保持到channel中,等待重新传递。 Flume的事务机制,总的来说,保证了source产生的每个事件都会传送到sink中。这样就造成每个source 产生的事件至少到达sink一次,换句话说就是同一事件有可能重复到达。 2、Channel配置 Flume中提供的Channel实现主要有三个: Memory Channel:event保存在Java Heap中。如果允许数据小量丢失,推荐使用。(宕机可能丢失数据) File Channel:event保存在本地文件中,可靠性高,但吞吐量低于Memory Channel JDBC Channel:event保存在关系数据中,一般不推荐使用

Flume传输数据时如何保证数据一致性(可靠性)
问过的一些公司:富途参考答案:
1、Flume的事务机制
Flume使用两个独立的事务分别负责从soucrce到channel,以及从channel到sink的事件传递。
比如:spooling directory source 为文件的每一行创建一个事件,一旦事务中所有的事件全部传递到channel且提交成功,那么source就将该文件标记为完成。同理,事务以类似的方式处理从channel到sink 的传递过程,如果因为某种原因使得事件无法记录,那么事务将会回滚。且所有的事件都会保持到channel中,等待重新传递。

example.conf: A single-node Flume configuration

Name the components on this agent a1.sources = r1

a1.channels = c1 a1.sinks = k1

Describe/configure the source a1.sources.r1.type = spooldir

a1.sources.r1.spoolDir = /home/ghb/HadoopCluster/Call a1.sources.r1.fileHeader = true a1.sources.r1.fileSuffix = .delete a1.sources.r1.batchSize = 100

Use file channel a1.channels.c1.type = file

a1.channels.c1.checkpointDir=/home/ghb/HadoopCluster/flume-1.6.0/checkpoint a1.channels.c1.dataDirs=/home/ghb/HadoopCluster/flume-1.6.0/dataDir

Describe the sink

a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink a1.sinks.k1.kafka.topic = CallLog a1.sinks.k1.kafka.bootstrap.servers =127.0.0.1:6667
a1.sinks.k1.kafka.flumeBatchSize = 20
a1.sinks.k1.kafka.producer.acks=1
2、Flume的At-Least-Once提交方式
Flume的事务机制,总的来说,保证了source产生的每个事件都会传送到sink中。但是值得一说的是,实 际上Flume作为高容量并行采集系统采用的是At-least-once(传统的企业系统采用的是exactly-once机
制)提交方式,这样就造成每个source产生的事件至少到达sink一次,换句话说就是同一事件有可能重 复到达。这样虽然看上去是一个缺陷,但是相比为了保证Flume能够可靠地将事件从source,channel传递 到sink,这也是一个可以接受的权衡。如spooldir的使用,Flume会对已经处理完的数据进行标记。
3、Flume的批处理机制
为了提高效率,Flume尽可能的以事务为单位来处理事件,而不是逐一基于事件进行处理。比如上篇博 客提到的spooling directory source以100行文本作为一个批次来读取(BatchSize属性来配置,类似数据库的批处理模式)。批处理的设置尤其有利于提高file channle的效率,这样整个事务只需要写入一次本地磁盘,或者调用一次fsync,速度回快很多。
4、Channel配置说明
MemoryChannel可以实现高速的吞吐, 但是无法保证数据完整性。
MemoryRecoverChannel在官方文档的建议上已经建义使用FileChannel来替换。FileChannel保证数据的完整性与一致性。在具体配置不现的FileChannel时,建议FileChannel设置的目录和程序日志文

件保存的目录设成不同的磁盘,以便提高效率。
Flume拦截器
问过的一些公司:转转,阿里参考答案:
1、Flume拦截器介绍
拦截器是简单的插件式组件,设置在source和channel之间。source接收到的事件event,在写入channel 之前,拦截器都可以进行转换或者删除这些事件。每个拦截器只处理同一个source接收到的事件。可以 自定义拦截器。
2、Flume内置的拦截器1)时间拦截器
flume中一个最经常使用的拦截器 ,该拦截器的作用是将时间戳插入到flume的事件报头中。如果不使用任何拦截器,flume接受到的只有message。
时间戳拦截器的配置:

参数 默认值 描述
type
timestamp 类型名称timestamp,也可以使用类名的全路径
org.apache.flume.interceptor.TimestampInterceptor$Builder
preserveExisting
false 如果设置为true,若事件中报头已经存在,不会替换时间戳报头的 值
source连接到时间拦截器的配置:

  1. a1.sources.r1.interceptors=i1
  2. a1.sources.r1.interceptors.i1.type=timestamp
  3. a1.sources.r1.interceptors.i1.preserveExisting=false 69 主机拦截器 主机拦截器插入服务器的ip地址或者主机名,agent将这些内容插入到事件的报头中。事件报头中的key 使用hostHeader配置,默认是host。 主机拦截器的配置: 参数 默认值 描述 type host 类型名称host,也可以使用类名的全路径 org.apache.flume.interceptor.HostInterceptor$Builder hostHeader host 事件头的key useIP true 如果设置为false,host键插入主机名 preserveExisting false 如果设置为true,若事件中报头已经存在,不会替换时间戳报头的值

source连接到主机拦截器的配置:

  1. a1.sources.r1.interceptors=i2
  2. a1.sources.r1.interceptors.i2.type=host
  3. a1.sources.r1.interceptors.i2.useIP=false
  4. a1.sources.r1.interceptors.i2.preserveExisting=false 70 静态拦截器 静态拦截器的作用是将k/v插入到事件的报头中。配置如下: 参数 默认值 描述 type static 类型名称static,也可以使用类全路径名称 org.apache.flume.interceptor.StaticInterceptor$Builder key key 事件头的key value value key对应的value值 preserveExisting true 如果设置为true,若事件中报头已经存在该key,不会替换value的值 source连接到静态拦截器的配置:
  5. a1.sources.r1.interceptors= i3
  6. a1.sources.r1.interceptors.static.type=static
  7. a1.sources.r1.interceptors.static.key=logs a1.sources.r1.interceptors.static.value=logFlume
  8. a1.sources.r1.interceptors.static.preserveExisting=false
  9. a1.sources.r1.interceptors= i3
  10. a1.sources.r1.interceptors.static.type=static
  11. a1.sources.r1.interceptors.static.key=logs
  12. a1.sources.r1.interceptors.static.value=logFlume
  13. a1.sources.r1.interceptors.static.preserveExisting=false 71 正则拦截器 在日志采集的时候,可能有一些数据是我们不需要的,这样添加过滤拦截器,可以过滤掉不需要的日 志,也可以根据需要收集满足正则条件的日志。 配置如下:

参数 默认值 描述

type
REGEX_FILTER 类型名称REGEX_FILTER,也可以使用类全路径名称
org.apache.flume.interceptor.RegexFilteringInterceptor$Builder
regex .* 匹配除“\n”之外的任何个字符
excludeEvents
false 默认收集匹配到的事件。如果为true,则会删除匹配到的event,收集未匹配到的
source连接到正则过滤拦截器的配置:

  1. a1.sources.r1.interceptors=i4
  2. a1.sources.r1.interceptors.i4.type=REGEX_FILTER a1.sources.r1.interceptors.i4.regex=(rm)|(kill) a1.sources.r1.interceptors.i4.excludeEvents=false

如何监控消费型Flume的消费情况
问过的一些公司:招银网络参考答案:
使用第三方框架Ganglia实时监控Flume

Kafka和Flume是如何对接的?
问过的一些公司:招银网络参考答案:
我们都知道flume可以跨节点进行数据的传输,那么flume与spark streaming对接不好吗?主要是flume对接到kafka的topic,可以给多个consumer group去生成多条业务线。虽然flume中的channel selector中的副本策略也可以给多个sink传输数据,但是每个channel selector都是很消耗资源的。其次,kafka也可以起到一个消峰的作用。
flume可以通过配置kafka sink与kafka进行对接。

标签: 大数据 面试 flume

本文转载自: https://blog.csdn.net/m0_46914845/article/details/127160383
版权归原作者 大数据小理 所有, 如有侵权,请联系我们删除。

“大数据面试之flume重点”的评论:

还没有评论