一、Flume的概念
1、flume 作为 cloudera 开发的实时日志收集系统
2、flume一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力 。
3、flume的数据流由事件(Event)贯穿始终。事件是Flume的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些Event由Agent外部的Source生成,当Source捕获事件后会进行特定的格式化,然后Source会把事件推入(单个或多个)Channel中。你可以把Channel看作是一个缓冲区,它将保存事件直到Sink持久化该事件到日志或把事件推向另一个Source。
二、Flume 客户端
Client生产数据,运行在一个独立的线程,如:web服务器,应用系统
三、Flume Event
一个数据单元,消息头和消息体组成。(Events可以是日志记录、 avro 对象等。)
四、Flume Flow
Event从源点到达目的点的迁移的抽象
五、Flume Agent
一个独立的Flume进程,包含组件Source、 Channel、 Sink。(Agent使用JVM 运行Flume。每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks。)
六、Flume Source插件
1、数据收集组件。(source从Client收集数据,传递给Channel)
2、source的exec配置
agent1.sources.exec-source1.channels = ch1
agent1.sources.exec-source1.type = exec
agent1.sources.exec-source1.command=tail -F /usr/local/hadoop/logs/hadoop-root-namenode-node10.log
3、source的spool配置
agent1.sources.spooldir-source1.channels = ch1 ch2
agent1.sources.spooldir-source1.type = spooldir
agent1.sources.spooldir-source1.spoolDir=/usr/local/flume/tmpData
agent1.sources.spooldir-source1.basenameHeader = true
4、source的avro配置
agent1.sources.avro-source1.channels = ch1
agent1.sources.avro-source1.type = avro
agent1.sources.avro-source1.bind = 0.0.0.0
agent1.sources.avro-source1.port = 41414
七、Flume channel插件
1、中转Event的一个临时存储,保存由Source组件传递过来的Event。(Channel连接 sources 和 sinks ,这个有点像一个队列。)
八、Flume 的sink插件
1、从Channel中读取并移除Event, 将Event持久化到外部存储或传递到FlowPipeline中的下一个Agent(如果有的话)(Sink从Channel收集数据,运行在一个独立线程。)
2、sink到log的配置
agent1.sinks.log-sink1.channel = ch1
agent1.sinks.log-sink1.type = logger
3、sink到kafka的配置
#设置Kafka接收器
agent1.sinks.k2.type= org.apache.flume.sink.kafka.KafkaSink
#设置Kafka的broker地址和端口号
agent1.sinks.k2.brokerList=node10:9092,node11:9092,node12:9092
agent1.sinks.k2.metadata.broker.list=node10:9092,node11:9092,node12:9092
agent1.sinks.k2.producer.type=sync
#设置Kafka的Topic
agent1.sinks.k2.kafka.topic=TestTopic2
#设置序列化方式
agent1.sinks.k2.serializer.class=kafka.serializer.StringEncoder
agent1.sinks.k2.channel=ch1
4、sink的avro配置
agent1.sinks.avro-sink1.channel = ch1
agent1.sinks.avro-sink1.type = avro
agent1.sinks.avro-sink1.hostname=node10
agent1.sinks.avro-sink1.port=41414
九、Flume拦截器
1、需要对数据进行过滤时,需要谁有Flume拦截器
2、拦截器的位置在Source和Channel之间,当我们为Source指定拦截器后,我们在拦截器中会得到event,根据需求我们可以对event进行保留还是抛弃,抛弃的数据不会进入Channel中
3、Flume数据流
十、一个source对应多个channel和多个sink的配置
channel的配置
agent1.channels.ch1.type = memory
agent1.channels.ch2.type = memory
source的配置
agent1.sources.spooldir-source1.channels = ch1 ch2
agent1.sources.spooldir-source1.type = spooldir
agent1.sources.spooldir-source1.spoolDir=/usr/local/flume/tmpData
agent1.sources.spooldir-source1.basenameHeader = true
sink的配置
# 激活各个组件,同类型的组件以空格分开
agent1.channels = ch1 ch2
agent1.sources = spooldir-source1
agent1.sinks = hdfs-sink1 k2