FLUM__学习笔记

flume==官网学习地址

http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html

验证flume 是否安装成功

/home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/bin/flume-ng version

实例1(小例) : 配置netcat 接口方式 的==》监控端口


 #Name the components on this agent 
命名 每个sink \source\channel 对应的名字
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
## 定义source 的相关配置
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444

# Describe the sink
## 定义sink 配置
a1.sinks.k1.type = logger

# Use a channel which buffers events in memory
## 定义 channels 的配置
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
## 将各个配置相关联
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

前往 启动配置–启动一个agent

###  INFO,console 打印在控制台
./bin/flume-ng agent --conf /conf/flume-env.sh --conf-file /home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/config/flume_1114_netcat.conf  --name a1  -Dflume.root.logger=INFO,console

实例2(exec) 监控某个文件 exec ===》控制台

#定义各个组件
agent1.sources  = src01
agent1.channels = ch01
agent1.sinks    = sink01

#配置source
agent1.sources.src01.type = exec
agent1.sources.src01.command = tail -n 10 /data/flume/items

#配置channel
agent1.channels.ch01.type = memory

#配置sink
agent1.sinks.sink01.type = logger

##下面是把上面设置的组件关联起来(把点用线连起来)
agent1.sources.src01.channels = ch01
agent1.sinks.sink01.channel    = ch01

启动 flume

./bin/flume-ng agent --conf /conf/flume-env.sh --conf-file /home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/config/flume_1114_exec.conf  --name agent1 -Dflume.root.logger=INFO,console

实例4 监控某个文件夹 --spooling-dir

# 定义别名
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = spooldir
# 监控的文件夹
a1.sources.r1.spoolDir = /home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/flume_data
# 上传成功后显示后缀名 
a1.sources.r1.fileSuffix = .COMPLETED
# 如论如何 加绝对路径的文件名 默认false
a1.sources.r1.fileHeader = true
#忽略所有以.tmp 结尾的文件(正在被写入),不上传
# ^以任何开头 出现无限次 以.tmp结尾的
a1.sources.r1.ignorePattern = ([^ ]*\.tmp)

# Describe the sink 下沉到hdfs
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://hadoop000:8020/flume/testdir/%Y%m%d/%H
#上传文件的前缀
a1.sinks.k1.hdfs.filePrefix = testdir-
#是否按照时间滚动文件夹
a1.sinks.k1.hdfs.round = true
#多少时间单位创建一个新的文件夹
a1.sinks.k1.hdfs.roundValue = 1
#重新定义时间单位
a1.sinks.k1.hdfs.roundUnit = hour
#是否使用本地时间戳
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#积攒多少个 Event 才 flush 到 HDFS 一次
a1.sinks.k1.hdfs.batchSize = 100
#设置文件类型,可支持压缩
a1.sinks.k1.hdfs.fileType = DataStream
#多久生成一个新的文件  ---秒为单位--以下为间隔30秒生成一个新的文件
a1.sinks.k1.hdfs.rollInterval = 30
#设置每个文件的滚动大小大概是 128M 
a1.sinks.k1.hdfs.rollSize = 134217700
#文件的滚动与 Event 数量无关
a1.sinks.k1.hdfs.rollCount = 10
#最小副本数
a1.sinks.k1.hdfs.minBlockReplicas = 1

# Use a channel which buffers events in memory 
a1.channels.c1.type = memory 
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1 
a1.sinks.k1.channel = c1

启动flume

./bin/flume-ng agent --conf /conf/flume-env.sh --conf-file /home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/config/flume_2021_1114_spoolingdir.conf  --name a1 -Dflume.root.logger=INFO,console

实例5 监控某个文件夹【超级重要】 --tail-dir 断点续传

#*********** set agent *************
a1.sources=r1
a1.channels=c1
a1.sinks=k1

#********* set sources **********
a1.sources.r1.type=taildir
a1.sources.r1.positionFile=/home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/flume_data/tail_dir/taildir_position.json
a1.sources.r1.filegroups=f1 f2 f3
a1.sources.r1.filegroups.f1=/home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/flume_data/tail_dir/access.log
a1.sources.r1.filegroups.f2=/home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/flume_data/tail_dir/nginx.log
a1.sources.r1.filegroups.f3=/home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/flume_data/tail_dir/web.log
a1.sources.r1.headers.f1.headerKey=access
a1.sources.r1.headers.f2.headerKey=nginx
a1.sources.r1.headers.f3.headerKey=web
a1.sources.r1.fileHeader=true
a1.sources.r1.channels=c1

#************ set channels **************
a1.channels.c1.type=memory
a1.channels.c1.capacity=10000
a1.channels.c1.transactionCapacity=100

#************* set sinks【先用logger测试下,在用hdfs】 *************

#配置sink
# a1.sinks.k1.type = logger
## 以上logger 测试没问题,再来调hdfs

###

a1.sinks.k1.type=hdfs
a1.sinks.k1.channel=c1
a1.sinks.k1.hdfs.path=hdfs://hadoop000:8020/flume/tail_dir/%{headerKey}/%Y-%m-%d
a1.sinks.k1.hdfs.filePrefix=event_data
a1.sinks.k1.hdfs.fileSuffix=.log
a1.sinks.k1.hdfs.round=true
## 多长时间,建一个文件夹
a1.sinks.k1.hdfs.roundValue=1
a1.sinks.k1.hdfs.roundUnit=minute
## 间隔多少秒建一个文件
a1.sinks.k1.hdfs.rollInterval=20
# 设置每个文件的滚动大小大概是 50M 
a1.sinks.k1.hdfs.rollSize=50
a1.sinks.k1.hdfs.rollCount=10
a1.sinks.k1.hdfs.batchSize=100
a1.sinks.k1.hdfs.fileType=DataStream
a1.sinks.k1.hdfs.threadsPoolSize=10
a1.sinks.k1.hdfs.callTimeout=10000
a1.sinks.k1.hdfs.writeFormat=Text
a1.sinks.k1.hdfs.useLocalTimeStamp=true

##下面是把上面设置的组件关联起来(把点用线连起来)
a1.sources.r1.channels = c1
a1.sinks.k1.channel    = c1

启动flume

./bin/flume-ng agent --conf /conf/flume-env.sh --conf-file /home/hadoop/app/apache-flume-1.6.0-cdh5.16.2-bin/config/test1114.conf  --name a1 -Dflume.root.logger=INFO,console

flume 参数小结

Name                   Default               Description
channel@                  –  
type@                     –                  指定类型:hdfs
hdfs.path@                –                  HDFS的路径,eg hdfs://namenode/flume/webdata/
hdfs.filePrefix        FlumeData             保存数据文件的前缀名
hdfs.fileSuffix           –                  保存数据文件的后缀名
hdfs.inUsePrefix          –                  临时写入的文件前缀名
hdfs.inUseSuffix         .tmp                临时写入的文件后缀名
hdfs.rollInterval         30                 间隔多长将临时文件滚动成最终目标文件,单位:秒,
                                             如果设置成0,则表示不根据时间来滚动文件
hdfs.rollSize            1024                当临时文件达到多少(单位:bytes)时,滚动成目标文件,
                                             如果设置成0,则表示不根据临时文件大小来滚动文件
hdfs.rollCount            10                 当 events 数据达到该数量时候,将临时文件滚动成目标文件,
                                             如果设置成0,则表示不根据events数据来滚动文件
hdfs.idleTimeout          0                  当目前被打开的临时文件在该参数指定的时间(秒)内,
                                             没有任何数据写入,则将该临时文件关闭并重命名成目标文件
hdfs.batchSize           100                 每个批次刷新到 HDFS 上的 events 数量
hdfs.codeC                –                  文件压缩格式,包括:gzip, bzip2, lzo, lzop, snappy
hdfs.fileType         SequenceFile           文件格式,包括:SequenceFile, DataStream,CompressedStre,
                                             当使用DataStream时候,文件不会被压缩,不需要设置hdfs.codeC;
                                             当使用CompressedStream时候,必须设置一个正确的hdfs.codeC值;
hdfs.maxOpenFiles        5000                最大允许打开的HDFS文件数,当打开的文件数达到该值,
                                             最早打开的文件将会被关闭
hdfs.minBlockReplicas     –                  HDFS副本数,写入 HDFS 文件块的最小副本数。
                                             该参数会影响文件的滚动配置,一般将该参数配置成1,才可以按照配置正确滚动文件
hdfs.writeFormat        Writable             写 sequence 文件的格式。包含:Text, Writable(默认)
hdfs.callTimeout         10000               执行HDFS操作的超时时间(单位:毫秒)
hdfs.threadsPoolSize      10                 hdfs sink 启动的操作HDFS的线程数
hdfs.rollTimerPoolSize    1                  hdfs sink 启动的根据时间滚动文件的线程数
hdfs.kerberosPrincipal    –                  HDFS安全认证kerberos配置
hdfs.kerberosKeytab       –                  HDFS安全认证kerberos配置
hdfs.proxyUser                               代理用户
hdfs.round              false                是否启用时间上的”舍弃”
hdfs.roundValue           1                  时间上进行“舍弃”的值
hdfs.roundUnit          second               时间上进行”舍弃”的单位,包含:second,minute,hour
hdfs.timeZone         Local Time             时区。
hdfs.useLocalTimeStamp  false                是否使用当地时间
hdfs.closeTries 0       Number               hdfs sink 关闭文件的尝试次数;
                                             如果设置为1,当一次关闭文件失败后,hdfs sink将不会再次尝试关闭文件,
                                             这个未关闭的文件将会一直留在那,并且是打开状态;
                                             设置为0,当一次关闭失败后,hdfs sink会继续尝试下一次关闭,直到成功
hdfs.retryInterval        180                hdfs sink 尝试关闭文件的时间间隔,
                                             如果设置为0,表示不尝试,相当于于将hdfs.closeTries设置成1
serializer               TEXT                序列化类型
serializer.*     

======== 添加 flume 拦截器 ====

======== 添加 flume 拦截器 ====

首先在 idea 开发拦截器

添加flume 涉及的版本

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <encoding>UTF-8</encoding>
    <hadoop.version>2.6.0-cdh5.16.2</hadoop.version>
    <flume.version>1.6.0-cdh5.16.2</flume.version>
    <kafka.version>2.5.0</kafka.version>
    <spark.version>3.0.0</spark.version>
</properties>

添加对应的依赖

<dependency>
    <groupId>org.apache.flume</groupId>
    <artifactId>flume-ng-core</artifactId>
    <version>${flume.version}</version>
</dependency>
package com.imooc.bigdata.flume;


import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class domainIntercepter  implements Interceptor {
    List<Event> events;

    // 初始化
    @Override
    public void initialize() {
        events=new ArrayList<>();

    }

    // 单例的处理
    @Override
    public Event intercept(Event event) {
        Map<String, String> headers = event.getHeaders();

        String body = new String(event.getBody());

        if(body.contains("imooc")){
            headers.put("type","imooc");
        }else {
            headers.put("type","other");
        }

        return event;
    }


    //多例的处理
    @Override
    public List<Event> intercept(List<Event> list) {
        events.clear();
        for (Event  i :list){
            events.add(intercept(i));
        }


        return events;
    }

    // 清理
    @Override
    public void close() {
        events=null;

    }


    public static class Builder implements Interceptor.Builder{

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

        @Override
        public void configure(Context context) {

        }
    }



}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值