Flume
1.业务系统为什么会产生用户行为日志,怎么产生的
用户行文日志:每一次访问的行为(访问、搜索)产生的日志
记录用户行为日志的目的:
1.商家会精准的给你呈现符合你的个人界面
2.商家会给你个人添加用户标签,更加精准的分析
埋点等
2.flume用来做什么的(采集传输数据的,分布式的,可靠的)
Apache Flume 是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储的工具/服务。
是一个数据采集工具,可以从各种各样的数据源上采集数据传输到大数据生态的各种存储系统中(Hdfs,hbase,hive,kafka)
开箱即用
3.flume的核心概念
agent-source-channel-sink
agent
Flume中最核心的角色是agent,flume采集系统就是由一个个agent连接起来所形成的一个或简单或复杂的数据传输通道。
对于每一个Agent来说,它就是一个独立的守护进程(JVM),它负责从数据源接收数据,并发往下一个目的地
每一个agent相当于一个数据(被封装成Event对象)传递员,内部有三个组件:
Source:采集组件,用于跟数据源对接,以获取数据;有各种各样的内置实现
Sink:下沉组件,用于往下一级agent传递数据或者向最终存储系统传递数据
Channel:传输通道组件,用于从source将数据传递到sink
单个agent采集数据
WebServer -->Agent(Source ->Channel ->Sink) Hdfs
数据在Flume内部中数据以Event的封装形式存在
Source组件在获取到原始数据后,需要封装成Event放入到Channel
Event封装对象主要有二部分组成:Headers 和Body
Header是一个集合 Map[String, String]用于携带一些KV形式的元数据(标志,描述等)
Body是一个字节数组,装载具体的数据内容
Flume的事务机制(类似数据库的事务机制):
Flume使用两个独立的事务分别负责从Soucrce到Channel,以及从Channel到Sink的event传递。比如spooling directory source 为文件的每一个event batch创建一个事务,一旦事务中所有的事件全部传递到Channel且提交成功,那么Soucrce就将event batch标记为完成。
同理,事务以类似的方式处理从Channel到Sink的传递过程,如果因为某种原因使得事件无法记录,那么事务将会回滚,且所有的事件都会保持到Channel中,等待重新传递。
- agent :flume部署启动的一个具体采集点(运行时的程序实例)
- agent内部的核心模块:
source(负责读数据源)
channel(内部缓存)
sink(负责写出数据)
上述3个组件,都有各种各样的具体实现
- flume的事务可靠性控制:
两个独立事务:
source -> channel 确保source读到一批数据后,一定成功写入channel
channel -> sink 确保sink从channel取出一批数据后,一定成功写入目标
flume的安装: 解压即可
Flume的安装非常简单,只需要解压即可,当然,前提是已有hadoop环境
上传安装包到数据源所在节点上
解压 tar -zxvf apache-flume-1.9.0-bin.tar.gz
根据数据采集的需求配置采集方案,描述在配置文件中(文件名可任意自定义)
指定采集方案配置文件,在相应的节点上启动flume agent
flume的配置: 根据具体场景来配置,主要配置3类组件
flume的配置入门实战: 日志服务器的日志文件中,读取数据,传输到HDFS
模拟持续生成数据
while true; do echo “abcdefghijklmnopqrst $RANDOM” >> flume.log; sleep 0.5; done
/**
a1.sources = r1
a1.channels = c1
a1.sinks = k1
a1.sources.r1.type = exec
a1.sources.r1.channels = c1
a1.sources.r1.command = tail -f /doit15/flume.log
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sinks.k1.channel = c1
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://linux201:9000/logflumedata/%y-%m-%d/%H/%M/
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.useLocalTimeStamp = true
a1.sinks.k1.hdfs.rollInterval = 0
a1.sinks.k1.hdfs.rollSize = 268435456
a1.sinks.k1.hdfs.rollCount = 0
**/
/**
REST API: 是一种api形式,它是通过将软件内部核心功能,暴露出web服务,通过HTTP协议提供给客户端(跨语言)来调用
例子:
YARN就提供了REST API: 可以通过这些api,获取集群状态信息,集群上运行的application信息,调度application,终止application…
**/
flume配置案例启动
-
先将写好的配置存到flume所在服务器上
cd ${FLUME_HOME}
mkdir agentconf
cd agentconf
vi exec-m-hdfs.properties 粘贴内容,并保存
cd ${FLUME_HOME}启动flume agent
./bin/flume-ng agent -c conf/ -f agentconf/exec-m-hdfs.properties -n a1
如果需要调试、观察flume的运行状态,可以将flume的日志打印级别调低,通过在启动命令后添加如下参数,即可
./bin/flume-ng agent -c conf/ -f agentconf/exec-m-hdfs.properties -n a1 -Dflume.root.logger=DEBUG,console
下一节:
串联
上游:
source : exec source
channel : memory channel
sink : avro sink --<其实就是一个socket客户端,只不过它会把event对象用avro序列化后发送出去>
|
|
下游:
source : avro source --<其实就是一个socket服务端,只不过它会把收到的数据按avro机制反序列化后得到Event>
channel
sink
序列化 spark为什么用那个序列化
spark支持 kryo序列化 第三方序列化框架
avro 第三方序列化框架