1.flume
flume是高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。flume不仅可以采集数据,还可以对数据进行简单的处理。
flume的文件采集source工具只能识别文本数据。
2.flume-ng
flume-ng中,flume的集群只有一种角色agent
agent中有三种组件:source、channel、sink
source作用是采集数据,它可以是主动的去监听、抓取,可以可以被动的接收和等待
channel作用是做数据的缓存,当采集数据并发高的时候,有可能source采集数据的速度比sink消费数据的速度要快,因此需要channel来做一个中间缓存,解决这种速度不一致问题
sink作用是消费channel中的数据,它的消费会保证消费成功只有保证消费成功以后,它才会把这个数据从channel中删除,否则还存在于channel中。
一个agent中可以由多个source、channel、sink
一个source可以对接多个channel
一个sink只可以对接一个channel
在source上有两种组件
选择器(selector):当1个source对应多个channel时,可以使用选择器来分配source中什么样的数据到达什么样的channel
拦截器(interceptor):数据由source到达channel的过程中对数据进行拦截并可以进行处理
3.flume agent的程序开发
flume采集过程程序的开发其实就是定义配置文件,在配置文件定义好source、channel、sink、selector、interceptor等组件,以及他们之间的关系。
flume程序是properties格式配置文件,范式如下:
# list the sources, sinks and channels for the agent
<Agent>.sources = <Source>
<Agent>.sinks = <Sink>
<Agent>.channels = <Channel1> <Channel2>
# set channel for source
<Agent>.sources.<Source>.channels = <Channel1> <Channel2> ...
# set channel for sink
<Agent>.sinks.<Sink>.channel = <Channel1>
多个之间用空格来间隔
4.flume agent的启动
bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console
bin/flume-ng agent -c conf -f example.conf -n a1 -Dflume.root.logger=INFO,console
5.测试常用的source和sink
avro source被用来做测试,需要flume客户端程序把数据发送过来。
logger sink直接把获取到的数据打印在控制台
6.flume的客户端程序开发
项目中添加flume依赖
<dependency>
<groupId>org.apache.flume</groupId>
<artifactId>flume-ng-core</artifactId>
<version>1.8.0</version>
</dependency>
然后
构建RpcClient,使用RpcClientFactory的方法来构建。
构建Event对象,使用EventBuilder
然后调用client的append方法把数据发送给avrosource
7.Event
event是flume传递数据的最小单元
event里面包括两部分:header和body
header里面是一组kv数据,kv的类型都是String,header里面kv的内容可以被selector、interceptor或sink所使用
body里面是要传递具体的数据内容
写一个flume的客户端程序发送数据到一个flume agent
agent采集到数据之后把数据存储在hdfs上,以文本的方式存储
客户端发送的event的header里面写一个kv,k是timestamp,vlaue是当前时间戳值
8.客户端类型
Failover Client:解决单个flume节点挂掉,可以选择发送到集群中其他flume节点。
给一个client配置多个flume节点,在某个时间点只有一个节点来接受这个clien的数据,当这个节点挂掉之后,客户端会选择其他的节点来进行传输数据
LoadBalancing RPC client:解决单个节点上数据吞吐量过大达到瓶颈,可以使用LoadBalancing RPC client来进行负载均衡。
在代码实现上需要对client进行配置
Failover
写配置文件:clientconfig.properties
client.type = default_failover #配置客户端类型为default_failover。
hosts = h1 h2 h3 #给client配置多个flume节点
#每个节点的hostname和port可以独立设置
hosts.h1 = host1.example.org:41414
hosts.h2 = host2.example.org:41414
hosts.h3 = host3.example.org:41414
max-attempts = 3 #每个节点传输失败三次被判断为节点失败,开始尝试下一个节点
配置有了之后再实例化client对象的时候就可以使用
RpcClientFactory.getInstance(File propertiesFile)
其中参数propertiesFile去加载clientconfig.properties文件
对于配置信息可以写在自定义的配置文件中,也可以直接在代码里构建Properties对象,然后把上述配置参数写在Properties对象里面,然后使用RpcClientFactory.getInstance(Properties properties)方法来构造client对象
发送数据和普通的client没什么不同
写一个程序实现Failover类型的客户端,然后启动两个flume agent,达到客户端程序启动后往一个agent中发数据,结束这个agent的进程后,client会自动把数据发送到第二个agent
LoadBalancing RPC
client.type = default_loadbalance
hosts = h1 h2 h3 #给client添加多个flume节点,解决单节点处理流量达到瓶颈问题
hosts.h1 = host1.example.org:41414
hosts.h2 = host2.example.org:41414
hosts.h3 = host3.example.org:41414
backoff = false
maxBackoff = 0 # 当多个节点中有一个节点发生故障,这两个参数决定client是否重发已往失败节点上发送的数据,重发多少条
host-selector = round_robin # 这个决定着客户端以什么标准均衡的把数据发送到多个节点上去。round_robin,random,FQCN(自定义类型)
写一个LoadBalancing RPC客户端,配置两个agent,启动两个agent,客户端均衡的把数据发送到两个agent中
运行程序,并核对客户端发送的记录条数和两个agent各自收到的记录条数之和 是否一致
agent把数据以文本的方式保存到hdfs上
9.selector
每个flume的source都有selector
selector的类型有两种
replicating&#x