Flume

一、flume OG和flume NG

Flume作为Hadoop中的日志采集工具,非常的好用,但是在安装Flume的时候,查阅很多资料,发现形形色色,有的说安装Flume很简单,有的说安装Flume很复杂,需要依赖zookeeper,所以一方面说直接安装Flume,解压即可用,还有一方面说需要先装了Zookeeper才可以安装Flume。那么为何会才生这种情况呢?其实两者说的都对,只是Flume的不同版本问题。

背景介绍

Cloudera 开发的分布式日志收集系统 Flume,是 hadoop 周边组件之一。其可以实时的将分布在不同节点、机器上的日志收集到 hdfs 中。Flume 初始的发行版本目前被统称为 Flume OG(original generation),属于 cloudera。但随着 FLume 功能的扩展,Flume OG 代码工程臃肿、核心组件设计不合理、核心配置不标准等缺点暴露出来,尤其是在 Flume OG 的最后一个发行版本 0.94.0 中,日志传输不稳定的现象尤为严重,这点可以在 BigInsights 产品文档的 troubleshooting 板块发现。为了解决这些问题,2011 年 10 月 22 号,cloudera 完成了 Flume-728,对 Flume 进行了里程碑式的改动:重构核心组件、核心配置以及代码架构,重构后的版本统称为 Flume NG(next generation);改动的另一原因是将 Flume 纳入 apache 旗下,cloudera Flume 改名为 Apache Flume。

Flume OG

FLUM OG 有三种角色的节点:代理节点(agent)、收集节点(collector)、主节点(master)。
-agent 从各个数据源收集日志数据,将收集到的数据集中到 collector,然后由收集节点汇总存入 hdfs。master 负责管理 agent,collector 的活动。
-agent、collector 都称为 node,node 的角色根据配置的不同分为 logical node(逻辑节点)、physical node(物理节点)。对 logical nodes 和 physical nodes 的区分、配置、使用一直以来都是使用者最头疼的地方。
-agent、collector 由 source、sink 组成,代表在当前节点数据是从 source 传送到 sink。

Flume_第1张图片
Flume OG 架构图

Flume_第2张图片
Flume OG 节点组成图

Flume NG

NG 只有一种角色的节点:代理节点(agent)。
没有 collector、master 节点。这是核心组件最核心的变化。
去除了 physical nodes、logical nodes 的概念和相关内容。
agent 节点的组成也发生了变化。NG agent 由 source、sink、channel 组成。

Flume_第3张图片
Flume NG 架构图

Flume_第4张图片
Flume NG 节点组成图

Flume OG vs Flume NG

在 OG 版本中,Flume 的使用稳定性依赖 zookeeper。它需要 zookeeper 对其多类节点(agent、collector、master)的工作进行管理,尤其是在集群中配置多个 master 的情况下。当然,OG也可以用内存的方式管理各类节点的配置信息,但是需要用户能够忍受在机器出现故障时配置信息出现丢失。所以说 OG 的稳定行使用是依赖zookeeper 的。

而在 NG 版本中,节点角色的数量由 3 缩减到 1,不存在多类角色的问题,所以就不再需要 zookeeper 对各类节点协调的作用了,由此脱离了对 zookeeper 的依赖。由于 OG 的稳定使用对 zookeeper 的依赖表现在整个配置和使用过程中,这就要求用户掌握对 zookeeper 集群的搭建及其使用


OG 在安装时:在 flume-env.sh 中设置$JAVA_HOME。 需要配置文件 flume-conf.xml。其中最主要的、必须的配置与 master 有关。集群中的每个 Flume 都需要配置 master 相关属性(如 flume.master.servers、flume.master.store、flume.master.serverid)。 如果想稳定使用 Flume 集群,还需要安装 zookeeper 集群,这需要用户对 zookeeper 有较深入的了解。 安装 zookeeper 之后,需要配置 flume-conf.xml 中的相关属性,如 flume.master.zk.use.external、flume.master.zk.servers。 在使用 OG 版本传输数据之前,需要启动 master、agent。

NG 在安装时,只需要在 flume-env.sh 中设置$JAVA_HOME。

所以,当下我们使用Flume的时候,一般都采用Flume NG

二、监听目录

按照搭建hadoop完全分布式集群博文搭建完hadoop集群后,发现hadoop完全分布式集群自带了HDFS,MapReduce,Yarn等基本的服务,一些其他的服务组件需要自己重新安装,比如Hive,Hbase,sqoop,zookeeper,spark等,这些组件集群模式都在前面相关博文中有介绍,今天我们需要安装另外一个组件,它就是日志采集工具Flume。

操作步骤

1. Flume介绍

Cloudera 开发的分布式日志收集系统 Flume,是 hadoop 周边组件之一。其可以实时的将分布在不同节点、机器上的日志收集到 hdfs 中。Flume 初始的发行版本目前被统称为 Flume OG(original generation),属于 cloudera。但随着 FLume 功能的扩展,Flume OG 代码工程臃肿、核心组件设计不合理、核心配置不标准等缺点暴露出来,尤其是在 Flume OG 的最后一个发行版本 0.94.0 中,日志传输不稳定的现象尤为严重,这点可以在 BigInsights 产品文档的 troubleshooting 板块发现。为了解决这些问题,2011 年 10 月 22 号,cloudera 完成了 Flume-728,对 Flume 进行了里程碑式的改动:重构核心组件、核心配置以及代码架构,重构后的版本统称为 Flume NG(next generation);改动的另一原因是将 Flume 纳入 apache 旗下,cloudera Flume 改名为 Apache Flume

2. Flume1.7.0下载

Flume1.7.0安装包下载地址
Flume其他版本下载地址

注意:
下载完安装包后,将Flume的安装包上传到主节点的opt目录下

3. Flume1.7.0解压缩和更换目录

 # cd /opt
 # tar -xzvf apache-flume-1.7.0-bin.tar.gz
 # mv apache-flume-1.7.0-bin flume1.7.0

 # chmod 777 -R /opt/flume1.7.0        #给目录授权

4. 配置环境变量

 # vim /etc/profile

export FLUME_HOME=/opt/flume1.7.0
export FLUME_CONF_DIR=$FLUME_HOME/conf
export PATH=$FLUME_HOME/bin

 # source /etc/profile

5. 测试使用

5.1 添加flume-conf.properties配置文件

 # cd /opt/flume1.7.0/conf
 # vim flume-conf.properties
# a.conf: A single-node Flume configuration
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /opt/log
a1.sources.r1.fileHeader = true
a1.sources.r1.deserializer.outputCharset=UTF-8
# Describe the sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://hadoop0:9000/log
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.writeFormat=Text
a1.sinks.k1.hdfs.maxOpenFiles = 1
a1.sinks.k1.hdfs.rollCount = 0
a1.sinks.k1.hdfs.rollInterval = 0
a1.sinks.k1.hdfs.rollSize = 1000000
a1.sinks.k1.hdfs.batchSize = 100000
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000000
a1.channels.c1.transactionCapacity = 100000
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

5.2 创建目录并授权

 # mkdir /opt/log
 # chmod 777 -R /opt/log

注:hdfs的log目录,不用手动去创建,它会自动生成的

5.3 运行

 # cd /opt/flume1.7.0/
 # bin/flume-ng agent --conf conf --conf-file conf/flume-conf.properties --name a1 -Dflume.root.logger=INFO,console

5.4 运行效果

Flume_第5张图片

命令执行后,它会存在一个进程,一直在监听目录,所以会一直开着!

效果就是:当你在/opt/log目录下添加了txt文档后,HDFS中的log目录下会生成一个文件,将txt中的内容拷贝到HDFS的log中,当再传入一个文件时,Flume会将txt中的内容添加到已创建的文件后面!如果关闭这个flume agent,重新开启一个,那么HDFS的log中,会重新生成一个文件进行收集!

5.5 测试

在/opt/log目录下,上传一个a1.txt文档,里面写着“北京欢迎您,test1”,在/opt/log/目录下刷新,看到a1.txt文件,立马改变成为a1.txt.COMPLETED,查看HDFS的log目录,发现增加了一个文件,查看其中内容。

Flume_第6张图片

当在/opt/log目录下,再上传一个a2.txt文档,里面写着“北京欢迎您,test2”,查看效果。
注:再次上传的文件名,不能和之前的文件名相同,否则报错了!

Flume_第7张图片

三、监听文件

按照Hadoop完全分布式安装Flume博文,测试使用了Flume监听文件夹,当文件夹中添加了文件,Flume设置会立马进行收集文件夹中的添加的文件,那么这是一种应用场景,但是如果我们想收集文件中的内容,该如何办呢?比如,linux目录下有一个文件,我会往这个文件里不断的新增内容,那么怎么才能实时写入到HDFS呢?

操作方案

Hadoop完全分布式安装Flume博文,中监控文件夹,如果linux目录的文件夹下,有文件添加,那么会自动采集到HDFS目录,如果需要监控具体的文件内容,如果该文件中有数据更新,那么需要修改flume-conf.properties文件为如下,其他不变!

 # cd /opt/flume1.7.0/conf
 # vim flume-conf.properties

# a.conf: A single-node Flume configuration
# 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 /opt/log/exec.text
a1.sources.r1.fileHeader = true
a1.sources.r1.deserializer.outputCharset=UTF-8
# Describe the sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://hadoop0:9000/log
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.writeFormat=Text
a1.sinks.k1.hdfs.maxOpenFiles = 1
a1.sinks.k1.hdfs.rollCount = 0
a1.sinks.k1.hdfs.rollInterval = 0
a1.sinks.k1.hdfs.rollSize = 1000000
a1.sinks.k1.hdfs.batchSize = 100000
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000000
a1.channels.c1.transactionCapacity = 100000
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
 # cd /opt/flume1.7.0/
 # bin/flume-ng agent --conf conf --conf-file conf/flume-conf.properties --name a1 -Dflume.root.logger=INFO,console

你可能感兴趣的:(大数据,hadoop)