一、采集数据
1.准备工作:hadoop安装
zookeeper安装
kafka安装
flume安装
sqoop安装
2.思想架构:
3.架构解析
1.使用flume->kafka->flume的原因?
在生产环境中我们使用架构不能局限于当下,在采集日志数据的时候采用flume->kafka->flume架构的好处有以下几点
(1)如果直接使用flume,按照现在来说也是可以的,但是公司需要发展,使用flume->kafka->flume架构方便以后做实时的时候可以直接连接kafka。
(2)kafka可以做一个缓冲,如果消费速度大于生产速率,kafka可以缓存更多的数据。防止把jvm挤爆。
(3)解决小文件问题。kafka有聚合作用,Kafka中消息是以topic进行分类的,生产者生产消息,消费者消费消息,都是面向topic的。生产者生产的消息是不断追加到log文件末尾,故在此时就会聚合小文件。
(4)削峰,在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用kafka消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
2.两个flume使用的组件的选型。
flume1使用的组件:taildir source
kafkachannel
不使用sink
Source是负责接收数据到Flume Agent的组件。
查询官网:taildir source 解决了断点续传和实时监控的问题
Channel是位于Source和Sink之间的缓冲区。
查询官网:使用kafka channel直接对接kafka,省略了sink组件,减少了take事务,提升了flume数据传输效率,并且将kafka channel的参数parseAsEvent设置为false,解决了flume数据传入到kafka,json日志信息前面多拼接个header信息的问题,保证kafka里面的数据都是一个个的flume body(单独的json日志字符串)
parseAsEvent:source上传数据一般是以event上传,但是在没有sink的时候,他是以字符串上传,而parseAsEvent默认是true,意思是以event上次,所以我们把它改成false。parseAsEvent是channel的参数。
拦截器:Flume1的source下面,挂了一个ETL拦截器,从数据源头对数据做ETL清洗,保证采集到的数据都是完整的json字符串,方便后续解析使用。
flume2使用的组件:kafka source
file channel
hdfs sink
F2:使用kafka source 对接kafka,获取kafka topic的数据,传给file channel,提高数据的安全性。最后利用hdfs sink将数据传入到hdfs上。
拦截器:F2的source下面挂了一个时间戳拦截器,给每条从kafka里获取到的数据加上一个header,key为timestamp,value为日志里面的ts字段的值(毫秒级时间戳)
这样做的目的有两个:
1:可以保证当天生成的日志数据一定会进入hdfs当天的目录下
2:造数据的时候,不需要再修改服务器的时间