大数据日志收集框架之Flume入门

Flume是Cloudrea公司开源的一款优秀的日志收集框架,主要经历了两个大的版本,分别是 Flume-OG Flume-NG OG是0.9.x的版本,依赖zookeeper,角色职责不够单一, NG是新版本指1.x的版本,官网解释它更轻量级,更小,角色职责更单一,利用点到点进行容错,当然这也是以后的趋势, 要理解Flume,就首先理解它的架构,下面看下,官网的一张拓扑图:

名词解释: Source:泛指所有的日志收集源,可以是web页面,log文件,数据库,端口,卡口信息等 Channel:提供中转的临时存储区,可以是本地文件,redis,kakfa,数据库,内存等 Sink:指日志最终落地的存储区,可以是数据库,HDFS,Hbase,Hive,本地文件等 Agent:指上面三者组合后的一个完整的数据收集代理,有了这个代理,我们把它安装任何机器上进行收集日志,当然前提是这个Agent符合这个机器上的业务。 下面看下,安装实战例子: 首先下载flume-ng的安装包: wget http://archive.apache.org/dist/flume/1.6.0/apache-flume-1.6.0-bin.tar.gz 解压 tar -zxvf apache-flume-1.6.0-bin.tar.gz 将根目录下的conf下的一些模板文件,重命名成正常文件 如果没有配置JAVA_HOME为环境变量的话, 则需要在flume-env.sh里面配置jdk的地址 1,然后新建一个first.properties的文件,加入以下配置:

Java代码

  1. [webmaster@Hadoop-0-187 conf]$ cat first.properties
  2. # example.conf: A single-node Flume configuration
  3. # Name the components on this agent
  4. #datasource
  5. a1.sources = r1
  6. #store
  7. a1.sinks = k1
  8. #transfer
  9. a1.channels = c1
  10. # Describe/configure the source
  11. a1.sources.r1.type = netcat
  12. a1.sources.r1.bind = localhost
  13. a1.sources.r1.port = 44444
  14. # Describe the sink
  15. a1.sinks.k1.type = logger
  16. # Use a channel which buffers events in memory
  17. a1.channels.c1.type = memory
  18. a1.channels.c1.capacity = 1000
  19. a1.channels.c1.transactionCapacity = 100
  20. # Bind the source and sink to the channel
  21. a1.sources.r1.channels = c1
  22. a1.sinks.k1.channel = c1

配置例子2:收集本地日志到hadoop里面 hdfs的sink目前支持三种文件类型: (1)SequenceFile 文本不可见 (2)DataStream 设置hdfs.writeFormat=Text,文本可见 (3)CompressedStream 设置hdfs.codeC=gzip, bzip2, lzo, lzop, snappy,其中一种,后面三个需要编译hadoop时支持才能设置。 默认是SequenceFile,以文本方式写进入的数据,是不可见的,除非改变类型为DataStream , 然后设置hdfs.writeFormat=Text即可,这个选项默认是Writable

Java代码

  1. a.sources=exec-source
  2. a.sinks=hdfs-sink
  3. a.channels=ch1
  4. #####source conf
  5. a.sources.exec-source.type=exec
  6. a.sources.exec-source.command=tail -F /ROOT/server/flume/v.log
  7. #####sink conf
  8. a.sinks.hdfs-sink.type=hdfs
  9. a.sinks.hdfs-sink.hdfs.path=hdfs://h1:9000/flume/events
  10. a.sinks.hdfs-sink.hdfs.filePrefix=search
  11. a.sinks.hdfs-sink.hdfs.rollInterval=10
  12. a.sinks.hdfs-sink.hdfs.rollSize=0
  13. #不设置压缩,指定文本方式加入hdfs
  14. #a.sinks.hdfs-sink.hdfs.fileType=DataStream
  15. #a.sinks.hdfs-sink.hdfs.writeFormat=Text
  16. #设置压缩lzo或者snappy
  17. a.sinks.hdfs-sink.hdfs.fileType=CompressedStream
  18. #a.sinks.hdfs-sink.hdfs.codeC=snappy
  19. #a.sinks.hdfs-sink.hdfs.codeC=lzo
  20. #a.sinks.hdfs-sink.hdfs.codeC=lzop
  21. #a.sinks.hdfs-sink.hdfs.codeC=gzip
  22. a.sinks.hdfs-sink.hdfs.codeC=bzip2
  23. ####channels conf
  24. a.channels.ch1.type=memory
  25. a.channels.ch1.capacity=1000
  26. a.sources.exec-source.channels=ch1
  27. a.sinks.hdfs-sink.channel=ch1

启动命令: 最后的a与配置文件里面的agent的name必须一致 bin/flume-ng agent --conf conf --conf-file conf/to_hdfs.properties --name a 下面是一个按年月日时分,收集的日志:

Java代码

  1. a.sources=exec-source
  2. a.sinks=hdfs-sink
  3. a.channels=ch1
  4. #####source conf
  5. a.sources.exec-source.type=exec
  6. a.sources.exec-source.command=tail -F /ROOT/server/flume/v.log
  7. #####sink conf
  8. a.sinks.hdfs-sink.type=hdfs
  9. a.sinks.hdfs-sink.hdfs.path=hdfs://h1:9000/flume/events/%Y/%m/%d/%H/%M
  10. a.sinks.hdfs-sink.hdfs.filePrefix=search
  11. a.sinks.hdfs-sink.hdfs.rollInterval=10
  12. a.sinks.hdfs-sink.hdfs.rollSize=0
  13. a.sinks.hdfs-sink.hdfs.useLocalTimeStamp=true
  14. #不设置压缩
  15. #a.sinks.hdfs-sink.hdfs.fileType=DataStream
  16. #a.sinks.hdfs-sink.hdfs.writeFormat=Text
  17. #设置压缩lzo或者snappy
  18. a.sinks.hdfs-sink.hdfs.fileType=CompressedStream
  19. #a.sinks.hdfs-sink.hdfs.codeC=snappy
  20. #a.sinks.hdfs-sink.hdfs.codeC=lzo
  21. #a.sinks.hdfs-sink.hdfs.codeC=lzop
  22. #a.sinks.hdfs-sink.hdfs.codeC=gzip
  23. a.sinks.hdfs-sink.hdfs.codeC=bzip2
  24. ####channels conf
  25. a.channels.ch1.type=memory
  26. a.channels.ch1.capacity=1000
  27. a.sources.exec-source.channels=ch1
  28. a.sinks.hdfs-sink.channel=ch1

最后看下,配置flume监听linux的rsyslog的日志: 可用nc模拟telent发送数据到5140端口 echo "<1>hello via syslog" | nc -t localhost 5140 配置/etc/rsyslog.conf 在最后一行,加入tcp转发端口:

Java代码

  1. *.* @@localhost:5140

如果不生效,可考虑:取消注释,使下面的生效: Java代码

  1. # Provides TCP syslog reception
  2. #$ModLoad imtcp
  3. #$InputTCPServerRun 5140

改完之后,重启rsyslog

Java代码

  1. sudo service rsyslog restart

然后配置flume flume监听rsyslog,或者syslog Java代码

  1. a.sources=exec-source
  2. a.sinks=hdfs-sink
  3. a.channels=ch1
  4. #####source conf rsyslog
  5. a.sources.exec-source.type=syslogtcp
  6. a.sources.exec-source.port=5140
  7. a.sources.exec-source.host=0.0.0.0
  8. #####sink conf
  9. a.sinks.hdfs-sink.type=hdfs
  10. a.sinks.hdfs-sink.hdfs.path=hdfs://h1:9000/flume/events/%Y/%m/%d/%H/%M
  11. a.sinks.hdfs-sink.hdfs.filePrefix=search
  12. a.sinks.hdfs-sink.hdfs.rollInterval=10
  13. a.sinks.hdfs-sink.hdfs.rollSize=0
  14. a.sinks.hdfs-sink.hdfs.useLocalTimeStamp=true
  15. #不设置压缩
  16. #a.sinks.hdfs-sink.hdfs.fileType=DataStream
  17. #a.sinks.hdfs-sink.hdfs.writeFormat=Text
  18. #设置压缩lzo或者snappy
  19. a.sinks.hdfs-sink.hdfs.fileType=CompressedStream
  20. #a.sinks.hdfs-sink.hdfs.codeC=snappy
  21. #a.sinks.hdfs-sink.hdfs.codeC=lzo
  22. #a.sinks.hdfs-sink.hdfs.codeC=lzop
  23. #a.sinks.hdfs-sink.hdfs.codeC=gzip
  24. a.sinks.hdfs-sink.hdfs.codeC=bzip2
  25. ####channels conf
  26. a.channels.ch1.type=memory
  27. a.channels.ch1.capacity=1000
  28. a.sources.exec-source.channels=ch1
  29. a.sinks.hdfs-sink.channel=ch1

配置完成启动: 然后看flume的log再次登陆终端,推出终端,sudo命令执行失败,flume都会采集转发到hdfs上存储起来 总结: Flume不愧是大数据平台的一个标准组件,与Hadoop能非常完美的结合,当然,除了与hadoop结合外,还支持Hbase,Hive等, 相比Logstash+ElasticSearch+Kibana的ELK里面的Logstash,flume比较适合结构化的日志收集,存储,而Logstasch则还可以非常方便的解析,清洗数据,虽然flume通过扩展jar也能支持,但logstash使用的是Jruby语法,相比java,则比较简单。这也是ELK都能够快速部署的原因,当然flume也支持向elasticsearch推送索引数据,通过扩展的jar,几乎大部分功能都能轻松实现,所以,没有谁最好用,谁最不好用,只有谁最适合业务,才是最好的!

原文发布于微信公众号 - 我是攻城师(woshigcs)

原文发表时间:2016-02-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏情情说

《深入实践Spring Boot》阅读笔记之三:核心技术源代码分析

上篇文章总结了《深入实践Spring Boot》的第二部分,本篇文章总结第三部分,也是最后一部分。这部分主要讲解核心技术的源代码分析,因为篇幅和能力原因,分析的...

5199
来自专栏c#开发者

企业库推广

企业库推广  阿新 1. 概述 可重用的程序块库,用于解决共性的企业级开发过程中所面临的挑战 l 较低风险(经过实践验证的、精准的) l 降低成本(可充用) ...

36313
来自专栏技术翻译

使用Netflix Hystrix保护您的应用程序

借助微服务架构,我们可以构建灵活且可独立部署的软件模块或系统,这些模块或系统通过HTTP资源API等轻量机制相互通信并提供结果。与单一应用程序相比,它具有许多优...

910
来自专栏JavaWeb

Spring 声明式事务常用的二种配置方式

3487
来自专栏挖掘大数据

Apache NiFi 简介及Processor实战应用

Apache NiFi是什么?NiFi官网给出如下解释:“一个易用、强大、可靠的数据处理与分发系统”。通俗的来说,即Apache NiFi 是一个易于使用、功能...

1.7K10
来自专栏FreeBuf

Metasploitable2使用指南

Metasploitable 2 Metasploitable2 虚拟系统是一个特别制作的ubuntu操作系统,本身设计作为安全工具测试和演示常见漏洞攻击。版...

4769
来自专栏杂烩

SSM项目搭建之MyBatis 原

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了goog...

742
来自专栏木东居士的专栏

Ubuntu安装Opencv记录(附人脸识别和人眼识别例子)

2214
来自专栏Java架构解析

SpringBoot整合RabbitMQ之典型应用场景实战一

RabbitMQ 作为目前应用相当广泛的消息中间件,在企业级应用、微服务应用中充当着重要的角色。特别是在一些典型的应用场景以及业务模块中具有重要的作用,比如业务...

4070
来自专栏张善友的专栏

使用Hystrix提高系统可用性

今天稍微复杂点的互联网应用,服务端基本都是分布式的,大量的服务支撑起整个系统,服务之间也难免有大量的依赖关系,依赖都是通过网络连接起来。 ? (图片来源:htt...

2115

扫码关注云+社区

领取腾讯云代金券