Flume 海量日志收集利器

关于日志收集

服务器日志收集

  • 服务器日志是大数据系统中最主要的数据来源之一
  • 服务器日志可能包含的信息
    • 访问信息
    • 系统信息
    • 其他业务信息
  • 基于服务器日志的应用
    • 业务仪表盘:PV、UV等
    • 线上查错:错误日志查询
    • 系统监控:调用链、接口访问统计等
    • 其他数据应用
  • 服务器日志的特点:
    • 不间断,流式产生
    • 数据量大,信息量大
    • 源头分散

日志采集系统的一般架构

Flume 海量日志收集利器

日志采集系统的设计要求

  • 系统可用性:采集系统自身的健壮性
  • 可扩展性:可以随着应用系统的规模及数据量的增加而线性扩展
  • 可靠性:不会丢失数据
  • 灵活性:支持多种数据源;支持多种处理方式;支持多种采集目的地;支持对数据的预处理

Flume简介

是什么?

  一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的系统。Cloudera公司出品。

角色

Flume 海量日志收集利器

版本

  1. Flume OG(original generation,2009年7月):分布式日志收集系统,有Master概念,依赖于Zookeeper,分为agent,collector,storage三种角色
  2. Flume NG(next generation,2011年10月):代码重构,功能精简,去掉master,collector角色,专注数据的收集与传递

Flume工作原理解析

组成

Flume 海量日志收集利器Flume Flow

  • Flow: 数据采集流程
  • Event: 消息处理的最小单位, 带有一个可选的消息头
  • Agent: 一个独立的Flume进程,包含组件Source、 Channel、 Sink
  • Source: 以event为单位接收信息,并确保信息被推送(push)到channel
  • Channel: 缓存信息, 确保信息在被sink处理前不会丢失
  • Sink:从channel中拉取(pull)并处理信息
  • Interceptor: event拦截器, 可以修改或丢弃event

处理流程
  source以event为单位从数据源接收信息, 然后保存到一个或多个channel中(可以经过一个或多个interceptor的预处理) , sink从channel中拉取并处理信息(保存, 丢弃或传递到下一个agent) , 然后通知channel删除信息。

安装

依赖:

  • jdk1.8

步骤:

  1. 下载安装包
  2. 解压
  3. 配置flume-env.sh : 设置JAVA_HOME
  4. 配置 agent: conf/flume-conf.properties
  5. 启动: $FLUME_HOME/bin/flume-ng agent -n a1 -c conf -f xxx.properties

配置模板

Flume 海量日志收集利器

工作原理解析

Flow类型

顺序流

Flume 海量日志收集利器

多对一聚合

Flume 海量日志收集利器

一对多路由

Flume 海量日志收集利器
配置
Flume 海量日志收集利器

负载均衡

Flume 海量日志收集利器配置
Flume 海量日志收集利器

工作流程

Source

Flume 海量日志收集利器

Channel

Flume 海量日志收集利器

Sink

Flume 海量日志收集利器

常见应用场景

场景一:离线日志收集

场景描述
收集服务器的用户访问日志,保存到Hadoop集群总,用于离线的计算与分析。

Flume方案
在服务器端配置flume agent, 其中:

  • Source采用Spooling Directory Source
  • Channel采用Memory Channel
  • Sink采用HDFS Sink

场景二:实时日志收集

场景描述
收集服务器的系统日志,发送给实时计算引擎进行实时处理。

Flume方案
在服务器端配置flume agent, 其中:

  • Source采用Spooling Directory Source或 Exec Source(tail –f xxx)
  • Channel采用Memory Channel
  • Sink采用Kafka Sink

场景三:系统日志收集

场景描述:
收集服务器的系统日志,保存到搜索引擎中,用于线上日志查询。

Flume方案
在服务器端配置flume agent, 其中:

  • Source采用Spooling Directory Source
  • Channel采用File Channel
  • Sink采用ElasticSearch Sink

部署架构图

Flume 海量日志收集利器

实例演示

其他方案

  • Logstash(ELK)
  • Scribe
  • Chukwa

Flume与Scribe对比

Flume 海量日志收集利器

Flume与Kafka

  • flume是一个即插即用的数据收集组件,只需添加一些配置即可使用;更易使用
  • kafka是一个高性能的分布式消息队列,需要自己编写生产端和消费段代码,扩展性和稳定性更好

经验分享

配置相关

  • Agent的配置中使用统一的命名规则
  • 在启动命令中添加“no-reload-conf”参数为true来取消自动加载配置文件功能
  • 基于配置中心读取统一的配置文件
  • 调大HdfsSink的batchSize, 增加吞吐量, 减少hdfs的flush次数
  • 适当调大HdfsSink的callTimeout, 避免不必要的超时错误

架构相关

  • 将 日志采集系统系统分成三层: 采集、 汇总和存储, 采集只管将数据发送 到汇总层, 处理逻辑由汇总层统一处理。 好处是简化采集点的管理
  • 采集点(source)不要直接接入应用系统中, 以免由于日志收集系统问题影响 应用系统

反思

  • flume的组成部分有哪些?
  • flume如何保证消息的可靠性?
  • 有哪些日志收集的场景, 一般采用什么方案?
  • 安装flume,部署flume agent, 实现如下场景:
  1. 将指定目录中不断增加的日志收集到hdfs中并测试大数据量下的收 集效率
  2. 由一个agent收集信息后发给第二个agent, 由第二个agent将信息写 入目的地
  3. 同一种source源, 同一种source源,根据信息的属性(比如IP地址) 将数据发送到不 同的channel

相关文章: