Flume 学习之路(一)Flume 概述和基本架构

作者:studytime
原文:https://www.studytime.xin/

Flume 简介

Flume 是什么?

Flume 是一个分布式、可靠且高可用的服务,用于有效地收集,聚合和移动大量日志数据。它具有基于流数据的简单灵活架构,良好的可靠性机制、故障转移和恢复机制,具有强大的容错性。它支持在系统中定制各类数据发送方,用于收集数据;同时Flume 提供对数据的简单处理,并具有写到各种数据接收方的能力。

image

Flume 发展历程?

Flume 最初是 Cloudera 开发的日志收集系统,受到了业界的认可与广泛应用,后来逐步演化成支持任何流式数据收集的通用系统。

Flume 目前存在两个版本:Flume OG(Original generation) 和 Flume NG (Next/New generation)。

其中 Flume OG 对应的是 Apache Flume 0.9.x 之前的版本,早期随着 FLume 功能的扩展,Flume OG 代码工程臃肿、核心组件设计不合理、核心配置不标准等缺点暴露出来,尤其是在 Flume OG 的最后一个发行版本 0.9.4. 中,日志传输不稳定的现象尤为严重,为了解决这些问题,2011 年 10 月 22 号,Cloudera 完成了 Flume-728,对 Flume 进行了里程碑式的改动,重构后的版本统称为 Flume NG(next generation)。同时此次改动后,Flume 也纳入了 apache 旗下。

Flume NG 在 OG的架构基础上做了调整,去掉了中心化组件 master 以及服务协调组件 Zookeeper,使得架构更加简单和容易部署。Flume NG 和 OG 是完全不兼容的,但沿袭了 OG 中的很多概念,包括Source,Sink等。

Flume 基本思想及特点

Flume 采用了插拔式软件架构,所有组件均是可插拔的,用户可以根据自己的需求定制每个组件。Flume 本质上我理解是一个中间件。

Flume 主要具有以下几个特点:

  1. 良好的扩展性;Flume 的架构是完全分布式的,没有任何中心化组件,使得其非常容易扩展。
  2. 高度定制化;采用插拔式架构,各组件插拔式配置,用户可以很容易的根据需求自由定义。
  3. 良好的可靠性;Flume 内置了事务支持,能保证发送的每条数据能够被下一跳收到而不丢失。
  4. 可恢复性;依赖于其核心组件channel,选择缓存类型为FileChannel,事件可持久化到本地文件系统中。

Flume NG 基本架构

Flume 的数据流是通过一系列称为 Agent 的组件构成的,Agent 为最小的独立运行单位。

image

从上图看出:一个 Agent 可以从客户端或前一个 Agent 接受数据,经过过滤(可选)、路由等操作,传递给下一个或多个 Agent,直到抵达指定的目标系统。用户可根据需求拼接任意多和 Agent 构成一个数据流流水线。

Flume 将数据流水线中传递的数据成为 Event;每个 Event 由头部和字节数组(数据内容)两部分构成,其中,头部由一系列key/value对构成,可用于数据路由;字节数组封装了实际要传递的数据内容,通常是由 avro,thrif,protobuf 等对象序列化而成。

Flume 中 Event 可有专门的客户端程序产生,这些客户端程序将要发送的数据封装成 Event 对象,调用 Flume 提供的 SDK 发送给 Agent。

Flume NG 基本架构之核心组件

Flume Agent 主要由三个组件构成,分别是 Source、channel、Sink。

主要作用和功能如下:

  1. Source

Flume 数据流中接受 Event 的组件,通常从 Client 程序或上一个 Agent 接受数据,并写入一个或多个 Channel。Flume 提供了多种 Source 实现。

不同类型的 Source:

  • 与系统集成的 Source: Syslog, Netcat
  • 自动生成事件的 Source: Exec
  • 监听文件夹下文件变化:Spooling Directory Source, Taildir Source
  • 用于 Agent 和 Agent 之间通信的IPC Source: Avro、Thrift
  1. Channel
    Channel 是一个缓存区,是连接 Source 和 Sink 的组件,它缓存 Source 写入的 Event,直到被 Sink 发送出去。

目前Flume主要提供了一下几种Channel:

  • Memory Channel:在内存队列中缓存 Event。该 Channel 具有非常高的性能,但出现故障后,内存中的数据会丢失,另外,内存不足时,可能导致Agent崩溃。
a1.channels = c1 
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

type:类型名称,memory
capacity:存放的Event最大数目,默认10000
transactionCapacity:每次事务中,从Source服务的数据,或写 入sink的数据(条数)
byteCapacityBufferPercentage:Header中数据的比例,默认20
byteCapacity:存储的最大数据量(byte)

  • File Channel:在磁盘文件中缓存 Event。该 Channel 弥补了 Memory Channel 的不足,但性能吞吐率有所下降
a1.channels = c1 
a1.channels.c1.type = file 
a1.channels.c1.checkpointDir = /mnt/flume/checkpoint 
a1.channels.c1.dataDirs = /mnt/flume/data

type:类型名称,file
checkpointDir:Checkpoint文件存放位置
dataDirs:数据目录,分隔符分割

  • JDBC Channel:支持 JDBC 驱动,进而可将 Event 写入数据库中。该 Channel 适用于对故障恢复要求较高的场景
  • KafKa Channel:在 KafKa 中缓存 Event。KafKa 提供了高容错性,允许可靠地缓存更多的数据,这为 Sink 重复读取 Channel 中的数据提供了可能
  1. Sink
    Sink 负责从 Channel 读取数据 ,并发送给下一个Agent的Source或者文件存储系统。

目前 Flume 主要提供了一下几种 Sink 实现:

  • Hdfs Sink:最常用的 Sink,负责将 Channel 中的数据写入HDFS
a1.channels = c1 
a1.sinks = k1 
a1.sinks.k1.type = hdfs 
a1.sinks.k1.channel = c1 
a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S 
a1.sinks.k1.hdfs.filePrefix = events
a1.sinks.k1.hdfs.round = true 
a1.sinks.k1.hdfs.roundValue = 10 
a1.sinks.k1.hdfs.roundUnit = minute 
#a1.sinks.k1.hdfs.codeC=gzip, bzip2, lzo, lzop, snappy 
#a1.sinks.k1.hdfs.fileType=SequenceFile, DataStream,CompressedStream

type:类型名称,hdfs
hdfs.path:HDFS目录
hdfs.filePrefix:Flume写入HDFS的文件前缀
hdfs.rollInterval:文件滚动时间间隔(单位:秒)
hdfs.rollSize:文件滚动大小(单位:byte)
hdfs.rollCount:hdfs.rollCount

  • HBase Sink:可将 Channel 中的数据写入 HBase,支持同步或者异步两种方式
a1.sinks = k1 
a1.sinks.k1.type = hbase 
a1.sinks.k1.table = foo_table 
a1.sinks.k1.columnFamily = bar_cf 
a1.sinks.k1.serializer = org.apache.flume.sink.hbase.RegexHbaseEventSerializer 
a1.sinks:.k1.channel = c1

type:类型名称,hbase
table:Hbase Table名称
Column family:Hbase Table中column family名称
zookeeperQuorum:Hbase中zookeeper地址,hbase-site.xml中的 hbase.zookeeper.quorum中参数值
znodeParent:hbase-site.xml中的zookeeper.znode.parent中参数值

  • Avro/Thrift Sink:内置了 Avro/Thrift 客户端 ,可将 Event 数据通过 Avro/Thrift 发送给指定的 Avro/Thrift 客户端
  • KafKa Sink:可将 Channel 中的数据写入 Kafka
  • Hive Sink :可将 Channel 中的数据写入 Hive
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • 时间真快,不知不觉中又到周五,2018年也接近尾声,生命、时间和爱,所以我们能做的就是去珍惜。珍惜当下的时光...
    丽娜_550e阅读 102评论 0 0
  • 一.winscp是什么 WinSCP 是一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户端...
    lemonzoey阅读 1,355评论 0 1