CSDN话题挑战赛第2期
参赛话题:大数据学习成长记录
目录
一、引入
Flume是什么
Flume能干什么
Flume的特点
Flume的版本
Flume OG到Flume NG
Flume 的特性
二、Flume NG 详解
Flume 架构组成
三、Flume安装
准备工作
正式安装
配置文件
验证安装
四、Flume使用测试
单机测试
监控端口数据到控制台(netcat-memeory-logger)
测试
集群测试
参考资料
Flume(日志收集系统)是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
提供从固定目录下采集日志信息到目的地(HDFS,HBase,Kafka)能力。
提供实时采集日志信息(taidir)到目的地的能力。
FLume支持级联(多个Flume对接起来),合并数据的能力。
Flume支持按照用户定制采集数据的能力。
总结起来就是实现了日志统一收集再放置于自定义目录的功能。
FLUM OG(初代):
FLUM OG 有三种角色的节点:代理节点(agent)、收集节点(collector)、主节点(master)。
agent 从各个数据源收集日志数据,将收集到的数据集中到 Collector,然后由收集节点汇总存入 HDFS。master 负责管理 agent,collector 的活动。
agent、collector 都称为 node,node 的角色根据配置的不同分为 logical node(逻辑节点)、physical node(物理节点)。
agent、collector 由 source、sink 组成,代表在当前节点数据是从 source 传送到 sink。
Flume NG 取消了集中管理配置的 Master 和 Zookeeper,变为一个纯粹的传输工具。Flume NG 另一个主要的不同点是读入数据和写出数据现在由不同的工作线程处理(称为Runner)。在 Flume OG 中,读入线程同样做写出工作(除了故障重试),如果写出慢的话(不是完全失败),它将阻塞 Flume 接收数据的能力。这种异步的设计使读入线程可以顺畅的工作而无需关注下游的任何问题。
FLUME NG(二代)
NG 只有一种角色的节点:代理节点(agent)。
没有 collector、master 节点,这是核心组件最核心的变化。
去除了 physical nodes、logical nodes 的概念和相关内容。
agent 节点的组成也发生了变化。Flume NG 的 agent 由 source、sink、Channel 组成。
flume ng 节点组成图:
多 Agent 并联下的架构图:
flume 的数据流由事件(Event)贯穿始终。事件是 Flume 的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些 Event 由 Agent 外部的 Source 生成,当 Source 捕获事件后会进行特定的格式化,然后 Source 会把事件推入(单个或多个) Channel 中。可以把 Channel 看作是一个缓冲区,它将保存事件直到 Sink 处理完该事件。
Sink 负责持久化日志或者把事件推向另一个 Source。
flume 具备高可靠性:
当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume提供了三种级别的可靠性保障,从强到弱依次分别为:
end-to-end:收到数据agent首先将event写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送。
Store on failure:这也是scribe采用的策略,当数据接收方crash崩溃时,将数据写到本地,待恢复后,继续发送。
Best effort:数据发送到接收方后,不会进行确认。
source:数据的输入方式,它是数据的收集端,负责将数据捕获后进行特殊的格式化,将数据封装到event里,然后将event推入channel中。Flume中内置了很多source支持avro、log4j,syslog和http。可以让应用程序可以直接和source打交道,如果内置source无法满足需求,flume还可以自定义source。
常用的自定义source如下:
channel:用来缓存从source传输过来的数据,并形成一个个event,等待sink来拿。它相当于一个缓存区,可以将事件暂存到内存中也可以持久化到磁盘上直到sink处理完该事件。
Channel类型
Sink:从Channel收集数据,运行在一个独立线程
用于把数据发送到目的地的组件目的地包括 hdfs、logger、avro、thrift、ipc、file、null、hbase、solr、自定义。
Sink类型
interceptor:拦截器
当我们需要对数据进行过滤时,除了我们在 Source 、 Channel 和 Sink 进行代码修改之外, Flume为我们提供了拦截器,拦截器也是 chain 形式的,当我们为source指定好拦截器的时候,我们的拦截器会得到event,根据需求我们可以对event进行保留还是抛弃,被抛弃的event不会进入到channel中。
拦截器类型
下载flume安装包
地址:Flume 1.10.1 User Guide — Apache Flume
上传安装包到node001节点
解压
再安装包目录执行:tar -zxvf apache-flume-1.10.1-bin.tar.gz -C /opt/
改名
mv /opt/apache-flume-1.10.1-bin/ /opt/flume-1.10.1
环境配置
终端输入:vim /etc/profile
末行加入:
export FLUME_HOME=/opt/flume-1.10.1
export PATH=$PATH:$FLUME_HOME/bin
重新加载配置文件
终端输入:source /etc/profile
flume-env.sh配置文件
复制模板
终端输入:cp /opt/flume-1.10.1/conf/flume-env.sh.template /opt/flume-1.10.1/conf/flume-env.sh #将/opt/flume-1.10.1/conf/下的flume-env.sh模板复制一份
修改配置文件
终端输入:vim /opt/flume-1.10.1/conf/flume-env.sh
末行加入:
export JAVA_HOME=/usr/java/jdk1.8.0_231-amd64/
终端输入:flume-ng version
出现版本信息就表示安装成功了。
创建flume配置文件目录
终端输入:mkdir -p /bdp/conf/flume
创建配置文件:vim /bdp/conf/flume/example-netcat.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
提示:Memory Chanel 配置
该配置来源于官网:
进入配置文件目录:cd /bdp/conf/flume/
使用该配置文件启动flume:flume-ng agent -n a1 -f example-netcat.conf -Dflume .root.logger=INF0, console
看到这块就表示启动成功了。
下载telnet工作
再开一个shell终端输入:yum install telnet
进入44444端口:telnet localhost 44444
接下来在44444端口输入信息而在node001的终端都会打印出响应信息:
实现的功能是:将node001flume.txt文件中的内容发送到node002并打印出来
将node001配置好的flume分发到node002和node003:
分发到node002:scp -r /opt/flume-1.10.1/ node002:/opt/
分发到node003:scp -r /opt/flume-1.10.1/ node003:/opt/
将profile文件分发到node002和node003:
分发到node002:scp -r /etc/profile node002:/etc/ profile
分发到node003:scp -r /etc/profile node003:/etc/ profile
重新加载配置文件:
ssh root@node002 "source /etc/profile" # 重新加载node002 配置文件
ssh root@node003 "source /etc/profile" # 重新加载node0023配置文件
创建flume配置文件(node002与node003需要先创建/bdp/conf/flume目录)
node001,node002,node003终端输入:vim /bdp/conf/flume/example-avro.conf
node001添加如下配置:
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /root/flume.txt
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = node002
a1.sinks.k1.port = 45454
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1888
a1.channels.c1.transactionCapacity = 180
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
node002添加如下配置:
a2.sources = r1
a2.sinks = k1
a2.channels = c1
a2.sources.r1.type = avro
a2.sources.r1.bind = node002
a2.sources.r1.port = 45454
a2.sinks.k1.type = logger
a2.channels.c1.type = memory
a2.channels.c1.capacity =1000
a2.channels.c1.transactionCapacity = 108
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1
在node001创建一个flume文件:vim flume.txt # 然后随便在这个文件中写点什么东西
aaaaa
bbbbbbbbbb
ddddddddddd
cccccccccc
aaaaaaaaa
gggggggggg
hhhhhhhhhh
测试
两个节点都进入配置文件目录:cd /bdp/conf/flume/
先启动node002的flume:
node002:flume-ng agent -n a2 -c /bdp/conf/flume/ -f example-avro.conf -Dflume.root.logger=INF0,consc
最后启动node001的flume:
flume-ng agent -n a1 -f example-avro.conf
可以看到node002已经打印出来了node001flume.txt中的内容
全文结束。
flume百度百科
Flume 简单理解及使用实例