日志消费工具之Flume实操-下

一、需求分析

  1. 按照规划,该Flume需将Kafka中topic_log的数据发往HDFS。并且对每天产生的用户行为日志进行区分,将不同天的数据发往HDFS不同天的路径。

二、配置选择

  1. 此处选择KafkaSource、FileChannel、HDFSSink。
    日志消费工具之Flume实操-下_第1张图片
  2. 具体配置如下:
a1.channels=c1
a1.sinks=k1

a1.sources.r1.type=org.apache.flume.source.kafka.KafkaSource
a1.sources.r1.batchSize=5000
a1.sources.r1.batchDurationMillis=2000
a1.sources.r1.kafka.bootstrap.servers=hadoop102:9092,hadoop103:9092,hadoop104:9092
a1.sources.r1.kafka.topics=topic_log

#使用时间拦截器为event增加一个header,key为timestamp,value为json字符串中ts字段的值
a1.sources.r1.interceptors=i1
a1.sources.r1.interceptors.i1.type=com.yili.flume.interceptor.TimeStampInterceptor$Builder

a1.channels.c1.type=file
a1.channels.c1.checkpointDir=/opt/module/flume-1.9.0/checkpoint/behavior1
a1.channels.c1.dataDirs=/opt/module/flume-1.9.0/data/behavior1/

a1.sinks.k1.type=hdfs
a1.sinks.k1.hdfs.path=/user/yili/gmall/log/topic_log/%Y-%m-%d
a1.sinks.k1.hdfs.filePrefix=log-
a1.sinks.k1.hdfs.round=false

a1.sinks.k1.hdfs.fileType=CompressedStream
a1.sinks.k1.hdfs.codeC=lzop

a1.sources.r1.channels=c1
a1.sinks.k1.channels=c1
  1. 配置优化介绍
注:配置优化
1)FileChannel优化
通过配置dataDirs指向多个路径,每个路径对应不同的硬盘,增大Flume吞吐量。
官方说明如下:
Comma separated list of directories for storing log files. Using multiple directories on separate disks can improve file channel peformance
checkpointDir和backupCheckpointDir也尽量配置在不同硬盘对应的目录中,保证checkpoint坏掉后,可以快速使用backupCheckpointDir恢复数据
2)HDFS Sink优化
(1)HDFS存入大量小文件,有什么影响?
元数据层面:每个小文件都有一份元数据,其中包括文件路径,文件名,所有者,所属组,权限,创建时间等,这些信息都保存在Namenode内存中。所以小文件过多,会占用Namenode服务器大量内存,影响Namenode性能和使用寿命
计算层面:默认情况下MR会对每个小文件启用一个Map任务计算,非常影响计算性能。同时也影响磁盘寻址时间。
(2)HDFS小文件处理
官方默认的这三个参数配置写入HDFS后会产生小文件,hdfs.rollInterval、hdfs.rollSize、hdfs.rollCount
基于以上hdfs.rollInterval=3600,hdfs.rollSize=134217728,hdfs.rollCount =0几个参数综合作用,效果如下:
(1)文件在达到128M时会滚动生成新文件
(2)文件创建超3600秒时会滚动生成新文件

三、拦截器书写

  1. 具体代码如下
    (1)在com.atguigu.flume.interceptor包下创建TimeStampInterceptor类
package com.yili.flume.interceptor;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;

import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;

public class TimeStampInterceptor implements Interceptor {
    @Override
    public void initialize() {

    }

    @Override
    public Event intercept(Event event) {
        //将日志拦下,取出header里面的key,取出body里面的对应的日志时间:将ts的值赋值给header的key timestamp

        //1.获取header头
        Map, String> headers = event.getHeaders();
        //2.获取body里面的ts
        String log = new String(event.getBody(), StandardCharsets.UTF_8);
        JSONObject object = JSON.parseObject(log);
        String ts = object.getString("ts");
        headers.put("timestamp", ts);
        return event;
    }

    @Override
    public List intercept(List list) {
        for (Event event : list) {
            intercept(event);
        }
        return list;
    }

    @Override
    public void close() {

    }

    public static class Builder implements Interceptor.Builder {

        @Override
        public Interceptor build() {
            return new TimeStampInterceptor();
        }

        @Override
        public void configure(Context context) {

        }
    }
}

  1. 重新打包
    在这里插入图片描述

  2. 需要先将打好的包放入到hadoop104的/opt/module/flume-1.9.0/lib文件夹下面
    四、Flume测试

  3. 启动Zookeeper、Kafka集群

  4. 启动日志采集Flume

[yili@hadoop102 ~]$ f1.sh start
  1. 启动hadoop104的日志消费Flume
[yili@hadoop104 flume-1.9.0]$ bin/flume-ng agent -n a1 -c conf/ -f job/kafka_to_hdfs.conf -Dflume.root.logger=info,console
  1. 生成模拟数据
[yili@hadoop102 ~]$ lg.sh 
  1. 观察HDFS是否出现数据

你可能感兴趣的:(数据开发,flume,大数据,hadoop)