作者:竹叶清2012 | 来源:互联网 | 2023-06-01 16:16
数据采集是大数据应用的基础,数据源通常包括日志数据(如埋点日志,服务器日志),业务数据库,外部数据(如通过爬虫主动采集的公开数据)等。本文的主要内容:Flume简介常见的拓扑结构传
数据采集是大数据应用的基础,数据源通常包括日志数据(如埋点日志,服务器日志),业务数据库,外部数据(如通过爬虫主动采集的公开数据)等。
本文的主要内容:
Flume简介
常见的拓扑结构
传输到HDFS/Kafka
**01 Flume简介
**
Apach Flume(https://flume.apache.org/)是分布式、高可靠、高可用的海量日志采集、聚合、传输系统。Flume能将多种类型的数据源转移到中心化的数据存储,Flume可以用作实时日志的数据采集引擎。
Agent
Agent是Flume最小的运行单元,一个Agent就是一个JVM进程。它包含三个核心组件,分别是Source、 Channel、 Sink。通过这些组件, Event可以从一个地方流向另一个地方,如下图所示:
图片来源于Flume官方
Event
Flume中数据传输的基本单元,由消息头和消息体组成。
Source
Source是数据的收集端,负责将数据封装到Event里,然后推入绑定的Channel中。支持avro,netcat,thrift,exec,spooldir,TAILDIR,syslog等数据源。
Channel
Channel是连接Source和Sink的组件,可以将它看做数据缓冲区(队列)。常用的Channel是MemoryChannel和FileChannel。
Sink
Sink不断地轮询Channel中的事件且批量地移除它们,但在移除之前Sink会确保这些事件成功被写入到存储或索引系统、或者被发送到另一个Flume Agent,支持HDFS,Kafka等
**02 常见的拓扑结构
**
- 每个Agent可以有多个Source、Channel、Sink
.sources =
.sinks =
.channels =
- 利用Channel将Source、Sink进行连接
.sources.<Source1>.channels = <Channel1> <Channel2>
.sinks..channel =
.sinks..channel =
1 串型模式(图片来源于Flume官方)
将多个Agent顺序(avro)串连起来,一般不建议桥接过多的Agent,会影响速度和系统的稳定性。
2 聚合模式(图片来源于Flume官方)
最常见的拓扑结构,WEB应用通常分布在上百个服务器,甚至上千个、上万个服务器。每台服务器部署一个Agent,将日志统一传送到另一个Agent,再由此Agent上传到HDFS或者消息队列中。
3 复制模式(图片来源于Flume官方)
分为replicating和multiplexing,replicating(默认模式)Event将被发往与Source关联的所有Channel中;multiplexing模式下,可以根据头部信息进行路由控制。
**03 传输到HDFS/Kafka
**
采集nginx日志文件(access.log)并上传HDFS和Kafka,Flume Agent组件结构如下图:
nginx-hdfs-kafka.conf
# Agent a1的source,channel,sink组件定义
a1.sources = r1
a1.channels = c1 c2
_a1.sinks = s1 s2
_
_# nginx 日志文件(access.log)数据源
_
a1.sources.r1.type = TAILDIR
_a1.sources.r1.filegroups.f1 = /path/to/nginx/access.log
_
a1.sources.r1.headers.f1.headerKey1 = value1
a1.sources.r1.fileHeader = true
# s1, hdfs
a1.sinks.s1.type = hdfs
a1.sinks.s1.hdfs.path = hdfs://ip:port/nginx/%Y-%m-%d/%H-%M
# s2, kafka
a1.sinks.s2.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.s2.kafka.topic = nginx-log
a1.sinks.s2.kafka.bootstrap.servers = ip:port
# 通过channel 关联source和sink
_a1.sources.r1.channels = c1 c2
_
a1.sinks.s1.channel = c1
a1.sinks.s2.channel = c2
Flume还支持拦截器(Source和Channel之间,对事件进行修改或者过滤),自定义Source,Sink,高可用配置等。更加详细的配置,可参考Flume官方文档:
https://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html