flume1.8 开发指南学习感悟
概述:
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 开发指南学习感悟的更多相关文章
- HTML5移动Web开发指南-学习笔记(一)
一,浏览器引擎 浏览器的内核引擎,基本上是四分天下: Trident: IE 以Trident 作为内核引擎; Gecko: Firefox 是基于 Gecko 开发; WebKit: Safa ...
- NODE.JS开发指南学习笔记
1.Node.js是什么 Node.js是一个让JS运行在服务器端的开发平台,它可以作为服务器向用户提供服务.Node.js中的javascript只是Core javascript,或者说是ECMA ...
- NODE.JS开发指南学习笔记2
1.核心模块 核心模块是Node.js的心脏,由一些精简高效的库组成,为其提供了基本的API.2.全局对象 global.所有的的全局变量都是其属性.其根本的作用是作为全局变量的宿主.3.全局变量 1 ...
- Three.js开发指南---学习使用几何体(第五章)
一 基础几何体 1 二维图形:二维图形都是基于x和y轴构建的,即展示的形式就是他们都是“直立”的,如果希望这些二维图形躺下,则需要将几何体沿着x轴向后旋转1/4圈 mesh.rotation.x=-M ...
- 学习Nodejs:《Node.js开发指南》微博项目express2迁移至express4过程中填的坑
<Node.js开发指南>项目地址https://github.com/BYVoid/microblog好不容易找到的基础版教程,但书中是基于express2的,而现在用的是express ...
- 智捷公开课马上开始了-欢迎大家一起讨论学习-第一系列读《Swift开发指南(修订版) 》看Swift视频教程
引用: 智捷课堂携手51CTO学院.图灵教育联合举办iOS线上培训就业班系列体验公开课. 分享移动开发.移动设计方向最新,最热,最抢眼技术热点以及设计经验.我们每周将最少举办一次公开课,同时会提前安排 ...
- OAuth2.0学习(2-1)Spring Security OAuth2.0 开发指南
开发指南:http://www.cnblogs.com/xingxueliao/p/5911292.html Spring OAuth2.0 提供者实现原理: Spring OAuth2.0提供者实际 ...
- Flutter开发进阶学习指南Flutter开发进阶学习指南
Flutter 的起源 Flutter 的诞生其实比较有意思,Flutter 诞生于 Chrome 团队的一场内部实验, 谷歌的前端团队在把前端一些"乱七八糟"的规范去掉后,发现在 ...
- Jetty使用教程(四:21-22)—Jetty开发指南
二十一.嵌入式开发 21.1 Jetty嵌入式开发HelloWorld 本章节将提供一些教程,通过Jetty API快速开发嵌入式代码 21.1.1 下载Jetty的jar包 Jetty目前已经把所有 ...
随机推荐
- linux命令(shell)
1.cat查看一个文件,linux默认bash 2.echo回显命令 3.ls 4.history历史记录,查看使用过的命令 5.根目录下文件目录 6.bin目录下内容多为应用程序和命令 7.boot ...
- tee 命令详解
作用:将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin . 简单的说就是把数据重定向给文件和屏幕上. 注意:存在缓存机制,每1024 字节输出一次, 若从管道接受数据 ...
- 5.前端基于react,后端基于.net core2.0的开发之路(5) 配置node层,session设置、获取,请求拦截
1.总结一下 今年,2月份从深圳来到广州,工作到现在,回头看,完成的项目4-5个,公司基本没有懂技术的领导,所以在技术选型上,我们非常的自由,所以内心一直都不满足现状,加上一起工作的小伙伴给力(哈哈哈 ...
- DCL的失效:现实与初衷的背离
最近看了Brian Goetz写的一篇有关DCL的文章:Double-checked locking: Clever, but broken.( 2001年发表于JavaWorld上) 这篇文章讲述了 ...
- MIG IP控制DDR3读写测试
本文设计思想采用明德扬至简设计法.在高速信号处理场合下,很短时间内就要缓存大量的数据,这时片内存储资源已经远远不够了.DDR SDRAM因其极高的性价比几乎是每一款中高档FPGA开发板的首选外部存储芯 ...
- 删除SVN版本信息的两种方式
一.在linux下删除SVN版本信息 删除这些目录是很简单的,命令如下 find . -type d -name ".svn"|xargs rm -rf 或者 find . -ty ...
- win10 音频服务未响应的解决方法
最近在调试usb audio设备,由于使用的是自己的audio 设备,所以要频繁的更换采样率,可是 在win10中经常出现一些莫名其妙的问题,今天这个问题就是折腾了我好久才搞定的. 当把usb aud ...
- Git添加远程库和从远程库中获取
一. Git添加远程库 1. 在本地新建一个文件夹,在该文件夹使用Git工具,运行$ git init,将该文件夹变为本地Git仓库,同时会生成一个隐藏的.git文件夹. 2. 在该文件夹中用Note ...
- zabbix 3.0.4 中文字体替换
zabbix 对中文支持不是很好,会出现乱码: 从windows系统里 找到字体包:如图: 拷贝到zabbix-server里面,注意,把文件名改成小写: 我linux 是centos7.2版本 [r ...
- 在开发中使用Mockito进行测试
关于单元测试的一些问题 当我们Javaweb项目中编写单元测试的时候,通常会面临一个普遍的问题:需要测试的类会有很多依赖,而这些依赖的类或者对象又会有很多别的依赖,导致我们在写单元测试的时候几乎需要把 ...