1.flume介绍
是一个实时收集、聚合,传输海量数据的一个工具。
2.Flume组成架构
Agent
Agent是flume的运行实例,flume的启动进程为Application。
Agent主要有3个部分组成,Source、Channel、Sink。
Source
Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec(execute)、jms、spooling directory、netcat(读取端口数据)、sequence generator、syslog、http、legacy。
Channel
Channel是位于Source和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不同的速率上。Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作。
Flume自带两种Channel:Memory Channel和File Channel。
Memory Channel是内存中的队列。Memory Channel在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。
File Channel将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。
Sink
Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储、或者被发送到另一个Flume Agent。
Sink是完全事务性的。在从Channel批量删除数据之前,每个Sink用Channel启动一个事务。批量事件一旦成功写出到存储系统或下一个Flume Agent,Sink就利用Channel提交事务。事务一旦被提交,该Channel从自己的内部缓冲区删除事件。
Sink组件目的地包括hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定义。
Event
传输单元,Flume数据传输的基本单元,以事件的形式将数据从源头送至目的地。
Event 由Header 和 Body 两部分组成,Header 用来存放该 event 的一些属性,为 K-V 结构,Body 用来存放该条数据,形式为字节数组。
3.Flume安装
1)将apache-flume-1.7.0-bin.tar.gz上传到linux的/opt/software目录下
2)解压apache-flume-1.7.0-bin.tar.gz到/opt/module/目录下
[root@hadoop003 software]$ tar -zxvf apache-flume-1.7.0-bin.tar.gz -C /opt/module/
3)修改apache-flume-1.7.0-bin的名称为flume
[root@hadoop003 module]$ mv apache-flume-1.7.0-bin flume
4) 将flume/conf下的flume-env.sh.template文件修改为flume-env.sh,并配置flume-env.sh文件
[root@hadoop003 conf]$ mv flume-env.sh.template flume-env.sh
[root@hadoop003 conf]$ vim flume-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
4.案例实操
Flume实时读取目录中文件到HDFS案例
上传完成的文件会以.COMPLETED结尾,未上传完成的文件以.tmp结尾
被监控文件夹每500毫秒扫描一次文件变动
被监控的目录下不能有同名文件
flume下创建目录
[root@hadoop003 flume-1.7.0]# mkdir job
创建一个文件
[root@hadoop003 job]$ touch flume-dir-hdfs.conf
打开文件
[root@hadoop003 job]$ vim flume-dir-hdfs.conf
添加内容
a3.sources = r3
a3.sinks = k3
a3.channels = c3
# Describe/configure the source
a3.sources.r3.type = spooldir
a3.sources.r3.spoolDir = /opt/module/flume-1.7.0/upload
a3.sources.r3.fileSuffix = .COMPLETED
a3.sources.r3.fileHeader = true
#忽略所有以.tmp结尾的文件,不上传
a3.sources.r3.ignorePattern = ([^ ]*\.tmp)
# Describe the sink
a3.sinks.k3.type = hdfs
a3.sinks.k3.hdfs.path = hdfs://hadoop003:9000/flume/upload/%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一次,并不是100个event才flush,时间到了也会flush
a3.sinks.k3.hdfs.batchSize = 100
#设置文件类型,可支持压缩,但是DataStream不支持压缩
a3.sinks.k3.hdfs.fileType = DataStream
#多久生成一个新的文件(时间不到就一直是tmp未写完状态)
a3.sinks.k3.hdfs.rollInterval = 30
#设置每个文件的滚动大小微小于128M,这样符合最佳块存储
a3.sinks.k3.hdfs.rollSize = 134217700
#文件的滚动与Event数量无关
a3.sinks.k3.hdfs.rollCount = 0
#访问hdfs的超时时间 默认10 000 毫秒
a3.sinks.k3.hdfs.callTimeout = 1000000
# 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
配置解读
- 要先开启hadoop,因为sink我们要输出到hdfs上,输出路径是自动创建的
- 在/opt/module/flume目录下手动创建upload文件夹,因为我们要监控该文件夹,必须先创建,再开启监控
[root@hadoop003 flume]$ mkdir upload - 启动监控文件夹命令
[root@hadoop003 flume]$ bin/flume-ng agent --conf conf/ --name a3 --conf-file job/flume-dir-hdfs.conf
–conf/-c:表示配置文件存储在 conf/目录
–name/-n:表示给 agent 起名为 a1
–conf-file/-f:flume 本次启动读取的配置文件是在 job 文件夹下的 flume-telnet.conf
文件。
-Dflume.root.logger=INFO,console :-D 表示 flume 运行时动态修改 flume.root.logger
参数属性值,并将控制台日志打印级别设置为 INFO 级别。日志级别包括:debug、info、warn、error。
向upload文件夹中添加文件
[root@hadoop003 upload]$ touch a.txt
查看HDFS上的数据
查看linux上数据
退出监控,ctrl+c
Flume实时读取本地文件新增内容到HDFS案例
实时监控Hive日志,并上传到HDFS中
1.创建flume-file-hdfs.conf文件
[root@hadoop003 job]$ touch flume-file-hdfs.conf
要想读取Linux系统中的文件,就得按照Linux命令的规则执行命令。由于hive日志在Linux系统中所以读取文件的类型选择:exec即execute执行的意思。表示执行Linux命令来读取文件。
[root@hadoop003 job]$ vim flume-file-hdfs.conf
添加配置内容
# 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/logs/hive.log
a2.sources.r2.shell = /bin/bash -c
# Describe the sink
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://hadoop003:9000/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 = 1000
#设置文件类型,可支持压缩
a2.sinks.k2.hdfs.fileType = DataStream
#多久生成一个新的文件
a2.sinks.k2.hdfs.rollInterval = 30
#设置每个文件的滚动大小
a2.sinks.k2.hdfs.rollSize = 134217700
#文件的滚动与Event数量无关
a2.sinks.k2.hdfs.rollCount = 0
#访问hdfs的超时时间 默认10 000 毫秒
a2.sinks.k2.hdfs.callTimeout = 1000000
# 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.执行监控配置
[root@hadoop003 flume]$ bin/flume-ng agent --conf conf/ --name a2 --conf-file job/flume-file-hdfs.conf
启动hadoop
[root@hadoop003 hadoop-2.7.2]$ sbin/start-dfs.sh
[root@hadoop003 hadoop-2.7.2]$ sbin/start-yarn.sh
3.启动hive,就会在hive/logs中生成日志
[root@hadoop003 hive]$ bin/hive
4. 查看hdfs
TaildirSource断点续传
TAILDIR source 可以监控多个文件夹的多个文件,设置filegroups值即可。支持短点续传,再次启动agent时从上次结束的偏移量位置开始读取
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = TAILDIR
a1.sources.r1.filegroups=f1(监控的文件夹)
a1.sources.r1.filegroups.f1=/opt/module/flume-1.7.0/files/.*.txt(.*代表任意)
a1.sources.r1.positionFile=/opt/module/flume-1.7.0/position/position.json(存储数据的偏移量,是断点续传的关键)
# 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