文章目录
1 概述
1.1 定义
FIume是一个高可用的,高可靠的,分布式的海量日志采集、聚合、传输系统,基于流式架构,灵活简单。
Flume的最主要的作用:实时读取服务器本地磁盘的数据,写入hdfs
1.2 基础架构
Flume主要由3个重要的组件构成:
- Source:完成对日志数据的收集,从数据发生器接收数据,并将接收的数据以Flume的event格式传递给一个或者多个通道channel,Flume提供多种数据接收的方式,比如Avro,Thrift等。
- Channel:channel是一种短暂的存储容器,主要提供一个队列的功能,对source提供中的数据进行简单的缓存。它将从source处接收到的event格式的数据缓存起来,直到它们被sinks消费掉,它在source和sink间起着桥梁的作用,channel是一个完整的事务,这一点保证了数据在收发的时候的一致性。并且它可以和任意数量的source和sink链接。支持的类型有: JDBC channel , File System channel , Memory channel等.。
- Sink:Sink将数据存储到集中存储器比如Hbase和HDFS,从channels消费数据(events)并将其传递给目标地,目标地可能是另一个sink,也可能HDFS,HBase。
2 快速入门
2.1 监控端口数据
需求
监听端口,收集该端口的数据,并打印到控制台
conf
# 声明
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# 描述/配置 source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# 描述 sink
a1.sinks.k1.type = logger
# 定义channel
a1.channels.c1.type = memory
# 容量:1000个event
a1.channels.c1.capacity = 1000
# 传输容量
a1.channels.c1.transactionCapacity = 100
# 绑定
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
启动
bin/flume-ng agent --conf conf --conf-file job/netcat-flume-logger.conf --name a1 -Dflume.root.logger=INFO,console
bin/flume-ng agent -n a1 -c conf -f job/netcat-flume-logger.conf -Dflume.root.logger=INFO,console
2.2 实时监控单个追加文件
需求
实时监控Hive日志,并上传到HDFS
实验步骤
1、配置文件
- 声明
- 组件的赋值
- 绑定
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /tmp/hadoop/hive.log
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://brace:9000/flume/%Y%m%d/%H
# 前缀
a1.sinks.k1.hdfs.filePrefix = logs-
# 是否按照时间滚动文件夹
a1.sinks.k1.hdfs.round = true
# 多少时间单位创建一个新的文件夹
a1.sinks.k1.hdfs.roundValue = 1
# 重新定义时间单位
a1.sinks.k1.hdfs.roundUnit = hour
# 是否使用本地时间戳
a1.sinks.k1.hdfs.useLocalTimeStamp = true
# 积攒多少个Event才flush到HDFS一次
a1.sinks.k1.hdfs.batchSize = 100
# 设置文件类型,可支持压缩
a1.sinks.k1.hdfs.fileType = DataStream
# 多久生成一个新的文件(s)
a1.sinks.k1.hdfs.rollInterval = 30
# 设置每个文件的滚动大小
a1.sinks.k1.hdfs.rollSize = 134217700
# 文件的滚动与event数量无关
a1.sinks.k1.hdfs.rollCount = 0
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
bin/flume-ng agent -n a1 -c conf -f job/file-flume-logger.conf
2.3 实时监控目录下多个新文件
需求
使用Flume监听整个目录的文件,上传至HDFS
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /home/hadoop/upload
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://brace:9000/flume/%Y%m%d/%H
# 前缀
a1.sinks.k1.hdfs.filePrefix = logs-
# 是否按照时间滚动文件夹
a1.sinks.k1.hdfs.round = true
# 多少时间单位创建一个新的文件夹
a1.sinks.k1.hdfs.roundValue = 1
# 重新定义时间单位
a1.sinks.k1.hdfs.roundUnit = hour
# 是否使用本地时间戳
a1.sinks.k1.hdfs.useLocalTimeStamp = true
# 积攒多少个Event才flush到HDFS一次
a1.sinks.k1.hdfs.batchSize = 100
# 设置文件类型,可支持压缩
a1.sinks.k1.hdfs.fileType = DataStream
# 多久生成一个新的文件(s)
a1.sinks.k1.hdfs.rollInterval = 30
# 设置每个文件的滚动大小
a1.sinks.k1.hdfs.rollSize = 134217700
# 文件的滚动与event数量无关
a1.sinks.k1.hdfs.rollCount = 0
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
2.4 实时监控目录下的多个追加文件
需求
使用Flume监听整个项目的实时追加文件,上传到HDFS
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = TAILDIR
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = /home/hadoop/upload/test.txt
a1.sources.r1.positionFile = /home/hadoop/upload/position/position.json
# a1.sources.r1.headers.f1.headerKey1 = value1
a1.sources.r1.fileHeader = true
a1.sources.ri.maxBatchCount = 1000
# 描述 sink
a1.sinks.k1.type = logger
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
3 Flume与Kafka的整合
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = TAILDIR
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = /home/hadoop/upload/test.txt
a1.sources.r1.positionFile = /home/hadoop/upload/position/position.json
# a1.sources.r1.headers.f1.headerKey1 = value1
a1.sources.r1.fileHeader = true
a1.sources.ri.maxBatchCount = 1000
# 描述 sink
#Describe the sink
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
#设置kafka的主题topic
a1.sinks.k1.topic = aaa
#设置消费者编码为UTF-8
a1.sinks.k1.custom.encoding=UTF-8
#绑定kafka主机以及端口号
a1.sinks.k1.kafka.bootstrap.servers = brace:9092
#设置kafka序列化方式
a1.sinks.k1.serializer.class = kafka.serializer.StringEncoder
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1