关于flume 的介绍 我是围绕三个方面来说的
是什么
去哪下
怎么玩
1. flume是什么
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。flume可以聚合大量日志数据并将其从许多不同的源移动到集中式数据存储中,并且,不仅限于日志数据聚合。由于数据源是可定制的,因此Flume可用于传输大量事件数据,包括但不限于网络流量数据,社交媒体生成的数据,电子邮件消息以及几乎所有可能的数据源。
flume就好比一个水泵,网上产生的数据就是各种各样的水。日志就是湖水,mysql数据就是海水,水泵都可以抽取他们,从一个地方到另一个地方。但是水泵经常是用来抽取湖水的,也就像flume经常用来抽取日志的,海水也能抽,但是不经常用。所以flume能抽取所有的数据,就好像水泵能抽取各种各样的水。
flume 主要的用途就是 实时读取服务器的本地磁盘的数据,上传到hdfs中去
2. flume去哪下
http://flume.apache.org/
我用的flume1.7版本
3. flume怎么玩
这里的内容都是参考官网
官网用户指导手册
3.1 架构
这张图是从官网上扣下来的。
- Agent
Agent是一个JVM进程,通过事件(event)的形式将数据从源头送至目的,是Flume数据传输的基本单元。可以看做一个 Agent就是一个flume实例。
Agent配置是 本地的配置文件里面,配置文件格式是 properties ,在一个配置文件中指定一个或多个代理的配置。配置文件中要配置source,sink,Channel。
Agent主要有3个部分组成,Source、Channel、Sink。 - Source
Source 输入源。负责接收数据到Flume Agent的组件。Source可以处理各种类型、各种格式的日志数据,Flume提供了下面的几种格式的source使用:官网source- avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy,自定义。
- Channel。
Channel 通道,也可以是缓冲区。位于Source和Sink之间的缓冲区。所以,Channel允许Source和Sink运作在不同的速率上。Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作。
Flume 有两种种Chanel- Memory Channel
Memory Channel是内存中的队列。Memory Channel在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。内存的肯定快 - File Channel
File Channel将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。但是这个比较慢 - JDBC Channel
event放在数据库里面 - Kafka Channel
event放在kafaka里面
下图是官网找的channel类型
- Memory Channel
- Sink
Sink 输出源,Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。
Sink就不断的从Chanel中取数据。输出到配置的目的地。
Flume提供了几种目的地 官网sink- hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定义。
除了上面的几个,flume在传递日志的时候,是按照一个特定的数据格式来传递的。叫做Event
- hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定义。
- Event
flume中的传输单元,Flume数据传输的基本单元,以事件的形式将数据从源头送至目的地。event有两部分组成
要注意 一行文本内容被反序列化成一个event。event的最大定义为2048字节,超过会被切割放到下一个event中- header。存放一些属性
- body 存放数据
到这里 FLume的基本组件就介绍完了。下面开始介绍FLume的可靠性
3.2 Flume可靠性(事务)
官网参考1,大体提一下
官网参考1,详细说明1
官网参考1,详细说明2
FLume 在source和sink阶段都是用事务
来保障可靠性。
- sink阶段,sink会将一大帮数据放在一个暂时的队列里面,将一个event 传输到配置的源头 之后,sink才会将channel中的event移除,出现了问题就回滚。
- source阶段,先把event提交到一个暂时的队列,在看channel中有没有地方,有就提交到channel中,没有就回滚
上图是官网的图
下面的图是我画的图;
3.3 简单入门(官网小例子)
前提说明。 最低jdk1.8
Flume监控本机44444端口,然后通过telnet工具向本机44444端口发送消息,最后Flume将监听的数据实时显示在控制台。
3.3.1 下载包
http://flume.apache.org/download.html
3.3.2 修改配置文件
- 将 conf下的flume-env.sh.template文件复制一份 名字改为flume-env.sh,并配置 JAVA_HOME
export JAVA_HOME= 自己的javaHome路径
3.3.3 写配置文件
- 自己在flume 的文件夹里面创建一个 文件夹 名字随便写,我这里叫
test
- 然后在 这个文件夹里面 创建一个文件 flume-telnet-logger.conf
# 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
配置文件来源于官方手册http://flume.apache.org/FlumeUserGuide.html
详细说明
3.3.4 启动
bin/flume-ng agent --conf conf/ --name a1 --conf-file test/flume-telnet-logger.conf -Dflume.root.logger=INFO,console
说明:
- bin/flume-ng : agent 执行flume文件夹下面bin文件夹下面的 flume-ng agent 命令。
- –conf conf/ : 表示配置文件存储在conf/目录
- -name a1 :表示给agent起名为a1
- -conf-file test/flume-telnet.conf :flume本次启动读取的配置文件是在test文件夹下的flume-telnet.conf文件
- -Dflume.root.logger==INFO,console :-D表示flume运行时动态修改flume.root.logger参数属性值,并将控制台日志打印级别设置为 INFO级别。日志级别包括:log、info、warn、error
启动成功图片
3.3.5 测试
- 测试44444端口
- 用telnet 连接44444端口 发送消息
- 看flume的输出
可以看出来flume其实大多数就是玩一个配置
- 用telnet 连接44444端口 发送消息