目录
一、什么是Flume?
1.1、flume的定义
1.2、flume的架构
二、Flume入门
2.1、下载flume
2.2、安装flume
2.3、flume小案例
2.3.1、官方案例——监控端口
2.3.2、实时监控单个追加文件
2.3.3、实时监控目录下多个文件
总结
flume官网
Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data. It has a simple and flexible architecture based on streaming data flows. It is robust and fault tolerant with tunable reliability mechanisms and many failover and recovery mechanisms. It uses a simple extensible data model that allows for online analytic application.
简而言之
Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。
Flume的主要作用:
官网示意图
【1】Agent
agent 是一个jvm进程它以事件的形式将数据从源头送至目的。
一个agent主要由三部分组成 (source sink channel)
【2】Source
ource 是负责接收数据到 Flume Agent 的组件。Source 组件可以处理各种类型、各种格式的日志数据,包括 avro、thrift、exec、jms、spooling directory、netcat、taildir、sequence generator、syslog、http、legacy。
【3】Sink
Sink 不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个 Flume Agent。Sink 组件目的地包括 hdfs、logger、avro、thrift、ipc、file、HBase、solr、自定义
【4】Channel
Channel 是位于 Source 和 Sink 之间的缓冲区。因此,Channel 允许 Source 和 Sink 运作在不同的速率上。Channel 是线程安全的,可以同时处理几个 Source 的写入操作和几个Sink 的读取操作。
flume自带两种channel:Memory Channel 和 File Channel。
Memory Channel 是内存中的队列。Memory Channel 在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么 Memory Channel 就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。
File Channel 将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。
【5】Event
传输单元,Flume 数据传输的基本单元,以 Event 的形式将数据从源头送至目的地。
Event 由 Header 和 Body 两部分组成,Header 用来存放该 event 的一些属性,为 K-V 结构,Body 用来存放该条数据,形式为字节数组。
Flume 运行的核心是 Agent。Flume以agent为最小的独立运行单位。一个agent就是一个JVM。
(1)Flume 官网地址:Welcome to Apache Flume — Apache Flume
(2)下载地址:Download — Apache Flume
【1】将 apache-flume-1.9.0-bin.tar.gz 上传到 linux 的/opt/software 目录下
【2】解压 apache-flume-1.9.0-bin.tar.gz 到/opt/module/目录下
【3】修改 apache-flume-1.9.0-bin 的名称为 flume-1.9.0
【4】将 lib 文件夹下的 guava-11.0.2.jar 删除以兼容 Hadoop 3.1.3
cd /opt/module/flume-1.9.0/lib
ll | grep guava
rm -rf guava-11.0.2.jar
至此flume就可以正常使用了 运行案例试试
官方案例说明:
使用 Flume 监听一个端口,收集该端口数据,并打印到控制台。
1、环境准备
【1】安装netcat
sudo yum install -y nc
【2】测试nc
nc 可以启动服务端 或者客户端
nc -l localhost 33333 #开启服务端
nc localhost 33333 #客户端访问
【3】在 flume 目录下创建 datas文件夹并进入 datas文件夹
2、编码
【1】在datas目录下创建文件 flume-netcat-logger.conf
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
【2】判断44444端口是否被占用
sudo netstat -nlp | grep 44444
【3】开启flume监控窗口
#第一种写法
bin/flume-ng agent --conf conf/ --name a1 --conf-file datas/flume-netcat-logger.conf
-Dflume.root.logger=INFO,console
#第二种写法
bin/flume-ng agent -c conf/ -n a1 -f datas/flume-netcat-logger.conf -Dflume.root.logger=INFO,console
【4】使用netcat工具向本机的44444端口发送内容
nc localhost 44444
【5】在flume监听页面观察数据接收情况
需求:实时监控hive日志,并上传到HDFS中
实现步骤:
1、现将数据打印到控制台:
【1】Flume 要想将数据输出到 HDFS,依赖 Hadoop 相关 jar 包
检查/etc/profile.d/my_env.sh 文件,确认 Hadoop 和 Java 环境变量配置正确
【2】在datas目录下创建 flume-file-hdfs.conf 文件 并添加如下内容:
#AGent_name
a1.sources = r1
a1.sinks = k1
a1.channels = c1
#Sources
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /opt/module/hive-3.1.2/logs/hive.log
#Channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
#sinks
a1.sinks.k1.type = logger
#组合
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
【3】启动flume监听
bin/flume-ng agent -c conf/ -f datas/flume-exec-logger.conf -n a1 -Dflume.root.logger=INFO,console
【4】手动追加数据到hive.log文件 并查看监控窗口
echo aaa >> hive.log
【5】查看监控窗口
动态添加数据到hive.log
【1】启动hive 先启动hdoop在启动hive
【2】连接hive 观察flume监控变化
beeline -u jdbc:hive2://hadoop02:10000 -n zhou
【3】在hive窗口执行命令
use mydb;
由此可见当我们操作hive的时候 hive.log 就跟更新 由于我们监控了hive.log文件所以当有新数据追加到hive.log的时候 就会监听到 并打印到控制台
2、将数据输出到hdfs
【1】修改配置文件或创建新的配置文件
# Name the components on this agent
a2.sources = r2
a2.sinks = k2
a2.channels = c2
# Describe/configure the source
a2.sources.r2.type = exec
a2.sources.r2.command = tail -F /opt/module/hive-3.1.2/logs/hive.log
# Describe the sink
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://hadoop02:8020/flume/%Y%m%d/%H
#上传文件的前缀
a2.sinks.k2.hdfs.filePrefix = logs-
#是否按照时间滚动文件夹
a2.sinks.k2.hdfs.round = true
#多少时间单位创建一个新的文件夹
a2.sinks.k2.hdfs.roundValue = 1
#重新定义时间单位
a2.sinks.k2.hdfs.roundUnit = hour
#是否使用本地时间戳
a2.sinks.k2.hdfs.useLocalTimeStamp = true
#积攒多少个 Event 才 flush 到 HDFS 一次
a2.sinks.k2.hdfs.batchSize = 100
#设置文件类型,可支持压缩
a2.sinks.k2.hdfs.fileType = DataStream
#多久生成一个新的文件
a2.sinks.k2.hdfs.rollInterval = 60
#设置每个文件的滚动大小
a2.sinks.k2.hdfs.rollSize = 134217700
#文件的滚动与 Event 数量无关
a2.sinks.k2.hdfs.rollCount = 0
# Use a channel which buffers events in memory
a2.channels.c2.type = memory
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 100
# Bind the source and sink to the channel
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2
【2】启动flume 前提HDFS被启动起来
bin/flume-ng agent -c conf/ -f datas/flume-exec-hdfs.conf -n a2
【3】在hdfs上查看
【4】开启hive 自动更新hive.log
Exec source 适用于监控一个实时追加的文件,不能实现断点续传;
Spooldir Source 适合用于同步新文件,但不适合对实时追加日志的文件进行监听并同步
Taildir Source 适合用于监听多个实时追加的文件,并且能够实现断点续传
需求:使用 Flume 监听整个目录的实时追加文件,并上传至 HDFS
实现步骤:
【1】创建被监控目录
我这里监控taildir目录 此目录需要提前创建
mkdir taildir
cd taildir
touch file1.txt
touch file2.txt
【2】创建文件 flume-taildir-hdfs.conf
a3.sources = r3
a3.sinks = k3
a3.channels = c3
# Describe/configure the source
a3.sources.r3.type = TAILDIR
a3.sources.r3.positionFile = /opt/module/flume-1.9.0/datas/position/tail_dir.json
a3.sources.r3.filegroups = f1 f2
a3.sources.r3.filegroups.f1 = /opt/module/flume-1.9.0/datas/taildir/.*file.*
a3.sources.r3.filegroups.f2 = /opt/module/flume-1.9.0/datas/taildir/.*log.*
# Describe the sink
a3.sinks.k3.type = hdfs
a3.sinks.k3.hdfs.path = hdfs://hadoop02:8020/flume/upload2/%Y%m%d/%H
#上传文件的前缀
a3.sinks.k3.hdfs.filePrefix = upload-
#是否按照时间滚动文件夹
a3.sinks.k3.hdfs.round = true
#多少时间单位创建一个新的文件夹
a3.sinks.k3.hdfs.roundValue = 1
#重新定义时间单位
a3.sinks.k3.hdfs.roundUnit = hour
#是否使用本地时间戳
a3.sinks.k3.hdfs.useLocalTimeStamp = true
#积攒多少个 Event 才 flush 到 HDFS 一次
a3.sinks.k3.hdfs.batchSize = 100
#设置文件类型,可支持压缩
a3.sinks.k3.hdfs.fileType = DataStream
#多久生成一个新的文件
a3.sinks.k3.hdfs.rollInterval = 60
#设置每个文件的滚动大小大概是 128M
a3.sinks.k3.hdfs.rollSize = 134217700
#文件的滚动与 Event 数量无关
a3.sinks.k3.hdfs.rollCount = 0
# Use a channel which buffers events in memory
a3.channels.c3.type = memory
a3.channels.c3.capacity = 1000
a3.channels.c3.transactionCapacity = 100
# Bind the source and sink to the channel
a3.sources.r3.channels = c3
a3.sinks.k3.channel = c3
【3】启动flume监控
bin/flume-ng agent -c conf -f datas/flume-taildir-hdfs.conf -n a3
【4】向文件中追加内容
【5】查看hdfs