Flume官方文档阅读笔记及实际操作

欢迎来到Apache Flume

Flume是一个分布式的,高可靠的,高可用的,高性能的海量日志数据采集、聚合和传输的系统。它是基于数据流的简单的灵活的架构。它具有高鲁棒性并且有着可调节的可靠的故障恢复机制和许多的失效备援。它使用一个简单的可扩展的数据模型,该模型可适用于在线分析应用。

一丶概述

Apache Flume是一个分布式的可靠的可用的系统,该系统用于有效的采集,聚集和传输大量的日志数据,这些数据来源于许多不同的集中式数据存储目的地。`
Apache Flume的功能并不仅仅局限于日志数据的聚合。既然数据源是可定制的,Flume能够被用于传输大量的事件数据,包括但不局限于网络运输数据,社交媒体产生的数据,邮件信息和其他等等可能的数据源
Apache Flume在Apache Software Foundation是一个顶级的工程项目
目前有两个发行版本,0.9x版本和1.x版本
新老用户被鼓励使用1.x发行版本,以便于利用在最新的架构中改进的性能和更灵活的配置

二丶系统要求

1.java运行环境-Java1.8或之后的版本
2.内存-足够的内存用于配置source,channel和sink
3.硬盘空间-足够的硬盘空间用于channel或者sink使用
4.目录权限-允许agent读写权限

三丶数据流模型

一个Flume事件被定为一个数据流单元,该单元有着1字节的有效载荷和一些可选择的一串属性。一个Fulme用户代理是一个运行与java虚拟机上的进程,主持着事件从外部的数据源到下一个目的地(下一跳)。即Flume是一个JVM进程实例,控制管理着事件流的来源和目的地。
Flume的数据流模型有三个组件构成,分别为source,channelsink
source消耗着由外部数据源(例如web服务器)发送来的数据。外部数据源发送的数据的格式必须是目的Flume source所能识别的。例如,一个Avro Flume source能能够用于接收Avro的事件或者其他Flume代理(该代理必须发送来源于Avro sink的事件)。一个类似的流可以被定义为使用Thrift Flume Source接收来自Thrift sink或者Thrift RPC客户机或者由任何语言编写的遵循thrift协议的thrift客户机。当一个source接收到一个事件,source将存储该事件到一个或者多个channel中。channel被动的存储着事件直到事件被sink所消费。例如,文件channel是基于本地文件系统的。sink从channel中移出事件并将其放入一个外部的仓库中例如HDFS(通过HDFS sink放入),或者放入下一个Flume代理的source中(下一跳)。source和sink在一个特定的Flume代理中是异步执行的,都需要使用分期存储在channel中的事件。

重要概念释义:
flume Event:flume 事件,被定义为一个具有有效荷载的字节数据流和可选的字符串属性集。
flume Agent:flume 代理,是一个进程承载从外部源事件流到下一个目的地的过程。包含source channel 和 sink。
Source:数据源,消耗外部传递给他的事件,外部源将数据按照flume Source 能识别的格式将Flume 事件发送给flumeSource。
Channel:数据通道,是一个被动的存储,用来保持事件,直到由一个flume Sink消耗。
Sink:数据汇聚点,代表外部数据存放位置。发送flume event到指定的外部目标。

理解:类似于操作系统中的生产者消费者模型。channel是缓冲区,既可以是基于由操作系统提供的文件管理系统生成,也可以是其他形式(如数据库)。source从外部数据源中获取数据,存储到channel中。sink从channel从获取数据,并发送到外部仓库或者发送到下一跳的Flume代理的source中(作为整个流的过程的一个部分)。注意到虽然source和sink是异步执行的(即不相互影响,不等待同步应答),但是由于两者都要操作channle(即数据文件),该文件是临界资源,为了保持数据的完整性和一致性,source和sink对channle的操作必须是需要控制。另外,传递的事件的格式需要遵从一定的协议。如Avro就只能接受和发送来源于Avro source或者Avro sink的数据流,thirft就只能接受和发送遵从thirft协议的数据流。类似于计算机网络中协议的概念,协议定义了传输的数据的格式和接收或发送数据时所需采取的动作。事件类似于一个分组,含有一个字节的有效载荷和若干首部字段,首部字段有许多可选择属性字段,用于控制。总之,Flume是一个运行于JVM上的进程,该进程依赖于两个线程(source和sink)和一个数据存储结构(channle),遵循不同的Flume协议(如Avro和thift),发送和接收数据,将数据存于本地或者发送给下一跳(类似于路由选择算法的下一跳)

四丶复杂流动性

Flume允许用户创建进行多级流动的流,事件在到达目的地之前可以经过多种多样的Flume代理。Flume也允许用户定义扇入(多到一)和扇出流(一到多),基于上下文的路由选择和故障转移、失败处理 (如果路由到下一跳失败的话所采取的策略)

理解: 扇入(fan-in)和扇出(fan-out)原本是电子技术中电子元件及其输入端和输出端的结构。在软件工程中,扇入定义为一个模块被多个模板调用,扇出定义为一个模块调用多个模块。在Flume中,一个Flume代理类似于一个路由器,用户可以定义多级路由或者选择多种路由选择算法和路由失败时的默认处理。

五丶可靠性

在每一个Flume代理中,事件被存储于channel中。事件接下来将被发送至下一个代理或者临时的仓库(例如HDFS)中。当且仅当事件被存储于下一个代理或者仓库中后,才会从channel中移除。这就是Flume实现端到端单跳可靠数据传输的方式。
Flume采用事务型的方法Kauai保证事件的可靠交付。source和sink分别在一个事务中封装事件的存储和恢复,每个事件是由channel存储或者提供的。这保证了事件在流中的点对点可靠传输。在多级流动中,来自上一跳的sink和来自下一跳的source各自运行着他们的事务,以此来保证事件安全的存储于下一跳的channel中。
理解:Flume通过事务型的数据传递以及事件的删除机制(仅当成功传输完毕后才删除),来保证数据的可靠传输。source和sink独自的运行着自己的事务,以保证数据的安全性

六丶恢复性

事件存储于channle中,出现故障时可以恢复。Flume提供了一个持久的文件channel(基于本地文件系统的)。Flume也提供了内存channle,该channle仅仅简单的将数据存于内存中,这将更快但是如果代理进程出现故障的话数据不能恢复。
理解:Flume提供了两种channel手段,即channel可以以内存或文件的方式实现,内存更快,但是不可恢复,而文件虽然比较慢但提供了可恢复性。

七丶Flume配置

7.1 配置一个代理

Flume代理配置被存储于一个本地的配置文件。它是一个遵从java格式的文本文件。一个配置文件中可以配置多个Flume代理。配置文件中包含每个source,sink,channel的属性和它们是如何在流中关联到一起的

7.2 配置个人的组件

Flume每个组件(source,sink或者channel)都有名字,类型和一系列特殊的属性。例如,一个Avro source需要一个主机名称(或者ip地址)和一个端口地址来接收数据。一个内存channle需要指定能够有的最大的序列长度(称为capacity),一个HDFS sink需要知道文件系统的URI,创建文件的地址,文件旋转的频率。所有的这些组件的属性都需要在配置文件中设置

7.3 将各个组件组合在一起

Flume 代理为了构建流,需要知道载入哪个独立的组件并且知道他们是如何连接在一起的。完成这项任务需要列出每个组件的名称,和指定连接每对source和sink的channel。例如,假设有个,一个来源于Avro source的事件(叫做avroWeb),要传输到一个HDFS sink(叫做hdfs-cluster1),通过一个文件channel(叫做file-channel),那么配置文件需要包含这些组件的名称和将file-channel作为连接avriWeb source和hdfs-cluster1 sink的共享channel。

7.4 开启代理

Flume代理采用shell脚本(称为flume-ng,位于Flume distribution的bin目录中)开启。你需要在命令行中指定代理名称,配置文件目录和配置文件:

$bin/flume-ng agent -n $agent_name -c conf -f conf/flume-conf.properties.template

现在,代理将会根据给定的配置文件中的配置,开始运行

7.5 一个简单的实例

这里,我们给出一个简单的配置文件例子,描述一个单结点的Flume 部署。这个配置文件让用户生成事件随后记录他们到控制台中。

# example.conf: A single-node Flume configuration

# 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

该配置定义了一个叫做al的单结点代理。a1有一个source(监听端口44444),一个缓存数据到内存的channel和一个记录事件到控制台的sink。这个配置首先声明不同的组件,之后描述他们的类型和配置参数。一个给定的配置文件可以定义多个不同的代理。当一个代理进程被创建时,一个标识将被发送(用于显示哪一个代理正在运行)
根据上文给出的配置文件,我们可以按照下文来开启Flume

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

注意到,在一个完整的部署中,我们需要典型的多包括一个选项: –conf=. 将包含一个shell脚本flume-env.sh和可能包含一个log4j属性文件。在这个例子中,我们传递了一个java选项,让Flume将日志输出到控制台当中,并且我们没有使用用户环境脚本。
在另一个命令行中,我们能够telnet端口44444然后发送Flume一个事件:

$ telnet localhost 44444
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
Hello world! <ENTER>
OK

原来的终端将输出事件(以日志消息的形式)。
恭喜你,你已经成功配置和部署了一个Flume代理,后面的章节仅仅包含更多的代理配置细节。
运行过程和结果如下:

7.5.1 从官网下载源文件:

这里写图片描述

7.5.2 解压,在在解压后的文件apache-flume-1.7.0-bin/conf下创建一个example.conf,内容如上文所述:

这里写图片描述

7.5.3运行cmd, 进入到apache-flume-1.7-0-bin\bin目录下,运行上文的命令。

这里写图片描述
将显示:
这里写图片描述

7.5.4 打开另一个cmd,输入telnet localhost 44444,连接成功后将变成输出状态,输入hello world

这里写图片描述
同时,源cmd端口将以日志的形式显示结果:
这里写图片描述

7.6 在配置文件中使用环境变量

Flume有能力在配置文件中替代环境变量,例如:

 a1.sources = r1
 a1.sources.r1.type = netcat
 a1.sources.r1.bind = 0.0.0.0
 a1.sources.r1.port = ${NC_PORT}
 a1.sources.r1.channels = c1

注意:一般只能对值进行操作,不能对变量操作(也就是说,只能放在等式的右边)
这可以通过java system的特质来完成。上文仅仅是一个例子,配置环境变量可以采用其他方式,例如在conf/flume-env.sh中配置。

7.7 记录原始数据

通过管道摄取来记录原始的数据流,这并不是许多生产环境所需求的行为,因为这可能导致泄露敏感数据或安全相关的配置(例如密钥)。缺省条件下,Flume并不会记录这些信息。另一方面,如果数据管道破损了,Flume将会企业提供线索来调试问题。
一个用事件管道来调试问题的方式是设置一个附加的Memory Channel 关联Logger Sink,这将会输出所有的事件数据到Flume日志中。然而,在某些情况下,这方法是不足的。
为了确保记录事件和配置相关数据,一些Java系统属性必须被配置(除了log4j属性)
为了记录配置相关的记录,设置Java系统属性

Dorg.apache.flume.log.printconfig=true

这既可以在命令行中设置,也可以在flume-env.sh.中配置JAVA_OPTS变量
为了记录数据记录,设置Java系统属性:

 Dorg.apache.flume.log.rawdata=true

设置方式和上文所述相同。对于大多数的组件,log4j日志级别必须设置调试或者追踪,来确保事件相关的日志出现在Flume记录中。
下面是一个既允许配置记录和原始数据记录,又设置了log4j日志等级的DEBUG(输出在控制台中):

$ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=DEBUG,console -Dorg.apache.flume.log.printconfig=true -Dorg.apache.flume.log.rawdata=true

7.8 安装第三方插件

Flume有着完整的基于插件的架构,有着许多即插即用的source,channel,sink,序列化器,也有许多实现是和Flume分离的。
在flueme-env.sh中添加用户自己的包到FLUME_CLASSPATH 变量中,来实现定制的Flume组件是可行的,Flume现在支持一个特殊的目录(称为plugins.d),它会自动的拾取插件(只要这个插件是按特别的格式打包的)。这使得更方便的插件包管理以及更简单的调试以排除故障和寻找故障(尤其是类库依赖冲突)

7.8.1 plugins.d目录

plugins.d目录存在于

  $FLUME_HOME/plugins.d

在Java启动时,flume-ng运行脚本,寻找位于plugins.d目录下符合特定格式并且放于恰当的路径下的的插件

7.8.2 插件目录布局

每个插件(是plugins.d的子目录下)能够有三个子目录:
1.lib-插件的包(jar)
2.libext-插件所依赖的包
3.native-任何所需的本地库,例如.so文件
下面是一个插件目录结构的例子(插件位于plugins.d目录下):

plugins.d/
plugins.d/custom-source-1/
plugins.d/custom-source-1/lib/my-source.jar
plugins.d/custom-source-1/libext/spring-core-2.5.6.jar
plugins.d/custo
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值