博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
flume1.8 开发指南学习感悟
阅读量:4089 次
发布时间:2019-05-25

本文共 2873 字,大约阅读时间需要 9 分钟。

概述:

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:

暂无

转载地址:http://oycii.baihongyu.com/

你可能感兴趣的文章
不要再被 Python 洗脑了!!
查看>>
架构师技术文档:Redis+Nginx+Spring全家桶+Dubbo精选
查看>>
真强啊!建议每一个打算学Java的人都来看看!
查看>>
别学前端了!前端程序员:凭啥??网友:来钱太快你会飘!
查看>>
程序员会懂的冷笑话:各大编程语言的内心独白
查看>>
七夕 | 程序员:别爱我,没结果
查看>>
前端技术永不过时!前华为工程师:你以为的鸡汤,实际是砒霜!
查看>>
为何字节跳动、腾讯、阿里、滴滴都要用Python?
查看>>
Vue3.0 备受热捧!2020 前端开发进阶必读
查看>>
没错!CSDN 要对 Python 下手了!
查看>>
给互联网巨头搬砖的Java程序员
查看>>
“编程能力差!90%输在这点上!”谷歌AI专家:其实都是瞎努力!
查看>>
干货| Python 只用一行代码,可以实现哪些事儿?
查看>>
坦白讲!90%的数据分析师都不合格!!
查看>>
2020年,对薪资不满意的程序员要注意了...
查看>>
TIOBE 排名的第一的编程语言,竟然有人说它要“失宠”了!
查看>>
千万级实时数据处理系统是如何设计的? (免费领取源码)
查看>>
为什么字节跳动、腾讯、阿里都在用Python??
查看>>
阿里副总裁人设“翻车”:30 岁成 AI 顶尖科学家,但我很懒
查看>>
小白想靠编程赚钱,这个野路子你一定要知道
查看>>