Flume下载地址:http://apache.fayea.com/flume/

官方使用文档:  http://flume.apache.org/documentation.html

与RocketMQ的结合使用扩展:Rocket-Flume:https://github.com/apache/rocketmq-externals/tree/master/rocketmq-flume

Flume简介

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

特点:

  • Flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力,即是日志采集和汇总的工具
  • Logstash、FileBeat是ES栈的日志数据抽取工具,他们和Flume很类似,前者是轻量级、后者是重量级,若项目组使用的是ES栈技术,那完全可以使用Logstash取代Flume。

2、Flume 的一些核心概念:

组件 功能
Agent 使用JVM 运行Flume。每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks。
Client 生产数据,运行在一个独立的线程。
Source 从Client收集数据,传递给Channel。
Sink 从Channel收集数据,运行在一个独立线程。
Channel 连接 sources 和 sinks ,这个有点像一个队列。
Events 可以是日志记录、 avro 对象等。

Flume以agent为最小的独立运行单位。一个agent就是一个JVM。单agent由Source、Sink 和 Channel 三大组件构成,如下图

这是一个flume-ng 最简单的图。flume-ng 是由一个个agent组成的。一个agent就像一个细胞一样。当然可以自由组合,如下图:

上面是两个agent链接在一起的,再看看更多的......

你会发现帅呆了。就像拼积木一样........ 没错,整个flume-ng 架子是由一个一个agent拼接而成的,支持多层次多项扩展。这样非常灵活。

Flume支持用户建立多级流,也就是说,多个agent可以协同工作,并且支持Fan-in、Fan-out、Contextual Routing、Backup Routes。如下图所示:

Flume 整体架构介绍

Flume架构整体上看就是 source-->channel-->sink 的三层架构(参见最上面的 图一),类似生成者和消费者的架构,他们之间通过queue(channel)传输,解耦。

Source:完成对日志数据的收集,分成 transtion 和 event 打入到channel之中。 
Channel:主要提供一个队列的功能,对source提供中的数据进行简单的缓存。 
Sink:取出Channel中的数据,进行相应的存储文件系统,数据库,或者提交到远程服务器。 
对现有程序改动最小的使用方式是使用是直接读取程序原来记录的日志文件,基本可以实现无缝接入,不需要对现有程序进行任何改动

一、Flume下载安装

1、官网下载地址:    http://flume.apache.org/download.html

下载后解压到指定目录,例如 /usr/local/flume

# tar -zxvf apache-flume-1.8.0-bin.tar.gz  ;  mv apache-flume-1.8.0-bin /usr/local/flume

2、配置环境变量

Java运行时环境一定要匹配(譬如flume1.8.0,使用jdk 1.8或更高版本)

# vim /etc/profile

export FLUME_HOME=/usr/local/flume
export FLUME_CONF_DIR=$FLUME_HOME/conf
export PATH=.:$PATH:$FLUME_HOME/bin

# vim  flume-env.sh

export JAVA_HOME=/usr/local/java/jdk1.8.0_171

3、验证是否安装成功:/usr/local/flume/bin/flume-ng version 出现以下提示说明安装成功。

Flume 1.6.0
Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git
Revision: 2561a23240a71ba20bf288c7c2cda88f443c2080
Compiled by hshreedharan on Mon May 11 11:15:44 PDT 2015
From source with checksum b29e416802ce9ece3269d34233baf43f

二、配置Flume

1、vim flume-house-log.properties

agenthouse.sources=sourcehouse
agenthouse.channels=chanelhouse
agenthouse.sinks=channels=sinkhouse agenthouse.sources.sourcehouse.channels=channelhouse
agenthouse.sources.sourcehouse.type=avro
agenthouse.sources.sourcehouse.bind=0.0.0.0
agenthouse.sources.sourcehouse.port= agenthouse.channels.channelhouse.type=memory
agenthouse.channels.channelhouse.capacity=
agenthouse.channels.channelhouse.transactionCapactiy= agenthouse.sinks.sinkhouse.channel=channelhouse
agenthouse.sinks.sinkhouse.type=FILE_ROLL
agenthouse.sinks.sinkhouse.sink.rollInterval=
agenthouse.sinks.sinkhouse.sink.directory=/data/logs/flume-out

2、vim flume-house-hdfs.properties

agenthousehdfs.sources=sourcehousehdfs
agenthousehdfs.sinks=sinkhousehdfs
agenthousehdfs.channels=channelhousehdfs agenthousehdfs.sources.sourcehousehdfs.type=spooldir
agenthousehdfs.sources.sourcehousehdfs.channels=channelhousehdfs
agenthousehdfs.sources.sourcehousehdfs.spoolDir=/data/logs/spool/house
agenthousehdfs.sources.sourcehousehdfs.fileHeader=true agenthousehdfs.channels.channelhousehdfs.type=memory
agenthousehdfs.channels.channelhousehdfs.capacity=
agenthousehdfs.channels.channelhousehdfs.transactionCapactiy= agenthousehdfs.sinks.sinkhousehdfs.type=hdfs
agenthousehdfs.sinks.sinkhousehdfs.hdfs.writeFormat=Text
agenthousehdfs.sinks.sinkhousehdfs.hdfs.fileType=DataStream
agenthousehdfs.sinks.sinkhousehdfs.channel=channelhousehdfs
agenthousehdfs.sinks.sinkhousehdfs.hdfs.useLocalTimeStamp=true
agenthousehdfs.sinks.sinkhousehdfs.hdfs.path=hdfs://dataMaster30:10001/logs/house/%Y/%m/%d/
agenthousehdfs.sinks.sinkhousehdfs.hdfs.filePrefix=house
agenthousehdfs.sinks.sinkhousehdfs.hdfs.rollInterval=
agenthousehdfs.sinks.sinkhousehdfs.hdfs.rollSize=
agenthousehdfs.sinks.sinkhousehdfs.hdfs.rollCount=
agenthousehdfs.sinks.sinkhousehdfs.hdfs.idleTimeout=

3、启动flume

# cd /usr/local/flume && nohup bin/flume-ng agent -n agenthouse -c conf -f conf/flume-house-log.properties &

# cd /usr/local/flume && nohup bin/flume-ng agent -n agenthousehdfs -c conf -f conf/flume-house-hdfs.properties &

4、设置开机自启动

vim /etc/rc.local

su - hadoop -c "/usr/local/hadoop/sbin/start-all.sh"
su - hadoop -c "/usr/local/spark/sbin/start-all.sh"
su - hadoop -c "cd /usr/local/flume && nohup bin/flume-ng agent -n agenthouse -c conf -f conf/flume-house-log.properties &"
su - hadoop -c "cd /usr/local/flume && nohup bin/flume-ng agent -n agenthousehdfs -c conf -f conf/flume-house-hdfs.properties &"

单节点Flume配置(官网实例):

# example.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 = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = # 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 =
a1.channels.c1.transactionCapacity = # Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

Channel参数解释:

capacity:默认该通道中最大的可以存储的event数量

trasactionCapacity:每次最大可以从source中拿到或者送到sink中的event数量

keep-alive:event添加到通道中或者移出的允许时间

在启动Flume之前,先根据实际情况对JVM进行一下合理分配

# vim bin/flume-ng
JAVA_OPTS="-Xmx2048m"

然后我们就可以启动 Flume agent 了:

bin/flume-ng agent -c conf -f example.conf -n a1 -Dflume.root.logger=INFO,console

PS:-Dflume.root.logger=INFO,console 仅为 debug 使用,请勿生产环境生搬硬套,否则大量的日志会返回到终端。。。

-c /--conf 后跟配置目录,-f /--conf-file 后跟具体的配置文件,-n /--name 指定agent的名称

-c (--conf):      flume自身所需的conf文件路径
-f (--conf-file) :自定义的flume配置文件,也就是采集方案文件
-n (--name) : 自定义的flume配置文件中agent的name

然后我们再开一个 shell 终端窗口,创建指定测试文件:

# echo "hello world" > bin/log.00
使用avro-client发送上面创建的测试文件:
bin/flume-ng avro-client -c conf -H localhost -p 44444 -F bin/log.00
在Flume控制台,可以看到输出以下信息,注意最后一行:
2015-05-08 13:58:51,706 (New I/O server boss #1 ([id: 0xa70011a9, /0:0:0:0:0:0:0:0:44444])) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:171)] [id: 0x9396f72c, /127.0.0.1:49978 => /127.0.0.1:44444] OPEN
2015-05-08 13:58:51,709 (New I/O  worker #1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:171)] [id: 0x9396f72c, /127.0.0.1:49978 => /127.0.0.1:44444] BOUND: /127.0.0.1:44444
2015-05-08 13:58:51,709 (New I/O  worker #1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:171)] [id: 0x9396f72c, /127.0.0.1:49978 => /127.0.0.1:44444] CONNECTED: /127.0.0.1:49978
2015-05-08 13:58:52,226 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:70)] Event: { headers:{} body: 68 65 6C 6C 6F 20 77 6F 72 6C 64                hello world }
至此,单点 Flume Agent 算是部署成功了!

另外有一点需要强调的是,flume-ng提供了一种特殊的启动方式(不同于agent),那就是client启动。cilent是一个特殊的agent, 他的source是文件,channel是内存,sink是arvo。实际上是为了方便大家用,直接来传递文件的。

参考文档:http://www.aboutyun.com/thread-11972-1-1.html


线上运行的时单行日志超7M时会导致Flume异常,导致无法正常提供服务

Caused by: com.google.protobuf.InvalidProtocolBufferException: Protocol message was too large.  May be malicious.  Use CodedInputStream.setSizeLimit() to increase the size limit.

在flume的conf文件夹下的 log2kafka.conf 加上 agent1.sinks.sink1.producer.max.request.size = 5271988 即可。

Flume NG简介及配置的更多相关文章

  1. Flume NG 简介及配置实战

    Flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用.Flume 初始的发行版本目前被统称为 Flume OG(original generation),属于 clo ...

  2. 【转】Flume(NG)架构设计要点及配置实践

    Flume(NG)架构设计要点及配置实践   Flume NG是一个分布式.可靠.可用的系统,它能够将不同数据源的海量日志数据进行高效收集.聚合.移动,最后存储到一个中心化数据存储系统中.由原来的Fl ...

  3. Flume NG 配置详解(转)

    原文链接:[转]Flume NG 配置详解 (说明,名词对应解释 源-Source,接收器-Sink,通道-Channel) 配置 设置代理 Flume代理配置存储在本地配置文件.这是一个文本文件格式 ...

  4. Flume NG源代码分析(二)支持执行时动态改动配置的配置模块

    在上一篇中讲了Flume NG配置模块主要的接口的类,PropertiesConfigurationProvider提供了基于properties配置文件的静态配置的能力,这篇细说一下PollingP ...

  5. FLUME NG的基本架构

    Flume简介 Flume 是一个cloudera提供的 高可用高可靠,分布式的海量日志收集聚合传输系统.原名是 Flume OG (original generation),但随着 FLume 功能 ...

  6. Flume NG Getting Started(Flume NG 新手入门指南)

    Flume NG Getting Started(Flume NG 新手入门指南)翻译 新手入门 Flume NG是什么? 有什么改变? 获得Flume NG 从源码构建 配置 flume-ng全局选 ...

  7. 高可用Hadoop平台-Flume NG实战图解篇

    1.概述 今天补充一篇关于Flume的博客,前面在讲解高可用的Hadoop平台的时候遗漏了这篇,本篇博客为大家讲述以下内容: Flume NG简述 单点Flume NG搭建.运行 高可用Flume N ...

  8. flume ng系列之——flume安装

    flume版本:1.5.0 1.下载安装包: http://www.apache.org/dyn/closer.cgi/flume/1.5.0/apache-flume-1.5.0-bin.tar.g ...

  9. Flume环境部署和配置详解及案例大全

    flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统.支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本.HDF ...

随机推荐

  1. Smart210学习记录----nand flash驱动

    [详解]如何编写Linux下Nand Flash驱动  :http://www.cnblogs.com/linux-rookie/articles/3016990.html 当读写文件请求到来的时候, ...

  2. 解决R速度太慢问题

    R的速度慢一直被人诟病,最近做一个比较大的dataset的分析,跑得实在太慢,发现症结是R的data frame的index太慢: 以下为测试: gene_list = 1:100000 eQTL_m ...

  3. IIS32位,64位模式下切换

    一.32位模式 1.cscript %systemdrive%\inetpub\adminscripts\adsutil.vbs set w3svc/appPools/enable32bitappon ...

  4. mysql给其他用户权限访问我的数据库

    先执行这条语句,给用户权限 grant all privileges on *.* to root@"221.221.185.23" identified by "gyr ...

  5. mm/makefile

    ## Makefile for the linux memory manager.## Note! Dependencies are done automagically by 'make dep', ...

  6. 【转载】AngularJs 指令directive之controller,link,compile

    关于自定义指令的命名,你可以随便怎么起名字都行,官方是推荐用[命名空间-指令名称]这样的方式,像ng-controller.不过你可千万不要用 ng-前缀了,防止与系统自带的指令重名.另外一个需知道的 ...

  7. Android——使用SQLiteDatabase操作SQLite数据库

    除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NUL ...

  8. JdbcUtils 系列1

    1.开发前准备 创建java pro为dbutils_1,没有lib目录,建一个即可 /dbutils_1/lib/mysql-connector-java-5.0.8-bin.jar 数据库搭建c3 ...

  9. unity, 顶点对齐

    按住v键,选中物体的一个顶点,可以对齐到其它物体的某个顶点上. 参考https://docs.unity3d.com/Manual/PositioningGameObjects.html

  10. 微信公众号开发中遇到的几个bug

    一.测试自定义菜单接口时中文菜单名显示为null 设置的中文菜单名,中文未经过编码和解码过程,设置的中文菜单名在最后的微信服务器返回的json格式数据中显示为null. 解决办法:将中文先用uneco ...