我会不间断的更新,维护,希望可以对正在找大数据工作的朋友们有所帮助.
第十章目录
第十章 Flume
一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统
10.1 Flume结构
10.1.1 Source
默认的有Avro(监视端口)、Thrift、Exec(执行linux命令)、JMS、Spooling Directory(监视目录)、TailDirSource(1.7新增类似tail功能,支持断点续传),第三方插件有kafka
10.1.2 拦截器
所有events,增加头,类似json格式里的"headers":{" key":" value"}时间戳(头部插入时间戳)、主机(头部插入主机名和IP)、静态(头部插入指定KV)、正则过滤(留下符合条件的)、自定义
10.1.3 Channel
Memory、JDBC、Kafka、File、Custom
10.1.4 拦截器
10.1.5 Sink
HDFS、Hive、Logger、Avro、File Roll Sink(本地文件存储)、HBase、ElasticSearch、Kafka、Null
10.2 Flume 高可用
10.2.1 负载均衡
flume NG通过设置sinkgroups将多个沉潜节点分到一组中,然后设置该组启用负载均衡,沉潜时会自动轮流选择节点,如果节点宕机则选择其它节点。
10.2.2 事务机制
flume基于事务传输event(批量传输),使用两个独立的事务分别处理source到channel和channel到sink,失败时会将所有数据都回滚到source或channel进行重试。
该事务机制遵循'最少一次'语义,因此数据绝不会丢失,但有可能重复。source-channel之间的重复可以靠TailDirSource自带的断点续传功能解决;channel-sink之间的重复,可以延长等待时间,或者设置UUID拦截器,然后在redis里维护一个布隆表来使下游实时应用去重。
10.3 Flume 应用
配置多个sink
#配置源->两个通道
myagent.sources = r1
myagent.sources.r1.channels = c1 c2
#分别配置c1->k1;c2->k2
myagent.sinks = k1 k2
myagent.channels = c1 c2
myagent.sinks.k1.channel = c1
myagent.sinks.k2.channel = c2
同理也可以配置多个source
10.4 其他
10.4.1 知道 Flume 的 Channel 是啥吗
Channel 被设计为 Event 中转临时缓冲区,存储 Source 收集并且没有被 Sink 读取的 Event,为平衡 Source 收集和 Sink 读取的速度,可视为 Flume 内部的消息队列。
Channel 线程安全并且具有事务性,支持 Source 写失败写,和 Sink 读失败重复读的操作。常见的类型包括 Memory Channel,File Channel,Kafka Channel。
10.4.2 介绍一下 Memory Channel
读写速度快,但是存储数据量小,Flume 进程挂掉、服务器停机或者重启都会导致数据丢失。资源充足、不关心数据丢失的场景下可以用。
10.4.3 说说 File Channel
将 event 写入磁盘文件,与 Memory Channel 相比存储容量大,无数据丢失风险。File Channel 数据存储路径可以配置多磁盘文件路径,通过磁盘并行写入提高 File Channel 性能。Flume 将 Event 顺序写入到 File Channel 文件的末尾。可以在配置文件中通过设置 maxFileSize 参数配置数据文件大小,当被写入的文件大小达到上限的时候,Flume 会重新创建新的文件存储写入 Event。当一个已经关闭的只读数据文件的 Event 被读取完成,并且 Sink 已经提交读取完成的事务,则 Flume 把存储该数据的文件删除。
10.4.4 说说 Kafka Channel
Memory Channel 有很大的丢数据风险,而且容量一般,File Channel 虽然能缓存更多的消息,但如果缓存下来的消息还没写入 Sink,此时 Agent 出现故障则 File Channel 中的消息一样不能被继续使用,直到该 Agent 恢复。而 Kafka Channel 容量大,容错能力强。
有了 Kafka Channel 可以在日志收集层只配置 Source 组件和 Kafka 组件,不需要再配置 Sink 组件,减少了日志收集层启动的进程数,有效降低服务器内存、磁盘等资源的使用率。而日志汇聚层,可以只配置 Kafka Channel 和 Sink,不需要再配置 Source。
kafka.consumer.auto.offset.reset
,当 Kafka 中没有 Consumer 消费的初始偏移量或者当前偏移量在 Kafka 中不存在(比如数据已经被删除)情况下 Consumer 选择从 Kafka 拉取消息的方式,earliest 表示从最早的偏移量开始拉取,latest 表示从最新的偏移量开始拉取,none 表示如果没有发现该 Consumer 组之前拉取的偏移量则抛出异常。
10.4.5 介绍一下 Kafka 几种 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 返回成功接收的信号,这种方式能够保证消息不丢失,但是性能最差(层层递进)。
10.4.6 知道 Flume 的拦截器吗
Source将Event写入到Channel之前可以使用拦截器对Event进行各种形式的处理,Source和Channel之间可以有多个拦截器,不同拦截器使用不同的规则处理Event,包括时间、主机、UUID、正则表达式等多种形式的拦截器。
10.4.7 介绍一下什么是选择器
Source 发送的 Event 通过 Channel 选择器来选择以哪种方式写入到 Channel 中,Flume 提供三种类型 Channel 选择器,分别是复制、复用和自定义选择器。
- 复制选择器: 一个Source以复制的方式将一个Event同时写入到多个Channel中,不同的 Sink 可以从不同的Channel中获取相同的 Event,比如一份日志数据同时写Kafka和HDFS,一个Event同时写入两个Channel,然后不同类型的Sink发送到不同的外部存储。
- 复用选择器: 需要和拦截器配合使用,根据Event的头信息中不同键值数据来判断 Event 应该写入哪个Channel中。
10.4.8 了解 Flume 的负载均衡和故障转移吗
目的是为了提高整个系统的容错能力和稳定性。简单配置就可以轻松实现,首先需要设置 Sink 组,同一个 Sink 组内有多个子 Sink,不同 Sink 之间可以配置成负载均衡或者故障转移。