文章目录
- 零, 官方API
- 一, Source(接收并处理数据)
- 1.1 `exec` 类型的Soruce组件
- 1.2 `netcat`类型的Source组件
- 1.3 `spooldir`类型的Source组件
- 1.4 `taildir`类型的Source组件
- 1.4 `avro`类型的Source组件
- 二, Channel
- 2.1 `memory`类型的Channel组件
- 2.2 `file`类型的Channel组件
- 2.3 `kafka`类型的Channel组件
- 三, Sink
- 3.1 `logger`类型的sink组件
- 3.2 `hdfs`类型的sink组件
- 3.3 `file_roll`类型的sink组件
- 3.4 `avro`类型的Sink和Source组件
零, 官方API
- 本文是对前面所学Flume相关组件的一个总结和回顾, 方便快速记忆Flume各个组件常见类型的写法.
- Flume是大数据中用来采集, 聚合, 传输日志数据的一种工具, Flume进程由一个或多个agent组成, 每个agent中包含了采集数据(Source),聚合数据(Channel)和传输数据(Sink)三个组件.
- Flume的官方API: 点此进入
一, Source(接收并处理数据)
- Source 是负责
接收数据到Flume Agent
的组件, Source组件可以处理各种类型, 各种格式的日志数据
, 包括avro
、thrift、exec
、jms、spooling directory
、netcat
、taildir
、sequence generator、syslog、http、legacy。
1.1 exec 类型的Soruce组件
[exec 组件的用处]
- 利用exec source可以对文件执行监控命令(tail -F)等等, 实时监控和记录某一个文件的数据变化, 但是不能保证数据不丢失.(即Flume不运行,或者Shell命令出错的情况下, 数据将会丢失)
- 官方API:
[典型写法]
# 命名组件
a1.sources = r1
# 配置sources
a1.sources.r1.type = exec
a1.sources.r1.command = #执行的命令. 比如tail -F /文件目录
a1.sources.r1.shell = /bin/bash -c
# 配置channels, sinks
# 绑定channel
a1.sources.r1.channel = c1
- 实例:
1.2 netcat类型的Source组件
[netcat 组件的用处]
- 使用netcat source 组件监听绑定某一主机上的某个端口, 并从中获取这些数据.
- 官方API(NetCat TCP sources):
[典型写法]
前提: 安装netcat
sudo yum install -y nc
配置文件:
#命名组件
a1.sources = r1
#配置sources
a1.sources.r1.type = netcat
a1.sources.r1.bind = #监听的主机名
a1.sources.r1.port = #监听主机的端口
# 配置channels, sinks
# 绑定channel
a1.sources.r1.channel = c1
- 实例:
1.3 spooldir类型的Source组件
[spooling directory 组件的用处]
- spolldir source 主要是
监控单一个目录下产生的新文件, 并把这个文件记录或上传
, 被上传的文件会以.COMPLETED后缀结尾, 后期会忽略带这个后缀的文件即便内容发生改变. - spooldir 对监控的目录,每500ms扫描一次, 遇到重名文件会报错(直接死循环,无法继续使用)
- spooldir 能保证数据不丢失,能实现断点续传, 但延迟较高, 不能实时监控.
- 官方API:
[典型写法]
#命名组件
a1.sources = r1
#配置sources
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = #需要监控的目录(spooldir不监控子目录)
a1.sources.r1.fileSuffix = .COMPLETED#上传完成的文件的后缀
a1.sources.r1.fileHeader = true #
a1.sources.r1.ignorePattern = ([^ ]*\.tmp) #忽略以.tmp结尾的文件, 不上传.
# 配置channels, sinks
#绑定channel
a1.sources.r1.channel = c1
- 实例:
1.4 taildir类型的Source组件
[taildir directory 组件的用处]
- taildir sources 用来
递归的监控指定的多个目录下的所有文件中的实时新增数据
. - 相比于exec sources, taildir能够支持断点续传(会使用一个json文件记录上次监控文件的最后一次新增数据的位置), 进一步说, taildir不会丢失监控数据.
- 相比于spooldir sources, taildir既能够监控多个目录, 还能监控多个目录下的子目录(所谓递归), 又能实时追踪每个老文件的新增数据和产生的全新文件,不像spool dir那样只监控新增的文件
- 官方API:
[典型写法]
#命名组件
a1.sources = r1
#配置sources
a1.sources.r1.type = TAILDIR
a1.sources.r1.filegroups = f1,f2... #监控的文件组(组里面都是设置的目录)
a1.sources.r1.filegroups.f1 = #/目录1/文件
a1.sources.r1.filegroups.f1 = #/目录2/
######## taildir的positionFile文件, 自动创建json文件, 定期记录flume读取文件的位置, 实现断点续传
a1.sources.r1.positionFile = #/目录/tail_dir.json
# 配置channels, sinks
# 绑定channel
a1.sources.r1.channel = c1
- 实例:
2.2.4, 实时追踪目录下的多个文件
1.4 avro类型的Source组件
见最后一节
二, Channel
[Channel 组件的用处]
2.1 memory类型的Channel组件
[memory channel 组件的用处]
- 功能: 见上面.
- 官方API:
[典型写法]
# 命名组件
a1.channel = c1
# 配置Channel
a1.channel.c1.type = memory
a1.channel.c1.capacity = 1000 #channel中存储的最多event数
a1.channel.c1.transactionCapacity = 100 #每一次事务中, channel从sources拉取或被sink请求的event数量
# 配置sourcs, sinks
# 绑定各组件到channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
- 实例: 略
2.2 file类型的Channel组件
2.3 kafka类型的Channel组件
三, Sink
3.1 logger
类型的sink组件
[logger sink 组件的用处]
- Logs event at INFO level. Typically useful for testing/debugging purpose.
- 官方API说明:
[典型写法]
#命名
a1.sinks = k1
#配置sources, channels
#配置sinks
a1.sinks.type = logger
#绑定channel
a1.sinks.k1.channel = c1
3.2 hdfs
类型的sink组件
[hdfs sink 组件的用处]
hdfs sink将event写入 Hadoop 分布式文件系统 (HDFS)。 它目前支持文本和序列文件。 它支持两种文件类型的压缩。 可以根据经过的时间或数据大小或事件数量定期滚动文件(关闭当前文件并创建一个新文件)。 它还按时间戳或事件发生的机器等属性对数据进行存储分区/分区。 HDFS 目录路径可能包含格式化转义序列,这些序列将由 HDFS 接收器替换以生成目录/文件名来存储事件。 使用hdfs sink需要安装 hadoop并且在flume 的lib目录中要包含haoop相关的jar包
,以便 Flume 可以使用 Hadoop jars 与 HDFS 集群通信。 请注意,需要支持 sync() 调用的 Hadoop 版本。
- 官方API:
[典型写法]
- 引入hadoop相关的Jar包 (见下面实例)
- 撰写配置文件
#命名
a1.sinks = k1
#配置 sources 和 channels
#配置hdfs sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://IP:hdfs内部端口(8020)/目录/%Y%m%d/%H
############## hdfs sink的自定义设置
### 上传文件的前缀(hdfs.filePrefix)
a1.sinks.k1.hdfs.filePrefix = log_
### 是否按时间滚动文件夹(hdfs.round)-->每一段时间重新创建文件并写入监控文件的内容
a1.sinks.k1.hdfs.round = true
### 重新定义创建新文件夹的时间间隔
a1.sinks.k1.hdfs.roundUnit = hour
### 多少倍时间间隔单位创造一个新的文件夹
a1.sinks.k1.hdfs.roundValue = 1
### 是否使用本地时间戳(而不是事件头(evemt head)中的时间戳)
a1.sinks.k1.hdfs.useLocalTimeStamp = true
### 积攒多少个event才flush到HDFS一次
a1.sinks.k1.hdfs.batchSize = 100
### 设置文件类型, 可支持压缩, 还可以解决乱码问题
a1.sinks.k1.hdfs.fileType = DataStream
### 多久(秒)滚动生成一个新文件
a1.sinks.k1.hdfs.rollInterVal = 30
### 设置每个文件的滚动大小(何为滚动? 重命名原日志文件进行归档, 并生成新的日志文件用于log写入)
a1.sinks.k1.hdfs.rollSize = 134217700
a1.sinks.k1.hdfs.rollCount = 0
#绑定channels
a1.sinks.k1.channel = c1
- 实例
3.3 file_roll
类型的sink组件
[file_roll sink 组件的用处]
- 把flume处理过的日志数据输出到本地文件系统中.
- 注意:
写入的目标目录一定要存在!
- 官方API说明:
[典型写法]
#命名sink
a1.sinks = k1
#配置sources和channels
#配置sinks
a1.sinks.k1.type =file_roll
a1.sinks.k1.sink.directiory = #输出目录, 注意目录一定要是已经存在的!
#绑定channel
a1.sinks.k1.channel = c1
- 实例:
3.4 avro
类型的Sink和Source组件
[avro sink/avro source组件的用处]
Q: 什么是Avro?
Avro(读音类似于[ævrə])是Hadoop的一个子项目,
由Hadoop的创始人Doug Cutting牵头开发,
Avro是一个数据序列化系统,设计用于支持大批量数据交换的应用。
它的主要特点有:支持二进制序列化方式,可以便捷,快速地处理大量数据;动态语言友好,Avro提供的机制使动态语言可以方便地处理Avro数据。
- Avro 在Flume中主要是用于在两个agent之间传送数据, 具体表现在从前一个agent的avro sink发出数据, 由后一个agent 的avro sources接收数据进行处理,
- 正因为如此, 我们通常把avro source 看作是avro sink 的服务端
- 而且, avro source通常是要比avro sink 先执行, 怕丢数据嘛.
Avro Source 官方API说明:
栗子:
Avro Sink 官方API说明:
栗子:
总结:
[实际栗子]
2.4.1 复制和多路复用(多个agent配合完成)2.4.2 负载均衡/故障转移(多个agent配合完成)