title: Flume分享
date: 2020-04-3 19:20:00
categories:

  • 技术
    tags:
  • 分享

整理、分享一下Flume

  1. 明白Flume的应用场景
  2. 能够使用Flume做基本的数据收集
  3. 了解Flume的基本设计原理
  4. 与我们的系统相互映照,从中吸取经验

一、Flume解决了什么问题

1.1 解决问题

数据收集是大数据的基石。
如何将 分散的、异构的数据 可靠地 转储到 数据中心 是需要解决的问题。

在可靠收集聚合的同时,屏蔽了 数据源 与 数据存储系统的异构性。

1.2 Flume特点

Apache Flume[1] is a distributed, reliable, and available system for efficiently collecting, aggregating and moving large amounts of log data from many different sources to a centralized data store.

The use of Apache Flume is not only restricted to log data aggregation. Since data sources are customizable, Flume can be used to transport massive quantities of event data including but not limited to network traffic data, social-media-generated data, email messages and pretty much any data source possible.

  • 可靠传输
  • 数据源可定制、扩展
  • 存储系统可定制、扩展

二、Flume结构拆解&快速开始

2.1 结构拆解

flume文件内容处理 flume数据处理_flume文件内容处理

  • source 负责数据的获取
  • channel 数据缓存,用于解决source与sink速度不匹配的问题。
  • sink 数据的消费,传递给下游
2.2 快速开始
前提
  • java Runtime Environment - Java 1.8 or later
  • 内存、硬盘和访问权限
下载

官网下载[2]

配置
# 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 = 44444

# 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 = 1000
a1.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
运行

bin/flume-ng agent --conf conf --conf-file ./conf/flume-conf.properties --name a1 -Dflume.root.logger=INFO,console

2.3 运用

在实际运用中,可以将Agent灵活组合业务需求。

场景一 传递

flume文件内容处理 flume数据处理_ci_02


场景二 汇聚

flume文件内容处理 flume数据处理_flume_03


场景三 多路复用

flume文件内容处理 flume数据处理_大数据_04

三、问题拆分,Flume如何解决上述问题

3.1 模型设计简介
  1. 抽象出传输信息的载体Event
  • 定义Event是Flume数据传输过程中的传输单元。
  • Event 由 Header 与 载有数据byte的 Body组成。
  • Header,可选,可以容纳key-value的无序结合
private Map<String, String> headers;
  private byte[] body;
  1. 数据采集&获取组件 source
  • 负责接收Event,并将Event放入Channel
  • 下图列出部分source类型
  1. 数据缓存组件 channel
  • 负责接收source传来的event,用于暂存数据,并交付给sink组件。其目的在于解决source与sink速度不匹配的问题。同时也提供持久化的方式。
  • channel支持事务性,每次从Channel中写入、读取都是在事务的上下文中发生的。
  1. 数据输出组件 sink
  • 负责将Event写入到下游系统
3.2 功能设计
Flume无数据丢失保证

利用了事务性语义,对Channel的操作都是基于事务性。
只有成功地发送到下一个Agent或目的地后Event才会从Channel中删除。这一步保证了Event数据流在Flume Agent中传输时端到端的可靠性。

Flume可以保证至少有一次被送到目的地

flume文件内容处理 flume数据处理_大数据_05

四、Flume给我们的启示

  • 模型设计合理,组件之间功能划分清晰
  • 无丢失保证,下游返回ACK,上游则可删除
  • 具有自动重载配置的能力
  • 具有负责均衡能力,Load-Balancing 和 FailOver 策略。
  • 可以自由组合agent形成其拓扑结构

五、附录

[1] 官网 http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html
[2] 下载地址 http://flume.apache.org/download.html