Flume

Flume是一个分布式、可靠、高可用的海量日志聚合系统,支持在系统中定制各类数据发送方,用于收集数据;
同时,Flume提供对数据进行简单处理,并写到各种数据接收方。
特性
1、高可靠性。Flume提供了end to end的数据可靠性机制
2、易于扩展。Agent为分布式架构,可水平扩展
3、易于恢复。Channel中保存了与数据源有关的事件,用于失败时的恢复
4、功能丰富。Flume内置了多种组件,包括不同数据源和不同存储方式
CDH 5.x集群自带的Flume版本为1.6.0(6.x自带的版本为1.9.0),
高低版本间的差别为,高版本Source、Channel、Sink支持的类型略多一些,部分Source、Channel、Sink的配置参数有变化。
我们接下去的参数介绍以1.6.0为例进行讲解,该版本文档可见:http://flume.apache.org/releases/content/1.6.0/FlumeUserGuide.html
数据流模型:
事件(event):一个Flume事件代表一个数据流的单元,其拥有一个字节形式的负载,以及一组字符串形式的属性。
代理(agent):一个Flume代理是一个(JVM)进程,其运行着将数据从外部数据源到目标(下一跳)进行传递的所有部件。
Agent的三大部件
Source:数据源,简单的说就是agent获取数据的入口
Channel:管道,数据流通和存储的通道。一个source必须至少和一个channel关联
Sink:用来接收channel传输的数据并将之传送到指定的地方,成功后从channel中删除
Flume中的部件除了Source、Sink、Channel三大类外,还有几类不常用的:
ChannelSelector 用于配置多个channel并从中选择、
SinkProcessor 用于在一组sink中选择或进行负载均衡、
Interceptor 用于不落地的对事件进行修改或丢弃
Spooling Directory Source
这种Source可以监视操作系统下某一目录下的新文件,当有新文件出现时,会读取其中的新文件并将数据送入channel,
一个文件全部处理完后,可对其进行改名或删除操作。使用该Source需注意两种情况:
1、文件写入该目录后又被更改;
2、目录中出现重复的文件名。
这两种情况都会导致Flume出现致命错误并直接自杀,因此需要严格保证不会出现这两种情况。其主要配置如下:
示例:
a1.channels = ch-1
a1.sources = src-1
a1.sources.src-1.type = spooldir
a1.sources.src-1.channels = ch-1
a1.sources.src-1.spoolDir = /var/log/apache/flumeSpool a1.sources.src-1.fileHeader = true
Kafka Source
这种Source是一个Kafka的Consumer。需要注意的是,在我们讲解的版本(1.6.0)中,这个Source还是一个老版本实现,
只支持0.8.x形式的Kafka连接方式,即需要提供ZooKeeper连接串(虽然这种方式在0.9.x后还支持,但已过时了),
另外一次也只能消费一个topic。在Flume1.7.0后,该Source支持了0.9.x后的连接方式(bootstrap servers)和多topic。
其主要配置如下:
示例:
tier1.sources.source1.type = org.apache.flume.source.kafka.KafkaSource tier1.sources.source1.channels = channel1
tier1.sources.source1.zookeeperConnect = localhost:2181
tier1.sources.source1.topic = test1
tier1.sources.source1.groupId = flume
tier1.sources.source1.kafka.consumer.timeout.ms = 100
HDFS Sink
这种Sink将事件写入HDFS。当前版本支持SequenceFile或Stream格式,以及对SequenceFile和CompressedStream格式的压缩。
文件可以根据时间、文件大小、事件条数来滚动。当目录不存在时可以生成,并且目录名中支持转义字符(详见文档)。
其主要配置如下:
示例:
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
Kafka Sink
这种Sink将事件发布到某个Kafka topic。需要注意的是,在我们讲解的版本(1.6.0)中,这个sink只能连接0.8.x的Kafka,
如需要连接0.9.x以后的Kafka,需要换用1.7.0或更高版本的Flume,并且配置的属性也不一样。
其主要配置如下:
示例:
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink a1.sinks.k1.topic = mytopic
a1.sinks.k1.brokerList = localhost:9092
a1.sinks.k1.requiredAcks = 1
a1.sinks.k1.batchSize = 20
a1.sinks.k1.channel = c1
Memory Channel
这种Channel将事件储存在内存的一个队列中,可配置最大大小。其比较适合需要高吞吐量的数据流,但在agent挂掉时会丢失数据。
其主要配置如下:
示例:
a1.channels = c1
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 10000
a1.channels.c1.byteCapacityBufferPercentage = 20 a1.channels.c1.byteCapacity = 800000
File Channel
这种Channel将事件储存在文件中。其比较适合数据不能丢的场合
(如果agent挂掉,数据不会丢,但可能存在已发送数据再次发送的情况,和memory相比,file是at least once,memory是at most once),
且可以存储大量数据,但吞吐量比较低。其主要配置如下:
示例:
a1.channels = c1
a1.channels.c1.type = file
a1.channels.c1.checkpointDir = /mnt/flume/checkpoint a1.channels.c1.dataDirs = /mnt/flume/data
posted @ 2025-06-21 22:03  屠魔的少年  阅读(17)  评论(0)    收藏  举报