Flume开源的海量日志收集系统使用指南

Flume开源的海量日志收集系统使用指南

BigInsights 将实时日志收集体统 Flume 整合为产品的一部分,支持对 flume 极其相关组件 hadoop、zookeeper 的组合安装,用可视化界面为用户部署实时日志收集系统;另外 BigInsights flume 通过 flume runtime toolkit 支持快速的添加日志收集节点,无需配置,轻松实现日志收集系统的可扩展性。

Flume 是开源的海量日志收集系统,支持对日志的实时性收集。初始的 flume 版本是 flume OG(Flume original generation) 由 Cloudera 公司开发,叫做 Cloudera Flume;后来,cloudera 把 flume 贡献给 Apache,版本改为 FLUME NG(Flume next generation)现在称为 Apache Flume。最初始的 BigInsights 使用 flume 0.9.1,随后 BigInsights 将 Flume 升级到 0.9.4。这两个版本都属于 flume OG,基于开源的 Cloudera Flume。 本人认为,在 BigInsights 以后发布的版本中,flume 升级到 flume NG 是必然趋势。

BigInsights 包含了两个和 flume 密切相关的组件:hadoop 和 zookeeper。Flume 和 hadoop 的链接是其可以将收集的日志存于 hdfs,从而可以使用 hadoop 高效的处理日志数据,从日志中提取有用信息;而和 zookeeper 的关系是,flume 内部收集日志的各类节点可以通过 zookeeper(高效可靠的协同工作系统)进行管理,flume 各个节点的配置信息存放在 zookeeper 的 data 文件中。从整体上来讲,flume 和 zookeeper 是 hadoop 周边组件,都是和 hadoop 密切相关的;hadoop 也可以使用 zookeeper 管理内部各类节点。以 hadoop 为核心的大数据处理系统 BigInsights,将 zookeeper 和 flume 整合在系统中,为用户提供了可视化洁面,方便对多个组件的在多个节点上的整合安装;也就是说,使用 BigInsights 的可视化界面,用户可以轻松的在多个节点上部署 hadoop+flume+zookeeper,实现日志系统的布置。

另外,BigInsights 内部的 flume 通过 Flume Runtime Toolkit,为用户提供了无需配置的 flume 安装包,实现对当前 flume 集群的快速扩展。

Flume 基础知识

Flume 对日志数据的收集通过三种节点:master,agent,collector 之间的协作完成(表 1)。其中 agent、collector 都属于日志收集节点。数据的传输需要指定数据源(source)和数据汇集点(sink)(表 2)。Flume 中还有个重要的概念叫数据流(data flow)。数据流就是数据传输的管道,描述了日志数据从产生处到最终目的地的数据传送过程。flume 中通过对日志收集节点的 source,sink 配置,实现数据流的建立。

表 1. Flume 基本概念 1

节点名节点职责
master node(主节点)管理另外两种节点,是 flume 集群的控制器。
agent node(代理节点)收集 log 的节点,其可以将收集到的 log 直接发给数据仓库,也可以将数据发给收集节点(collector node)。
collector node(收集节点)对多个代理节点发过来的数据进行整合,然后发给数据仓库。这个节点的产生是减少日志收集节点和数据仓库之间的连接。

其中,agent node 和 collector node 由数据源(source)和数据汇集点(sink)两部分组成。本人认为,collector node 和代理节点 agent node 是同一种 flume 节点类型,那就是负责收集日志数据的节点,只是日志的数据源(source)和数据汇集点(sink)地不同。

表 2. Flume 基本概念 2

角色描述
sink数据源,log 产生的位置。
source数据汇集点,log 要被传送到的位置。

在某种情况下,一个 node 的 sink 有可能是另外一个 node 的 source。如表 3,在同一个机器上(机器名:hostname)启动两个日志收集节点:agent1,agent2。Agent1 从 log.text 文件中收集日志,将收集到的日志发送到端口 35853;另外一个日志收集节点 agent2 则从端口 35863 监听数据,并将监听到的数据存放在 hdfs 中。在此例中,agent1 的 sink 即是 agent2 的 source。

表 3. 节点配置实例

NodeSourceSink
Agent1tail("/home/flume/log.text", false)agentSink( hostname, 35863)
Agent2collectorSource(35863)collectorSink( "hdfs://biginsight.ibm.com:9000/flume", "agent-testing")

Flume 配置

Flume 的配置文件为 $FLUME_HOME/conf/flume-conf.xml,如果用户没有配置此文件,flume 将使用默认配置文件 flume-conf.xml.template。属性的描述以一下形式描述(以属性 flume.master.zk.servers 为例):

<property> <name>flume.master.zk.servers</name> <value>hostname:2181</value> <description>Zookeeper server<description> </property>

配置文件针对每个属性给出属性名(name)、属性值(value)与属性描述(description),其中属性描述不是必需的,可以省略。部署 Flume 过程中,与用户密切相关的属性(property)有如下几个(表 4):

表 4. 配置信息

属性(Property)描述
flume.master.servers主节点机器名(master node)
flume.master.store各节点配置信息的存放方式。有两种:'zookeeper' 或 'memory'。一般使用 zookeeper 存放 flume 节点配置信息。因为 zookeeper 是可靠的,具有容错能力并且可以通过重启修复配置信息,这样可防止配置信息的丢失。当然,如果用户可以忍受在机器出现故障时配置信息出现丢失,可以用 memory 的方式。
flume.master.serverid主节点的唯一辨识号。Flume 集群中可以有多个 master,每个 master 以唯一的 serverid 用来标识。取值可以为 0、1、2 ……
flume.master.zk.use.external布尔值,是否使用外部的 zookeeper 集群来管理节点配置信息。如果是,则需要部署 zookeeper 集群,并通过属性“flume.master.zk.servers”指定 zookeeper 集群。
flume.master.zk.serversZookeeper 集群。属性值(value)使用以下格式:zookeeperHostname:zookeeperPort。当有多和 zookeeper 节点时,属性值以“,”分割。如:hostname1:2181,hostname:2181。

除此之外,存放 flume 的 log 的目录可以在 log4j.properties 文件中通过属性 flume.log.dir 指定,如:flume.log.dir=/tmp/flume/logs。Flume 有两个 log 文件:flumemaster.out 和 flumenode.out。顾名思义,flumemaster.out 存放主节点(master)的 log 信息,flumenode.out 存放日志收集节点的信息(agent 和 collector)。当 flume 节点启动后,会有相应的进程文件存放 pid,存放路径可以在 flume-env.sh 中设定,如:export FLUME_PID_DIR=“/tmp/flume/pids”。