数据采集模块—行为日志采集
用户行为日志采集
这里接着上一部分,具体说明如何实现kafka到HDFS这一步骤。
一、架构图
kafka到HDFS这一部分对应整体架构图中的上图部分。
二、Kafka—Flume—HDFS规划
这里说明如何实现从Kafka读取数据通过Flume传输数据到HDFS中。
1.Flume规划
hadoop102:不做处理
hadoop103:不做处理
hadoop104:Flume(作为消费者,从Kafka中读取数据)
2.Source选型
这里是从Kafka中读取数据,因此从原则上来说可以使用kafka channel中的无source有sink的类型,但是这里需要实现一个拦截器,因此必须要有source,因此这里不能使用kafka channle,这里的source选用kafka source
3.Channel选型
这里为了保障数据的安全性,采用File Channel
4.Sink选型
这里是要将数据传输到HDFS中,因此需要使用HDFS sink
5.Flume-HDFS配置规划
1.设计架构
消费Flume配置关键点:
数据流程:Kafka中topic_log里的数据通过Kafka Source传输到File Channel,然后经过HDFS sink将数据存放到HDFS中。其中source和channel中间实现一个时间拦截器,解决零点漂移问题。
三、零点漂移问题
1.产生原因
在将Flume里的数据传输到HDFS里时,Flume默认会使用Linux系统时间作为输出到HDFS路径的时间,如果日志时间是23:59分,那么Flume消费kafka的数据时,可能已经是第二天了,所以必须要解决这种数据错乱的问题。
2.解决思路
在source和channel中使用拦截器,获取日志中真正的产生的时间,然后将这个时间写入到event的header头中,同时header里的key必须是timestamp,这样Flume框架会根据这个key的值自动识别为时间并在HDFS中创建对应的文件。
3.实现代码
编写TimeStampInterceptor类:
public class TimeStampInterceptor implements Interceptor {
private ArrayList<Event> events = new ArrayList<>();
@Override
public void initialize