Flume原理详解

Flume处在大数据框架中的数据传输层,主要解决数据从其他服务器传输到大数据集群的问题

一、Flume概述

1.1 Flume定义

  FlumeCloudera提供的一个高可用、高可靠、分布式的海量日志采集、聚合和传输的系统。Flume基于流式框架,灵活简单。目前移交给Apache维护——Flume官网。
Flume原理详解_第1张图片
  官网明确说了Flume的工作对象是log data,所有不能传输视频、图片等二进制文件。Flume在生产环境中的数据更多来源于java后台日志数据或者爬虫数据,它们大多是在本地文件系统且一般是动态添加实时增加,为了解决日志文件的保存,在没有Flume时可以等一天时间结束通过定时任务将日志文件-puthdfs也是可以的,但是hdfs缺乏实时性,日志文件所包含的信息价值已经失效了。因此Flume可以将后台日志文件实时传输到hdfs,且Flume不仅可以实时传输服务器本地磁盘文件夹还可以传输网络端口传输来的数据。Flume原理详解_第2张图片
Flume最主要的作用就是实时读取服务器本地磁盘的数据,将数据写到HDFS

1.2 Flume基本架构

来自官网的基本架构
Flume原理详解_第3张图片

  首先看到的是Agent,它是一个JVM进程,在这个进程中有三大组件:SourceChannelSink。第一个叫Source源头,接入的是Web Server可以做一些轻量的数据处理,可以说它就是和外界打交道用来读取数据的地方,读取的数据将传到Channel管道,起到一定的缓冲作用减少各组件的压力。最终传输到Sink它本身是一个城槽,它是将数据写出去的组件,这些原理在Flume图标体现的淋漓尽致。

1.2.1 Agent

  Agent 是一个JVM 进程,它以事件的形式将数据从源头送至目的。
  Agent主要有 3 个部分组成,SourceChannelSink

1.2.2 Source

  Source 是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种
格式的日志数据,包括 avrothriftexecjmsspooling directorynetcatsequence
generatorsysloghttplegacy。这些组件太多可以参考一下官方文档

1.2.3 Sink

  Sink 不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储
或索引系统、或者被发送到另一个 Flume Agent。
  Sink组件目的地包括 hdfsloggeravrothriftipcfileHBasesolr自定 义

1.2.4 Channel

  Channel 是位于SourceSink之间的缓冲区。因此,Channel 允许 SourceSink
作在不同的速率上。Channel是线程安全的,可以同时处理几个Source 的写入操作和几个
Sink 的读取操作。
  Flume自带两种 ChannelMemory ChannelFile Channel以及Kafka Channel
  Memory Channel是内存中的队列。Memory Channel在不需要关心数据丢失的情景下适
用。如果需要关心数据丢失,那么Memory Channel 就不应该使用,因为程序死亡、机器宕
机或者重启都会导致数据丢失。
  File Channel 将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数
据。

1.2.5 Event

  传输单元,Flume数据传输的基本单元,以Event的形式将数据从源头送至目的地。
EventHeaderBody两部分组成,Header用来存放该event的一些属性,为K-V 结构,
Body 用来存放该条数据,形式为字节数组。
Flume原理详解_第4张图片

二、Flume快速入门

2.1 Flume安装部署

解压

tar -zxvf apache-flume-1.9.0-bin.tar.gz

配置flume-env.sh文件

cd flume-1.9.0/conf/
mv flume-env.sh.template flume-env.sh
vim flume-env.sh

写死JAVA_HOME路径
Flume原理详解_第5张图片

2.2 框架介绍

  当有具体的任务从哪里读最终写到哪里,只需要修改配置文件后启动Agent即可,Flume是一个分布式的框架,但是并不用向HDFS那样分发脚本配置文件等,那么它的分布式怎么来的?从前面看到avor sourceavor sink组件,这两个组件可以串行使用avor sink把数据写到avor source并且传输到avor sink,即将Flume安装到多台服务器从而形成了分布式,而不是在搭建的时候就是分布式。不需要启什么进程,当具体的任务来了我们再开启具体的任务就OK了。

2.3 Flume入门案例

2.3.1 监控端口数据官方案例

1)案例需求

  使用Flume监听一个端口,收集该端口数据,并打印到控制台。

2)案例分析

  下面开始选取SourceSink该用什么组件,首先监听的是端口可以选用netcat,打印到控制台则选用logger,中间的Channel选取内存型或者磁盘型的都可以。Flume原理详解_第6张图片
通过netcat工具向本机4444端口发送数据,通过Flume监控4444端口

3)nc测试

master开启本地4444端口服务

[root@master job]# nc -l 4444

解释:

  • ncnetcat
  • -lk永久监听 -l临时监听
  • 4444端口号

相当于开启了一个服务,需要首先开启服务,否在其他节点监听该端口时会拒绝连接
slave01开启监听,即启动客户端

[root@slave01 ~]# nc master 4444

这样两个节点都会阻塞,这样就能在实现监听效果
Flume原理详解_第7张图片

4)Flume实现

这个案例来自Flume官方案例,根据官方提供的配置文件结合案例需求如下

# 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 = master
a1.sources.r1.port = 4444

# 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

Flume的使用无非就是选取合适的Agent的三大组件,通过配置文件选取合适的组件,如上面的配置文件分为五部分

第一部分:Name the components on this agent

给这个Agent取名为a1主要区分同一个节点开启多个Flume情况,分别给source取名为r1channels取名为c1sink取名为k1,注意配置文件的单复数,可以得出三个组件都是可以选取多个。

第二部分 Describe/configure the source

source选取netcat组件,监听master:4444

第三部分 Describe the sink

sink选取logger组件

第四部分 Use a channel which buffers events in memory

channel选取内存性,设置缓存大小为1000事件(Event),一次传输100个事务,配置是要注意transactionCapacity要小于capacity

第五部分 Bind the source and sink to the channel

sourcesinkchannel进行绑定,注意配置文件中单词的单复数,注意一个sink只能绑定一个channel,如下图:Flume原理详解_第8张图片
Flume工程目录下新建job文件夹,将上述配置文件命名为netcat_flume_logger.conf放入其中统一管理,根据官方给出的命令

$ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console

结合实际情况启动本次任务

flume-ng agent --conf /usr/local/soft/flume-1.9.0/conf/ --conf-file /usr/local/soft/flume-1.9.0/job/netcat-flume-logger.conf --name a1 -Dflume.root.logger=INFO,console

结果如下
Flume原理详解_第9张图片
启动成功开始测试,向master:4444发送数据
Flume原理详解_第10张图片

2.3.2 实时监控单个追加文件

1)案例需求

实时监测Hadoop日志文件hadoop-root-namenode-master.log,并上传至HDFS

2)案例分析

Flume原理详解_第11张图片

3)控制台测试

在写入hdfs之前先打印到控制台上用于测试,参照2.3.1的配置文件修改。在Linux中监测文件的追入需要使用tail -f/F命令,参考官方文档得知需要使用Exec Source组件,官方给出的配置文件如下
Flume原理详解_第12张图片
黑色加粗为必配选项级连接到channel选择typeexeccommand为需要执行的Linux命令,通过该命令返回的数据作为数据源,因此结合案例在job文件夹下新建配置文件file_flume_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 = exec
a1.sources.r1.command = tail -F /usr/local/soft/hadoop-2.7.2/logs/hadoop-root-namenode-master.log

# 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

启动flume任务

flume-ng agent --conf /usr/local/soft/flume-1.9.0/conf/ --conf-file /usr/local/soft/flume-1.9.0/job/file-flume-logger.conf --name a1 -Dflume.root.logger=INFO,console

首先会读取hadoop-root-namenode-master.log最后十行数据再开启监测
Flume原理详解_第13张图片
启动hdfs观察窗口变化情况

start-dfs.sh

Flume原理详解_第14张图片
由于控制台的输入有限不能完全显示日志的变化情况,但从现象看出文件是可以监测,下面将sinklogger组件替换成可以将其写入hdfs的组件HDFS Sink,从官方给出的文档整理如下

1. 必配选项
Name Default Description
channel
tpye The component type name, needs to be hdfs
hdfs.path HDFS directory path (eg hdfs://namenode/flume/webdata/)
2. 重要参数
Name Default Description
hdfs.filePrefix FlumeData 文件前缀
hdfs.fileSuffix 文件后缀
hdfs.rollInterval 30 30秒滚动一次
hdfs.rollSize 1024 文件达到1024byte滚动一次
hdfs.rollCount 10 十个事件滚动一次
hdfs.round false 下面两个配置参数的开关,文件夹的滚动
hdfs.roundValue 1 根据下面配置时间滚动文件夹
hdfs.roundUnit second 可配置时、分、秒
hdfs.useLocalTimeStamp false 是否使用本地时间
3.参数解释

hdfs.path写入hdfs的路径,一般不会写死,搭配hdfs.round可实现动态创建文件夹方便查看;hdfs.filePrefixhdfs.fileSuffix了解即可使用默认;hdfs.rollInterval默认30秒滚动一次即创建一个文件,生产环境一定要配置为0,不使用这个功能因为很少有公司能达到这个数量级的日志,半分钟达到128M的日志级别,否则会产生很多小文件不利于hdfs管理;hdfs.rollSize按照文件大小进行滚动,结合hdfsblock块大小进行配置,一般略小于块大小最优防止一个事件没有完成文件被hdfs分块了,如block块大小配置为128Mhdfs.rollSize配置为134217000hdfs.rollCount按事件进行滚动,这个配置需要根据具体的事件情况,需要提交估计每次事件的数据量进行配置;hdfs.round滚动文件夹的开关,根据hdfs.roundValuehdfs.roundUnit的数值进行动态创建文件夹,默认一秒钟创建一个文件夹…这个有点不现实,一般是一个小时滚动一次创建一个文件夹,配合动态的hdfs.path可以实现按时间进行归档方便管理。注意:一旦开启按时间进行滚动一定要使用本队时间即将hdfs.useLocalTimeStamp配置为true

4. 配置文件
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /usr/local/soft/hadoop-2.7.2/logs/hadoop-root-namenode-master.log

# Describe the sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://master: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
# 多久生成一个新的文件
a1.sinks.k1.hdfs.rollInterval = 30
# 设置每个文件的滚动大小
a1.sinks.k1.hdfs.rollSize = 134217700
# 文件的滚动与 Event 数量无关
a1.sinks.k1.hdfs.rollCount = 0

# 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

启动Flume任务

flume-ng agent --conf /usr/local/soft/flume-1.9.0/conf/ --conf-file /usr/local/soft/flume-1.9.0/job/file-flume-hdfs.conf --name a1

解释a1.sinks.k1.hdfs.path = hdfs://master:9000/flume/%Y%m%d/%H:动态创建文件夹按照其时间每小时创建一个文件夹方便管理。
  因为Flume需要将数据写进hdfs中,因此需要相关jar包,可以先启动任务让其报错,通过错误信息将对应的jar包放进.../flume/lib中,因hadoop版本而异,我的版本是2.7.2需要的jar包如下:

commons-configuration-1.6.jar
commons-io-2.4.jar
hadoop-auth-2.7.2.jar
hadoop-common-2.7.2.jar
hadoop-hdfs-2.7.2.jar
htrace-core-3.1.0-incubating.jar

再次启动flume任务同时启动hdfs,通过mater:50070观察现象,若没有flume文件,可以在hdfs上敲几个命令让其产生新的日志文件。
Flume原理详解_第15张图片
为了方便测试配置了30秒滚动一次文件,生产环境请设置为0。看一下写进hdfs的日志文件[忽略上面马赛克,听歌才有思路]
Flume原理详解_第16张图片

先发,随后补充

三、Flume进阶

四、企业面试真题

你可能感兴趣的:(笔记)