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. IOS7 ~ Xcode5 制作 framework

    一.Framework 简介(Introduction to Framework Programming Guide) Mac OS X 扩展了 framework 的功能,让我们能够利用它来共享代码 ...

  2. Python 利用pytesser模块识别图像文字

    使用的是python的pytesser模块,原先想做的是图片中文识别,搞了一段时间了,在中文的识别上还是有很多问题,这里做记录分享. pytesser,OCR in Python using the ...

  3. iOS 常用设计模式和机制之KVO

    KVO http://blog.kyleduo.com/2014/10/20/ios_learning-kvo/ 定义: KVO:Key-Value Observing,是Foundation框架提供 ...

  4. 数迹学——Asp.Net MVC4入门指南(2):添加一个控制器

    自嘲一下......万事还是得从官方的入门开始 由于找不到适合新新手的MVC入门实例所以回过头来做一下微软的 <Asp.Net MVC4入门指南>. 只有把自己放在太阳下暴晒,才知道自己有 ...

  5. (转)注意力机制(Attention Mechanism)在自然语言处理中的应用

    注意力机制(Attention Mechanism)在自然语言处理中的应用 本文转自:http://www.cnblogs.com/robert-dlut/p/5952032.html  近年来,深度 ...

  6. 转--Eclipse中ctrl+shift+r与ctrl+shift+t的区别

    Eclipse中ctrl+shift+r与ctrl+shift+t的区别 标签: 快捷键工作区文件搜索打开资源文件 2016-09-13 15:44 292人阅读 评论(0) 收藏 举报  分类: e ...

  7. unity, itween, closed path

  8. php分10个不同等级压缩优化图片

    今天找到一个php写的压缩图片程序,可以分10个等级(0-9)来压缩,0等级时压缩比率不是很大,图片不会失真:随着压缩等级不断增大,图片会变得越来越不清晰,通常压缩后图片大小可以减少到原来的50%,压 ...

  9. .Net , 请取服务器上的文件

    public class IdentityScope : IDisposable { /// <summary> /// 登录一个新用户 /// </summary> /// ...

  10. Swagger使用总结

    Swagger使用总结 1. Swagger是什么? 官方说法:Swagger是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作 ...