1 Flume日志收集

1.1 总体介绍

官方地址:http://flume.apache.org/

1.1.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等)的能力 。

flume的数据流由事件(Event)贯穿始终。事件是Flume的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些Event由Agent外部的Source生成,当Source捕获事件后会进行特定的格式化,然后Source会把事件推入(单个或多个)Channel中。你可以把Channel看作是一个缓冲区,它将保存事件直到Sink处理完该事件。Sink负责持久化日志或者把事件推向另一个Source。

1.1.2 特点

Flume的可靠性
当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume提供了三种级别的可靠性保障,从强到弱依次分别为:end-to-end(收到数据agent首先将event写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送。),Store on failure(这也是scribe采用的策略,当数据接收方crash时,将数据写到本地,待恢复后,继续发送),Besteffort(数据发送到接收方后,不会进行确认)

可恢复性
还是靠Channel.推荐使用FileChannel,事件持久化在本地文件系统里面(性能比较差)。

核心概念
**Agent:**使用JVM运行Flume。每台机器运行一个agent,但是可以再一个agent中包含多个sources和sinks。
Client: 生产数据,运行一个独立的线程。
Source: 从Client收集数据,运行一个独立线程。
Channel: 连接sources和sinks,这个有点像一个队列。
Events: 可以是日志记录、avro对象等。

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

值得注意的是,Flume提供了大量内置的Source、Channel和Sink类型。不同类型的Source,Channel和sink可以自由组合。组合方式基于用于设置的配置文件,非常灵活。比如:Channel可以把事件暂存在内存里,也可以持久化到本地硬盘上。Sink可以把日志写入HDFS,HBase,甚至是另外一个Source等等。Flume支持用户建立多级流,也就是说,多个agent可以协同工作,并且支持Fan-in、Fan-out、Contextual Routing、Backup Routes。如下图所示:

1.1.3 采集形式

日志收集中一个非常常见的场景是大量的日志生成客户端将数据发送给附加到存储子系统的一些消费者代理。例如,从数百个web服务器中收集的日志,发送给数十个写入HDFS集群的代理。

在离线阶段,Flume的日志收集,Agent1/Agent2/Agent3端也是Flume端,主要的作用是采集nginx日志,采集到的日志文件最后下沉到另外一个agent4,最终通过agent4将数据下沉到hdfs中。

1.2 Agent1/Agent2/Agent3 Flume采集端配置

1.2.1 前期准备

运行Flume-1.8.0的时候,需要JDK,否则会报错。修改jdk位置:

[root@bigdata1 conf]# cd /home/bigdata/installed/flume-1.8.0/conf
[root@bigdata1 conf]# vim flume-env.sh
export JAVA_HOME=/home/bigdata/installed/jdk1.8.0_73

1.2.2 配置Flume内存参数

[root@bigdata1 flume-1.8.0]# cd /home/bigdata/installed/flume-1.8.0/conf
[root@bigdata1 flume-1.8.0]# vim flume-env.sh
修改flume-1.8.0/bin/flume-ng,主要修改JAVA_OPTS这个参数的值,具体的值是:
JAVA_OPTS="-Xmx256m"

内容是:

1.2.3 创建文件夹

进入线上服务器flume所在位置。

[root@bigdata1 flume-1.8.0]# cd /xxxxx/apache-flume-1.8.0-bin
[root@bigdata1 flume-1.8.0]# ll
总用量 6296
drwxrwxrwx  2 bigdata bigdata      62 3月  22 10:46 bin
-rwxrwxrwx  1 bigdata bigdata   81264 9月  15 2017 CHANGELOG
drwxrwxrwx  2 bigdata bigdata     286 6月   5 21:10 conf
-rwxrwxrwx  1 bigdata bigdata    5681 9月  15 2017 DEVNOTES
-rwxrwxrwx  1 bigdata bigdata    2873 9月  15 2017 doap_Flume.rdf
drwxrwxrwx 10 bigdata bigdata    4096 9月  15 2017 docs
drwxr-xr-x  3 root    root        123 6月  11 15:51 fileCHK
drwxr-xr-x  2 root    root        170 6月  11 16:50 fileData
drwxrwxrwx  2 bigdata bigdata    8192 3月  22 10:46 lib
-rwxrwxrwx  1 bigdata bigdata   27663 9月  15 2017 LICENSE
drwxr-xr-x  2 root    root         23 5月  15 14:47 logs
-rw-------  1 root    root    4054498 6月  11 16:50 nohup.out
-rwxrwxrwx  1 bigdata bigdata     249 9月  15 2017 NOTICE
-rwxrwxrwx  1 bigdata bigdata    2483 9月  15 2017 README.md
-rwxrwxrwx  1 bigdata bigdata    1588 9月  15 2017 RELEASE-NOTES
drwxrwxrwx  2 bigdata bigdata      68 3月  22 10:46 tools
-rw-r--r--  1 root    root    1242266 6月  11 16:20 zookeeper.out
[root@bigdata1 flume-1.8.0]#

要注意的是,上面的fileCHK,fileData为自己手动创建的,创建命令:

[root@bigdata1 flume-1.8.0]# cd /xxxxx/apache-flume-1.8.0-bin
[root@bigdata1 flume-1.8.0]# mkdir fileCHK
[root@bigdata1 flume-1.8.0]# mkdir fileData

1.2.4 查看/杀死Flume进程的方式

查看Flume的方式:

[root@bigdata1 flume-1.8.0]# grep flume | grep -v grep

杀死Flume的方式:

[root@bigdata1 flume-1.8.0]# kill -9 `ps -ef | grep flume | grep -v grep | awk '{print $2}'`

1.2.5 Conf文件配置

进入conf文件夹,创建采集日志的配置文件

[xxx@xxx]# vim file-collect-logs.conf

内容是:

#定义agent各个组件的名称
a1.sources=r1
a1.sinks=k1
a1.channels=c1#描述source端
a1.sources.r1.type=exec
#要注意的是,这里使用的是-F,只有这样才能保证nginx日志文件变化之后,不会出错
a1.sources.r1.command=tail -n +0 -F /var/log/nginx/tomcat_access.log
a1.sources.r1.channels=c1
#a1.sources.r1.restart=true
#a1.sources.r1.restartThrottle=5000
a1.sources.r1.threads=100#Describe the sink
##type设置成avro来设置发消息
a1.sinks.k1.type = avro
a1.sinks.k1.channel = c1
##下沉到bigdata1这台机器
a1.sinks.k1.hostname = xxx.xxx.xxx.xxx
##下沉到bigdata1中的4141
a1.sinks.k1.port = 4141 (此处和线上配置不一致)
a1.sinks.k1.batch-size = 10000#使用File通道
a1.channels.c1.type=file
a1.channels.c1.checkpointDir=/usr/local/work/apache-flume-1.8.0-bin/fileCHK
a1.channels.c1.dataDirs=/usr/local/work/apache-flume-1.8.0-bin/fileData
a1.channels.c1.keep-alive=60

1.2.6 Flume启动

采集端配置好之后,等待接收端Flume启动后,启动采集端Flume,启动方式是:

[x@xxx apache-flume-1.8.0-bin] cd /xxx/apache-flume-1.8.0-bin
[x@xxx apache-flume-1.8.0-bin] nohup bin/flume-ng agent -c conf -f conf/file-collect-logs.conf -n a1 -Dflume.root.logger=INFO,console &

其中杀死进程的方式:

kill -9 `ps -ef | grep flume | grep -v grep | awk '{print $2}'`

要注意的是:
在Flume修改配置之后是不需要重启Flume的。直接保存配置文件即可让配置启用。

1.3 Agent4 avro接收端Flume参数配置

1.3.1 前期准备

运行Flume-1.8.0的时候,需要JDK,否则会报错。修改jdk位置:

[root@bigdata1 conf]# cd /home/bigdata/installed/flume-1.8.0/conf
[root@bigdata1 conf]# vim flume-env.sh
export JAVA_HOME=/home/bigdata/installed/jdk1.8.0_73

1.3.2 配置Flume内存参数

参考1.2.1

1.3.3 创建文件夹

进入Flume所在位置,创建fileCHK 和 fileData

[root@bigdata1 flume-1.8.0]# cd /xxxx/installed/flume-1.8.0
[root@bigdata1 flume-1.8.0]# ll
总用量 6360
drwxrwxrwx  2 bigdata bigdata      62 3月  22 10:46 bin
-rwxrwxrwx  1 bigdata bigdata   81264 9月  15 2017 CHANGELOG
drwxrwxrwx  2 bigdata bigdata     286 6月   5 21:10 conf
-rwxrwxrwx  1 bigdata bigdata    5681 9月  15 2017 DEVNOTES
-rwxrwxrwx  1 bigdata bigdata    2873 9月  15 2017 doap_Flume.rdf
drwxrwxrwx 10 bigdata bigdata    4096 9月  15 2017 docs
drwxr-xr-x  3 root    root        123 6月  11 15:51 fileCHK
drwxr-xr-x  2 root    root        170 6月  11 17:18 fileData
drwxrwxrwx  2 bigdata bigdata    8192 3月  22 10:46 lib
-rwxrwxrwx  1 bigdata bigdata   27663 9月  15 2017 LICENSE
drwxr-xr-x  2 root    root         23 5月  15 14:47 logs
-rw-------  1 root    root    4121563 6月  11 17:18 nohup.out
-rwxrwxrwx  1 bigdata bigdata     249 9月  15 2017 NOTICE
-rwxrwxrwx  1 bigdata bigdata    2483 9月  15 2017 README.md
-rwxrwxrwx  1 bigdata bigdata    1588 9月  15 2017 RELEASE-NOTES
drwxrwxrwx  2 bigdata bigdata      68 3月  22 10:46 tools
-rw-r--r--  1 root    root    1242266 6月  11 16:20 zookeeper.out
[root@bigdata1 flume-1.8.0]#
创建fileCHK 和 fileData
[root@bigdata1 flume-1.8.0]# cd /xxxxx/apache-flume-1.8.0-bin
[root@bigdata1 flume-1.8.0]# mkdir fileCHK
[root@bigdata1 flume-1.8.0]# mkdir fileData

1.3.4 查看/杀死Flume进程的方式

参看1.2.4

1.3.5 编写Flume sink—>hdfs的配置文件

[root@bigdata1 conf]# cd /home/bigdata/installed/flume-1.8.0/conf
[root@bigdata1 conf]# vim avro-collect-logger.conf

具体内容如下:

#定义agent中的各各组件
a1.sources = r1
a1.sinks = k1
a1.channels = c1##描述和配置source端
##source中的avro组件是一个接收者服务
a1.sources.r1.type = avro
a1.sources.r1.channels = c1
#这里的bigdata1是机器hostname,可以写成ip地址。外界调用的时候,可以使用这个ip和下面的端口号port联合调用
a1.sources.r1.bind = bigdata1
a1.sources.r1.port = 4141
a1.sources.r1.threads = 100# Describe the sink
## 表示下沉到hdfs,类型决定了下面的参数
a1.sinks.k1.type = hdfs
## hdfs目录路径
a1.sinks.k1.hdfs.path = /nginx/%y-%m-%d
##写入hdfs的文件名前缀,可以使用flume提供的日期及%{host}表达式
a1.sinks.k1.hdfs.filePrefix = events-
## 表示到了需要触发的时间时,是否要更新文件夹,true:表示要
a1.sinks.k1.hdfs.round = true
#多久时间后close hdfs文件。单位是秒,默认30秒。设置为0的话表示不根据时间close hdfs文件
#配置下面的参数,表示40分钟滚动一次
a1.sinks.k1.hdfs.rollInterval = 3600
## 表示每隔value分钟改变一次(在0~24之间)
#a1.sinks.k1.hdfs.roundValue = 0
## 切换文件的时候的时间单位是分钟
#a1.sinks.k1.hdfs.roundUnit = minute
## 文件大小超过一定值后,close文件。默认值1024,单位是字节。设置为0的话表示不基于文件大小,134217728表示128m
## 0表示不按照文件大小进行滚动。
a1.sinks.k1.hdfs.rollSize = 0
## 写入了多少个事件后close文件。默认值是10个。设置为0的话表示不基于事件个数
a1.sinks.k1.hdfs.rollCount = 0
## 批次数,HDFS Sink每次从Channel中拿的事件个数。默认值100
a1.sinks.k1.hdfs.batchSize = 100000
## 使用本地时间戳
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#生成的文件类型,默认是Sequencefile,可用DataStream:为普通文本
a1.sinks.k1.hdfs.fileType = DataStream
#HDFS操作允许的时间,比如hdfs文件的open,write,flush,close操作。单位是毫秒,默认值是10000,一小时为:3600000,这里稍微设置的大写
a1.sinks.k1.hdfs.callTimeout = 7200000
a1.sinks.k1.hdfs.writeFormat = Text
#配置这个参数之后,不会因为文件所在块的复制而滚动文件了,只会根据你的配置项来滚动文件了。
#设置这个参数之后,上面的rollInterval、rollSize、rollCount等才会起作用。#hdfs.minBlockReplicas是为了让flume感知不到hdfs的块复制,这样滚动配置才不会受影响。
#假如hdfs的副本为3.那么配置的滚动时间为10秒,那么在第二秒的时候,flume检测到hdfs在复制块,那么这时候flume就会滚动
#这样导致flume的滚动方式受到影响。所以配置flume hdfs.minBlockReplicas配置为1,就检测不到副本的复制了。但是hdfs的副本还是3
a1.sinks.k1.hdfs.minBlockReplicas=1#描述channel,适用场景是要求并发高,并且机器内存足够,丢失数据不会很影响总体结果的场景。但是重启和宕机,数据会丢失。
#配置不好的时候,会出现内存等的问题。
#a1.channels.c1.type=memory
#a1.channels.c1.capacity=10000
#a1.channels.c1.transactionCapacity=10000
#a1.channels.c1.byteCapacityBufferPercentage = 20
#a1.channels.c1.byteCapacity = 800000
#a1.channels.c1.keep-alive = 60#适用场景,并发要求不高,要求硬盘足够即可,数据最后存在file中的,机器重启ls
或flume重启,只要调整参数,可以保证数据不丢失。
a1.channels.c1.type=file
a1.channels.c1.checkpointDir=/home/bigdata/installed/flume-1.8.0/fileCHK
a1.channels.c1.dataDirs=/home/bigdata/installed/flume-1.8.0/fileData
a1.channels.c1.keep-alive=60
a1.channels.c1.capacity=10000000
a1.channels.c1.transactionCapacity=10000000#绑定source和sink到channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

1.3.6 Flume启动

[root@bigdata1 flume-1.8.0]# cd /home/bigdata/installed/flume-1.8.0
[root@bigdata1 flume-1.8.0]# nohup bin/flume-ng agent -c conf -f conf/avro-collect-logger.conf -n a1 -Dflume.root.logger=INFO,console &

1.3.7 查看未关闭的块

hadoop fsck -openforwrite | more  查看未关闭块

1.3.8 查看运行日志

可以通过查看nohup.out的方式查看运行日志。

Flume日志采集,avro采集,以及通过参数控制下沉到hdfs的文件大小,时间等控制相关推荐

  1. Hadoop学习之Flume日志采集

    目录 一.Flume简介 二.Flume的安装配置 1.下载并上传 2.解压 3.配置 4.配置环境变量 5.使环境变量起作用 三.Flume入门 1.配置采集方案 2.指定采集方案启动Flume 3 ...

  2. 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )

    文章目录 安卓直播推流专栏博客总结 一. Android 端数据采集涉及到的相关概念 二. Camera 预览图像尺寸设置 三. 获取摄像头采集的数据格式 安卓直播推流专栏博客总结 Android R ...

  3. Java实现日志数据的采集显示

    1.日志实体类,用户记录用户登录登出 LogRec.java package q.dms.test;import java.util.Date;/*** 实体类 包含用户登录的id,ip,userNa ...

  4. 火车头采集翻页内容_火车头采集:内容替换支持[参数],标签

    火车头采集:内容替换支持[参数],标签 1, 内容替换 比如我们想要把标题里面的"网购火车票",换为"网购火车头采集器",我们就可以用采集器的替换功能如下图: ...

  5. 大数据flume日志采集系统详解

    一.flume介绍 flume 是一个cloudera提供的 高可用高可靠,分布式的海量日志收集聚合传输系统.Flume支持日志系统中定制各类数据发送方,用于收集数据.同时flume提供对数据进行简单 ...

  6. Flume日志收集系统架构详解--转

    2017-09-06朱洁大数据和云计算技术 任何一个生产系统在运行过程中都会产生大量的日志,日志往往隐藏了很多有价值的信息.在没有分析方法之前,这些日志存储一段时间后就会被清理.随着技术的发展和分析能 ...

  7. 《Flume日志收集与MapReduce模式》一2.2 Flume配置文件概览

    本节书摘来自华章出版社<Flume日志收集与MapReduce模式>一书中的第2章,第2.2节,作者 [美] 史蒂夫·霍夫曼(Steve Hoffman)斯里纳特·佩雷拉(Srinath ...

  8. 飞飞php2.8采集失败_飞飞影视系统火车头采集器采集发布免登录接口

    更改完免登陆代码后,就要写采集库接口了,打开\Lib\Action\Admin目录下的CollectAction.class.php文件,添加一个子函数,函数名称和第五步中的代码相同 //处理 火车头 ...

  9. 【火车头采集教程】轻而易举学会火车头采集(附带采集案例)

    咔咔不会用python,也没打算为了爬点东西就去学python.时间成本不允许我这样做 于是咔咔使用了一款工具,火车头采集工具 这款工具学会了很简单,不会的全是问题 下来咔咔会把这个工具的从开始到结束 ...

最新文章

  1. [转]关于重定向RedirectAttributes的用法
  2. C#中怎样将Listlt;自己定义gt;转为Json格式 及相关函数-DataContractJsonSerializer
  3. python递归报错 RuntimeError: maximum recursion depth exceeded
  4. workflow initialization in webclient ui - Remote call case
  5. Func 与Action
  6. Ajax 文件上传之PHP心得
  7. ICCV 2019 | RankSRGAN:排序学习 + GAN 用于超分辨率
  8. 骑马与砍杀是用python编的_骑马与砍杀编辑模式怎么用
  9. JavaSE集合框架-01-集合框架体系及表数据结构
  10. WebQQ3.0体验
  11. 英语邮件中常用的礼貌用语
  12. jsp超链接字体_超链接标记
  13. 【Unity3d】U3d灯光
  14. Android基础整合项目之节日群发助手(一)
  15. mysqloffset什么意思_MySQL中OFFSET和FETCH的详解
  16. 新手小白怎么学抖音运营?抖音运营5大技巧
  17. 两台windows电脑通过以太网互ping
  18. 猿辅导9-12编程题3道
  19. 从今日起,做一个有归置的男人!
  20. 星际战甲堕落轰击者结合目标_warframe星际战甲新手必备mod分享

热门文章

  1. python使用环境_使用python之环境管理
  2. 你可能不知道的Python面试秘籍 干货满满(附带参考答案)上篇
  3. python读写、创建 文件(二)
  4. Python网络编程(1.利用socket(udp)+网络调试助手,发送数据)
  5. 词云(WordCloud)参数详情
  6. 业务总结003:抽奖活动
  7. 判断Java 对象实例是否死亡
  8. VTK:标签顶点和边用法实战
  9. boost::safe_numerics::base_type相关的测试程序
  10. boost::mp11::mp_map_keys相关用法的测试程序