03Flume日志采集/构建大数据平台

数据采集是大数据应用的基础,数据源通常包括日志数据(如埋点日志,服务器日志),业务数据库,外部数据(如通过爬虫主动采集的公开数据)等。

本文的主要内容:

  • 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

posted @ 2022-04-25 14:54  萧小满  阅读(210)  评论(0)    收藏  举报