Flume - 各模块介绍

本文介绍了Flume数据流框架的核心组件,包括Agent、Source、Channel和Sink的工作原理及其配置方式。同时,还探讨了Flume如何确保数据传输的可靠性和可恢复性,并列举了Flume支持的各种Source、Sink和Channel类型。

简介

Flume是一个分布式,可靠的,可以用来有效的收集,聚合和移动大的日志数据的可用服务。它是一个基于数据流的简单且灵活的框架。采用可调可靠性机制和多种故障转移及恢复机制保证很好的稳健性和容错性。它使用了一个简单的可扩展的数据模型,允许在线分析应用。data flow(数据流)是Flume最重要的抽象,data flow描述了从数据产生,传输、处理并最终写入目标路径。下图描述了Flume重要的几个组件:

结合上图,Flume的一些核心组件

 

组件功能
Web Server数据产生的源头。
AgentFlume的核心就是Agent 。Agent是一个Java进程,且运行在日志收集端,通过Agent接收日志,然后暂存起来,再发送到目的地。
SourceAgent核心组件之一,Source(源)用于从Web Server收集数据,然后发送到Channel(通道)。
ChannelAgent核心组件之一,Channel(通道)可以用来从Source接收数据,然后发送到Sink,Channel存放零时数据,有点类似队列一样。
SinkAgent核心组件之一,Sink(接收器)用来把数据发送的目标地点,如上图放到HDFS中。
Event整个数据传输过程中,流动的对象都是实现了org.apache.flume.Event接口的对象。Event也是事务保证的级别。
   Flow   Event从源点到达目的点的迁移的抽象

注:Flume支持多个Agent,支持扇入(fan-in)、扇出(fan-out)。

 

系统要求

1,java运行时环境--Java 1.6或者更晚的(建议Java 1.7)

2,内存 - 使用Sources,Channels或者Sinks要配置足够的内存。

3,硬盘空间 - 使用Channels和Sinks要配置足够的硬盘空间。

4,目录权限 - 被Agent使用的目录必须要有读和写的权限。

官方网站:http://flume.apache.org/
用户文档:http://flume.apache.org/FlumeUserGuide.html
开发文档:http://flume.apache.org/FlumeDeveloperGuide.html

数据流模型

Flume Event被定义为一个字节的有效载荷以及以及一个可选的字符串属性集。Flume Source接收来自外部源的数据(比如:Web Server)。Flume的数据流由Event贯穿始终。事件是Flume的基本数据单元,当Source捕获事件后会进行特定的格式化,然后Source会把Event推送到一个或多个Channel中,可以把Channel看作是一个缓冲区或者一个队列,它将保存事件直到Sink处理完该事件。Sink负责持久化日志或者把事件推向另一个Source。

Flume提供了大量内置的Source、Channel和Sink类型。不同类型的Source,Channel和Sink可以自由组合。也可以自定义Source,Channel和Sink。关于这三者的组合关系是很灵活的,下面我们看下几幅图:

多级代理:

multi-hop模式:事件在到达最终目的地之前通过多个Agent

合并:

Multiplexing:

Flume支持multiplexing Event到一个或者多个目的地,它通过多路复用器将Event复制或者选择性的路由到一个或多个Channel。

上图的示例,名称为“foo”的Agent,Source会Fan out到三个Channel中,Fan out的方式分为replicating和multiplexing。如果采用replicating方式,那么每个Event会发到这三个Channel中,如果采用multiplexing方式,它是根据Event的属性来路由,然后发送到指定的Channel中。

注:一个sink只能接收一个Channel发过来的数据

下面我们分别举两个例子:

replicating:

 

# List the sources, sinks and channels for the agent
<Agent>.sources = <Source1>
<Agent>.sinks = <Sink1> <Sink2>
<Agent>.channels = <Channel1> <Channel2>

# set list of channels for source (separated by space)
<Agent>.sources.<Source1>.channels = <Channel1> <Channel2>

# set channel for sinks
<Agent>.sinks.<Sink1>.channel = <Channel1>
<Agent>.sinks.<Sink2>.channel = <Channel2>

<Agent>.sources.<Source1>.selector.type = replicating

replicating是将Event发送到所有的Channel。

 

multiplexing:

 

# Mapping for multiplexing selector
<Agent>.sources.<Source1>.selector.type = multiplexing
<Agent>.sources.<Source1>.selector.header = <someHeader>
<Agent>.sources.<Source1>.selector.mapping.<Value1> = <Channel1>
<Agent>.sources.<Source1>.selector.mapping.<Value2> = <Channel1> <Channel2>
<Agent>.sources.<Source1>.selector.mapping.<Value3> = <Channel2>
#...

<Agent>.sources.<Source1>.selector.default = <Channel2>

multiplexing是根据header的值来路由的,根据上面的例子,如果Event header的<someHeader>属性值为Value1的话,就发送Channel1,如果属性值为Value2的话就发送到Channel1,和Channel2,如果属性值为Value3的话,就发送到Channel2中,其他的都发送到Channel2.

 

 

可靠性

Event是分阶梯传送的,从Source->Channel->Sink的,Event最终传送到下一个Agent或下一个终端资源库(例如HDFS,文件系统等),在传送打到后,Event在Channel中删除。

end-to-end指的是:在删除Channel中的Event时,保证Event已经传递到了下一个Agent或者终端资源库,但是这里没有提到Source进入到Channel之前如果保证不丢失。具体的可以看下每个Source的实现。

Flume采用了事务的方式来保证Event的可靠性传输,保证Event集合在点对点的传输是可靠的。

 

可恢复性

事件在Channel是分阶梯,管理从失败中恢复。Flume支持持久化到本地文件系统中(即:FileChannel,但是性能不佳)。Memory Channel只是存储Event到内存的队列中,性能很好,但是当Agent挂掉,内存中的Event是不能够被恢复的。

 

安装第三方插件

Flume是完全基于插件的框架,Flume有多种Sources,Channels,Sinks,Serializers。

虽然可以包括自定义Flume组件,但是加入他们所需的jars到conf/flume-env.sh文件中FLUME_CLASSPATH变量中,Flume现在支持一种特殊的目录结构叫做:plugins.d,它有特殊的格式,这样的话Flume可以自动的启用插件。这样就可以很容易的管理插件包装的问题,也方便调试和排除故障,特别是Lib包冲突的问题。

plugins.d目录

plugins.d目录位于$FLUME_HOME/plugins.d。在启动的时候,flume-ng启动脚本会检查 plugins.d 目录的插件确保符合下面的格式,并且包含了正确的路径。

插件目录布局

每个在 plugins.d 内的插件,最多包含三个子目录。

1,lib - 插件的JAR。

2,libext  - 插件依赖JAR(S)

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/custom-source-2/
plugins.d/custom-source-2/lib/custom.jar
plugins.d/custom-source-2/native/gettext.so

基于Zookeeper的配置

 

Flume支持Agent的配置信息通过Zookeeper,但是这个是一个实验性的功能,不建议在生产环境使用。这个配置文件需要上传到Zookeeper中,这个配置文件将储存在Zookeeper的节点下,下面看Agent a1和a2在zookeeper的结构:

 

- /flume
 |- /a1 [Agent config file]
 |- /a2 [Agent config file]

配置文件上传后,使用如下参数启动Agent:

 

 

$ bin/flume-ng agent –conf conf -z zkhost:2181,zkhost1:2181 -p /flume –name a1 -Dflume.root.logger=INFO,console
参数名称默认描述
zZookeeper服务器列表,格式是hostname:port,用逗号分隔
p/flumeZookeeper存储Agent配置文件的路径。

详情查看: Flume采用zookeeper管理配置

 

Flume Sources

名称描述
Avro Source监听Avro端口并且从外部Avro客户端接收Event。
Thrift Source监听Thrift端口并且从外部Thrift客户端接收Event。
Exec Source运行Unix命令,预计能产生持续的输出()
JMS Source从JMS的queue或者topic读取数据
Spooling Directory Source监测配置的目录下新增的文件,并将文件中的数据读取出来,可实现准实时。
Kafka Source作为一个消费者,从Apache Kafka的topic读取消息。
NetCat Source监听指定端口,将每一行封装成一个Event。
Sequence Generator Source一个简单的序列生成器,从0开始,每次增加1,主要用于测试。
Syslog TCP Source读取syslog消息并且生成Flume的Event,TCP每个Event用'n'分割
Multiport Syslog TCP Source这个是最新,最快,多端口版本的Syslog TCP Source。
Syslog UDP Source读取syslog消息并且生成Flume的Event,每个输入信息当成一个Event
HTTP Source接受HTTP的GET或者POST数据,GET是实验性质的,不建议使用。支持JSON、BLOB表示形式
Stress Source是一个内部负载生成源,用来做压力测试是非常有用的
Avro Legacy Source允许Flume 1.x的Agent从Flume 0.9.4的Agent中获取数据,它接受0.9.4的Event,并且转化成1.x
Thrift Legacy Source和Avro Legacy Source雷同
Scribe Source 

Flume Sinks

名称描述
HDFS Sink将数据写入到HDFS
Hive Sink将文本或者JSON数据用分隔符分割,直接变成Hive的表,或者是分区
Logger Sink记录Event的Info级别日志,通常用于测试或调试。
Avro Sink采用Avro Sink接收到的Event,发送到另外一个Avro Source
Thrift Sink采用Thrift Sink接收到的Event,发送到另外一个Thrift Source
IRC Sink从附加的Channel获取数据,转发到配置中的IRC的目的地。IRC(类似于网络聊天室的服务)
File Roll Sink将Event存放到本地文件系统,根据时间或者大小生成文件。
Null Sink丢弃所有从Channel获取的Event。
HBaseSink写入数据到Hbase
AsyncHBaseSink采用异步的形式写入数据到Hbase
MorphlineSolrSink将数据写入Solr集群
ElasticSearchSink将数据写入ElasticSearch集群
Kafka Sink将数据写入Kafka集群

Flume Channels

名称描述
Memory Channel储存Event在内存队列中,如果宕机可能会造成数据的丢失,具有很高的吞吐量。
JDBC Channel将Event储存在持久化的数据库中,目前支持嵌入式的Derby。
Kafka Channel将Event储存在Kafka集群(必须单独部署),Kafka提供了高可用和复制性,所以Kafka或者Agent崩溃,数据也不会丢失。
File Channel将Event持久化在本地文件系统里(性能较差),但是可以保证数据不丢失。
Spillable Memory ChannelEvent数据存储在内存中和磁盘上,当内存队列满了,会持久化到磁盘文件(当前试验性的,不建议生产环境使用)
Pseudo Transaction Channel仅用于单元测试,不能用于生产环境。

### 验证 Flume 安装路径和版本信息 #### 方法一:验证 Flume 安装路径 Flume 的安装路径通常由用户自行定义,在标准情况下可能位于 `/opt` 或 `/usr/local` 下。可以通过以下方式确认 Flume 的实际安装位置: 1. **查找 Flume 主目录** 运行以下命令以搜索系统中是否存在 Flume 的安装包: ```bash find / -name "apache-flume-*" 2>/dev/null ``` 此命令会遍历整个文件系统,寻找名称匹配的 Flume 目录。 2. **检查 bin 目录下的 flume-ng 文件** 如果找到了 Flume 的主目录(假设为 `/opt/apache-flume-1.9.0-bin`),则进一步验证 `bin` 子目录下是否有 `flume-ng` 可执行文件: ```bash ls /opt/apache-flume-1.9.0-bin/bin/flume-ng ``` 若该文件存在,则表示 Flume 已正确解压并准备好使用[^1]。 3. **获取 Flume 版本信息** 使用以下命令可以直接查询 Flume 的版本号: ```bash /opt/apache-flume-1.9.0-bin/bin/flume-ng version ``` 输出示例: ``` Apache Flume 1.9.0 ``` --- ### 确认 OpenJDK 21.0.6 在 Ubuntu 系统中的兼容性 #### 方法一:了解 Flume 对 Java 的需求 根据官方文档,Apache Flume 1.9.0 推荐使用 JDK 8 或更高版本作为运行环境。然而,某些功能模块可能存在对较新 JVM 功能的支持不足的情况。OpenJDK 21 属于长期支持计划外的新版 JDK,理论上可以满足基本运行条件,但在生产环境中可能会引发未知问题[^2]。 #### 方法二:测试当前 Java 版本是否适配 尽管 OpenJDK 21 是最新稳定版本之一,仍需确保其与 Flume 的完全兼容性。可通过以下步骤验证: 1. **加载 Flume 并观察日志输出** 启动 Flume Agent 并记录控制台反馈: ```bash /opt/apache-flume-1.9.0-bin/bin/flume-ng agent \ --conf ./conf \ --name agent \ --conf-file ./conf/flume-conf.properties.template ``` 如果启动过程中未抛出任何关于类加载失败或依赖冲突的日志消息,则表明当前 Java 版本可被接受。 2. **强制回退至推荐版本** 若要消除潜在风险,建议切换至更稳定的 OpenJDK 8 或 OpenJDK 11。例如: ```bash sudo apt-get install openjdk-11-jdk export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH ``` --- ### 示例代码 以下是一段用于自动检测 Flume 和 Java 兼容性的 Bash 脚本: ```bash #!/bin/bash # 检测 Flume 安装路径 FLUME_PATH=$(find / -name "apache-flume-*" 2>/dev/null | head -n 1) if [[ -z "$FLUME_PATH" ]]; then echo "Flume installation not found." exit 1 fi echo "Detected Flume Path: $FLUME_PATH" # 验证 flume-ng 文件 FLUME_BIN="$FLUME_PATH/bin/flume-ng" if [[ -f "$FLUME_BIN" ]]; then echo "flume-ng file exists at: $FLUME_BIN" else echo "Error: flume-ng binary missing." exit 1 fi # 获取 Flume 版本 FLUME_VERSION=$($FLUME_BIN version 2>/dev/null) if [[ $? -eq 0 ]]; then echo "Flume Version: $FLUME_VERSION" else echo "Failed to retrieve Flume version." fi # 检查 Java 版本 JAVA_VERSION=$(java -version 2>&1 | grep "openjdk version" | cut -d'"' -f2) echo "Current Java Version: $JAVA_VERSION" # 判断兼容性 case "$JAVA_VERSION" in 1.8*|11*) echo "Java version is compatible with Flume." ;; *) echo "Warning: Java version may cause compatibility issues." esac ``` --- ### 结论 通过上述方法可以有效验证 Flume 的安装状态及其与 OpenJDK 21.0.6 的兼容性。虽然 OpenJDK 21 符合最低要求,但从稳定性角度出发,建议优先选用 OpenJDK 8 或 OpenJDK 11。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值