大家好,我是茹憶。近期将为大家分享大数据架构的相关系列的技术知识,欢迎大家定时阅读学习。
上一期《学懂大数据架构-海量数据采集技术(一)》和大家介绍了大数据采集技术的基本概念,本期将为大家介绍数据采集技术中的日志采集技术。
首先请大家记住,常见的日志数据采集组件包括Flume、Logstash、FileBeat。
一、Flume组件
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,是Apache下的一个孵化项目。
Flume具有完善的可靠性机制、故障转移和恢复机制,具有强大的容错能力。
Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
Flume的设计宗旨是向Hadoop集群批量导入基于事件的海量数据。系统中最核心的角色是agent,Flume采集系统就是由一个个agent所连接起来形成。每一个agent相当于一个数据传递员,内部有三个组件:
(1)source: 采集源,用于跟数据源对接获取数据.
(2)sink:传送数据的目的地,用于往下一级agent或者最终存储系统传递数据。
(3)channel:agent内部的数据传输通道,用于从source传输数据到sink。
二、Logstash组件
Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到存储库中。数据从源传输到存储库的过程中,Logstash 过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式,以便更轻松、更快速地分析和实现商业价值。
Logstash 现在是 ElasticSearch 家族成员之一。
logstash具有200多个插件,可以接受各种各样的数据(如日志、网络请求、关系型数据库、传感器或物联网等等)。
三、Filebeat组件
Filebeat是一个轻量级的日志采集工具,用于转发和集中日志数据. Filebeat作为代理安装在服务器上,监控指定的日志文件或目录,收集日志事件,并将它们转发到Elasticsearch或Logstash进行索引。
当开启Filebeat程序的时候,它会启动一个或多个探测器(prospectors)去检测你指定的日志目录或文件,对于探测器找出的每一个日志文件,Filebeat启动收割进程(harvester),每一个收割进程读取一个日志文件的新内容,并发送这些新的日志数据到处理程序(spooler),处理程序会集合这些事件,最后filebeat会发送集合的数据到你指定的地点。
Filebeat由两个主要组成部分组成:prospector和 harvesters。这些组件一起工作来读取文件并将事件数据发送到指定的output。
Harvesters:负责读取单个文件的内容。harvesters逐行读取每个文件,并将内容发送到output中。每个文件都将启动一个harvesters。harvesters负责文件的打开和关闭,这意味着harvesters运行时,文件会保持打开状态。如果在收集过程中,即使删除了这个文件或者是对文件进行重命名,Filebeat依然会继续对这个文件进行读取,这时候将会一直占用着文件所对应的磁盘空间,直到Harvester关闭。默认情况下,Filebeat会一直保持文件的开启状态,直到超过配置的close_inactive参数,Filebeat才会把Harvester关闭。
Prospector:负责管理Harvsters,并且找到所有需要进行读取的数据源。如果input type配置的是log类型,Prospector将会去配置路径下查找所有能匹配上的文件,然后为每一个文件创建一个Harvster。每个Prospector都运行在自己的Go routine里。
Filebeat目前支持两种Prospector类型:log和stdin。每个Prospector类型可以在配置文件定义多个。log Prospector将会检查每一个文件是否需要启动Harvster,启动的Harvster是否还在运行,或者是该文件是否被忽略(可以通过配置ignore_order,进行文件忽略)。如果是在Filebeat运行过程中新创建的文件,只要在Harvster关闭后,文件大小发生了变化,新文件才会被Prospector选择到。
四、Flume、Logstash、Filebeat组件对比
对比项 | Flume | Logstash | FileBeat |
来源 | Apache | Elastic | Elastic |
开发语言 | Java | Jruby | Go |
主要功能 | 从多种源端采集数据并可以输出到多种数据源 | 从多种源端采集数据并可以实时解析和转换并输出到多种数据源 | 数据采集传输 |
组件轻重 | 相对较重 | 相对较重 | 轻量级二进制文件 |
集群模式 | 分布式 | 单节点 | 单节点 |
内存消耗 | 高 | 高 | 低 |
CPU消耗 | 高 | 高 | 低 |
容错性 | 高(有事务机制) | 高(有持久化队列) | 无 |
负载均衡 | 支持 | 支持 | 支持 |
插件 | 丰富的输入输出插件 | 丰富的输入输出插件 | 只支持文本采集 |
数据过滤能力 | 自带分区和拦截器 | 强大的过滤功能 | 过滤功能较弱 |
进程管理 | 一台服务器可以起多个进程,挂了后手工拉起 | 一台服务器只允许起一个进程,挂了手工拉起 | 进程十分稳定 |
资料完整度 | 高 | 高 | 高 |
社区活跃度 | 高 | 高 | 高 |
二次开发难度 | 一般 | 困难 | 容易 |
五、日志采集组件总结
- 1. Flume更注重于数据的传输,对于数据的预处理不如Logstash。在传输上Flume比Logstash更可靠一些,因为数据会持久化在channel中。数据只有存储在sink端中,才会从channel中删除,这个过程是通过事物来控制的,保证了数据的可靠性。
- 2. Logstash是ELK组件中的一个,一般都是同ELK其它组件一起使用,更注重于数据的预处理,Logstash有比Flume丰富的插件可选,所以在扩展功能上比Flume全面。但Logstash内部没有persist queue,所以在异常情况下会出现数据丢失的问题。
- 3. Filebeat是一个轻量型日志采集工具,因为Filebeat是Elastic Stack的一部分,因此能够于ELK组件无缝协作。Filebeat占用的内存要比Logstash小很多。性能比较稳健,很少出现宕机。
下期将为大家介绍数据采集技术-数据库离线采集的各类技术组件,欢迎关注学习。