概述:

Apache Flume是一个分布式、可用的系统,用于从许多不同的sources有效的收集并移动大量日志数据用于集中存储数据。

架构及数据流动模型:

flume实际上就是一个Agent。Agent里面包含三大组件:Source、Channel、Sink。

Flume agent流动的数据单位为一个Event。一个Flume agent 是一个JVM进程,维持允许Events从一个外部source流动到一个外部目的地的组件。

Events被外部source(例如web server)发送到Source,被发送的Events要有特定的格式。例如,AvroSource可以用来接受来自客户端的Avro Events或者其他Flume agent。当Source接受Event时,Source存储Event进一个或多个Channels。该Channel是一个活的存储,保存Event直到它被Sink消费。Sink把Event从Channel中移除并把Event放进外部存储库,如HDFS。Source和Sink在Agent里面是异步运行的。

Client--开发自定义组件:

Client在events的来源地操作,并把获取到的events发送到Flume agent。Client通常在它们消耗数据的应用过程操作。Flume一般支持Avro,log4j,syslog,和Http POST(带有JSON body)作为途径方式去从转换来自外部Source的数据。在上图中的web server就相当于一个Client。

在条件无法满足的情况下,可以创建一个自定义机制发送数据给Flume。有两种实现方式:第一种是创建自定义client与Flume已存在的sources,如AvroSource或者SyslogTcpSource,联系交流。这里client需要把数据转换成Flume Sources能够识别的信息。另外一种是去编写自定义Flume Source,它能直接与你已存在的使用IPC或者RPC协议的client应用交流,然后转换client数据为Flume Events用于发送。

RPC client 接口

Flume的RpcClient接口的实现封装了flume支持的RPC机制。用户的应用可以简单的调用Flume Client SDK的append(Event)或者appendBatch(List<Event>)去发送数据,而不用担心底层消息交换的细节。用户提供要求的Event的方式有两种,一种是可以通过直接实现Event接口,如SimpleEvent类,二是通过使用EventBuilder的withBody()方法。

RPC clients - Avro和Thrift

Avro是默认的RPC协议,NettyAvroRpcClient和ThriftRpcClient实现RpcClient接口。client需要创建带有host和port的目标Flume agent,然后可以使用RpcClient发送数据到agent。

Flume Client (Avro Client)配置解析

① 分别给Channels、Sources、Sinks命名为c1、r1、k1;

②标明channels c1的类型,为memory内存存储;

③注明sources r1需要连接的channels为c1,然后标明sources r1的类型为avro,即client为avroClient类型,发送到source的数据格式为avro;其次把client的host和port写明;

④注明sinks k1需要连接的channels为c1,然后表明sinks类型为loggger存储方式。

事务接口:

事务接口是Flume可靠性的基础。全部的主要组件(如Sources,Sinks和Channels)必须使用Flume事务;

事务是在Channle实现过程中实现的。每一个Source和Sink连接到的Channel,其必须包含Transaction对象。Sources使用ChannelProcessor去管理Transactions,Sinks通过其配置的Channel管理Transactions。把event放进Channel或者从Channel移除event的操作是在一个活的Transaction中完成的。

Sink:

Sink的目的是把Events从Channel移除并把它们发送到下一个Flume Agent或者在外部存储库存储它们。一个Sink恰好连接一个Channels,在Flume配置文件中配置。有个SinkRunner实例连接每一个配置的Sink,当Flume框架调用SinkRunner.start(),一个新线程被创建去驱动Sink(使用SinkRunner.PollingRunner作为线程的Runnable)。这个线程管理Sink的生命周期。该Sink需要实现start()和stop()方法,这些方法是LifecycleAware的接口。Sink.start()方法应该初始化Sink和带它到一个能使Event前进到下一个目的地的状态。Sink.process()方法应该执行把Event从Channel移除并使它前进的核心进程。Sink.stop()方法应该执行必要的清除(如释放资源)

Source:

Source的目的是接收来自外部Client的数据和把它存储在配置好的Channels。Source可以通过它本身的ChannelProcessor得到一个实例,用来处理一个Event,并在Channel本地transaction提交。类似于SinkRunner.PollingRunner Runnable,有PollingRunner Runnable在一个新线程中执行,当Flume框架调用PollableSourceRunner.start(),该线程会被创建。每一个配置的PollableSource与它本来的运行一个PollingRunnable的线程关联。该线程管理PollableSource的生命周期,例如starting和stopping。一个PollableSource实现必须实现strat()和stop()方法,它们在LifecycleAware接口中声明。PollableSource运行调用Source的process()方法。process()方法应该检查新的数据并把它以Flume Events的形式存储在Channel中。注意这里有两种Sources。PollableSource已经被提及啦。另一种是EventDrivenSource。EventDrivenSource,不同于PollableSource,必须有它自己的调用机制去识别新数据并把新数据存在Channel。EventDrivenSources不是由它们本身的线程驱动的。

Channel:

暂无

flume1.8 开发指南学习感悟的更多相关文章

  1. HTML5移动Web开发指南-学习笔记(一)

    一,浏览器引擎    浏览器的内核引擎,基本上是四分天下: Trident: IE 以Trident 作为内核引擎; Gecko: Firefox 是基于 Gecko 开发; WebKit: Safa ...

  2. NODE.JS开发指南学习笔记

    1.Node.js是什么 Node.js是一个让JS运行在服务器端的开发平台,它可以作为服务器向用户提供服务.Node.js中的javascript只是Core javascript,或者说是ECMA ...

  3. NODE.JS开发指南学习笔记2

    1.核心模块 核心模块是Node.js的心脏,由一些精简高效的库组成,为其提供了基本的API.2.全局对象 global.所有的的全局变量都是其属性.其根本的作用是作为全局变量的宿主.3.全局变量 1 ...

  4. Three.js开发指南---学习使用几何体(第五章)

    一 基础几何体 1 二维图形:二维图形都是基于x和y轴构建的,即展示的形式就是他们都是“直立”的,如果希望这些二维图形躺下,则需要将几何体沿着x轴向后旋转1/4圈 mesh.rotation.x=-M ...

  5. 学习Nodejs:《Node.js开发指南》微博项目express2迁移至express4过程中填的坑

    <Node.js开发指南>项目地址https://github.com/BYVoid/microblog好不容易找到的基础版教程,但书中是基于express2的,而现在用的是express ...

  6. 智捷公开课马上开始了-欢迎大家一起讨论学习-第一系列读《Swift开发指南(修订版) 》看Swift视频教程

    引用: 智捷课堂携手51CTO学院.图灵教育联合举办iOS线上培训就业班系列体验公开课. 分享移动开发.移动设计方向最新,最热,最抢眼技术热点以及设计经验.我们每周将最少举办一次公开课,同时会提前安排 ...

  7. OAuth2.0学习(2-1)Spring Security OAuth2.0 开发指南

    开发指南:http://www.cnblogs.com/xingxueliao/p/5911292.html Spring OAuth2.0 提供者实现原理: Spring OAuth2.0提供者实际 ...

  8. Flutter开发进阶学习指南Flutter开发进阶学习指南

    Flutter 的起源 Flutter 的诞生其实比较有意思,Flutter 诞生于 Chrome 团队的一场内部实验, 谷歌的前端团队在把前端一些"乱七八糟"的规范去掉后,发现在 ...

  9. Jetty使用教程(四:21-22)—Jetty开发指南

    二十一.嵌入式开发 21.1 Jetty嵌入式开发HelloWorld 本章节将提供一些教程,通过Jetty API快速开发嵌入式代码 21.1.1 下载Jetty的jar包 Jetty目前已经把所有 ...

随机推荐

  1. MySQL锁总结

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/78 MySQL 锁基础 参考了何登成老师文章的结构MySQL 加 ...

  2. @Data 注解引出的 lombok 小辣椒

    今天在看代码的时候, 看到了这个注解, 之前都没有见过, 所以就查了下, 发现还是个不错的注解, 可以让代码更加简洁. 这个注解来自于 lombok,lombok 能够减少大量的模板代码,减少了在使用 ...

  3. LVM 详解

    一.前言<http://blog.chinaunix.net/uid-186064-id-2823296.html> LVM是逻辑卷管理(Logic Volume Manage)的简称,它 ...

  4. Lambda表达式补充

    l“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式树类型. lLambda 表达式的运算符 =>,该运算符读为“goes to”. l=> 运算符 ...

  5. jQuery知识盲点

    一.属性操作 元素的尺寸 width() height() innerWidth() innerHeight() outerWidth() outerHeight() $('div').width() ...

  6. 妙味课堂:JavaScript初级--第12课:json与数组

    1.json数据格式及json语法 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  7. 【原创】重复造轮子之高仿EntityFramework

    前言 在上一篇<[原创]打造基于Dapper的数据访问层>中,Dapper在应付多表自由关联.分组查询.匿名查询等应用场景时经常要手动写SQL语句.看着代码里满屏的红色SQL字符串,简直头 ...

  8. Effective Java 第三版——17. 最小化可变性

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  9. [补充资料] 手动搭建 Cloudera 集群

    本课主题 集群搭建 设置 Web 服务器 启动 ClouderManager 登入 Cloudera Manager 引言 这部份是一个补充资料,记录如何安装 Cloudera 服务器 集群搭建 查看 ...

  10. windows系统操作

    1.怎么更新补丁 有些软件的运行需要windows要安装相关的补丁,除了去微软官网下载补丁外,可以用windows自带的“系统更新”来完成,省去找补丁下载以及研究系统缺少哪些补丁. 控制面板--> ...