Flume流程详细总结

本文介绍了Flume,它是高可用、高可靠的分布式海量日志采集、聚合和传输系统。阐述了其基础架构,包含Agent、Source、Sink、Channel和Event。还给出多个入门官方案例,如监听端口、监控文件等,同时讲解了自定义Interceptor、Source和Sink的方法。

目录

一、概述

二、基础架构

三、Flume入门官方案例

四、Flume进阶


一、概述

        >在了解Flume之前先看Flume的定义,从中了解Flume能够给我们带来什么帮助<

定义

Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传 输的系统。Flume 基于流式架构,灵活简单。

高可用的,高可靠的

如果 学习过hadoop或者大数据相关的知识,我们经常能够看到这两个名词,前者能够保证系统在各种故障的时候任然能够保持运行,后者能够保证系统稳定的运行,使得系统不容易发生故障。

海量日志采集、聚合和传输

这里我们先从从字面意思来看就是对于海量日志数据的采集、聚合、传输,而Flume最主要的作用也体现在这里,实时读取服务器本地磁盘的数据,将数据写入到HDFS等数据存储地。

二、基础架构

Flume官网(Welcome to Apache Flume — Apache Flume)给出的基础架构



1.Agent

从图中可以看出Agent其实是对数据传输的过程,骑士Agent是一个JVM进程,它以事件的形式将数据传输到目的地、主要由3个部分Source、Channel、Sink。


2.Source

Source 是负责接收数据到 Flume Agent 的组件。Source 组件可以处理各种类型、各种 格式的日志数据,包括 avro、thrift、exec、jms、spooling directory、netcat、taildir、 sequence generator、syslog、http、legacy。


3.Sink

Sink 不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储 或索引系统、或者被发送到另一个 Flume Agent。 Sink 组件目的地包括 hdfs、logger、avro、thrift、ipc、file、HBase、solr、自定 义。


4.Channel 

Channel 是位于 Source 和 Sink 之间的缓冲区。因此,Channel 允许 Source 和 Sink 运 作在不同的速率上。

Channel 是线程安全的,可以同时处理几个 Source 的写入操作和几个 Sink 的读取操作。 Flume 自带两种 Channel:Memory Channel 和 File Channel。

Memory Channel 是内存中的队列。Memory Channel 在不需要关心数据丢失的情景下适 用。如果需要关心数据丢失,那么 Memory Channel 就不应该使用,因为程序死亡、机器宕 机或者重启都会导致数据丢失。

File Channel 将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数 据。


5.Event

传输单元,Flume 数据传输的基本单元,以 Event 的形式将数据从源头送至目的地。 Event 由 Header 和 Body 两部分组成,Header 用来存放该 event 的一些属性,为 K-V 结构, Body 用来存放该条数据,形式为字节数组。

三、Flume入门官方案例

Flume大家可以自行去官网安装下面开始进行Flume的官方案列


案例一、监听数据端口

1.案例需求

   使用Flume监听一个端口,收集该端口数据,并打印到控制台

2.流程分析

 1>首先安装netcat工具

     sudo yum install -y nc

 2>在Flume目录下创建job文件夹,并在job文件夹里创建Agent配置文件,文件名见名知意

     vim flume-netcat-logger.conf 

 3>在配置文件中配置agent、source、sink、channel、绑定source,channel,sink  

     配置文件来源于官方手册 Flume 1.11.0 User Guide — Apache Flume

# Name the components on this agent

a1.sources = r1

a1.sinks = k1

a1.channels = c1

# Describe/configure the source

a1.sources.r1.type = netcat

a1.sources.r1.bind = localhost

a1.sources.r1.port = 44444

# Describe the sink

a1.sinks.k1.type = logger

# 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

配置文件解析



4>配置完成后开启flume监听端口

bin/flume-ng agent -n a1 -c conf/ -f job/flume-netcat-logger.conf -Dflume.root.logger=INFO,

console

参数说明:

--conf/-c:表示配置文件存储在 conf/目录

--name/-n:表示给 agent 起名为 a1

--conf-file/-f:flume 本次启动读取的配置文件是在 job 文件夹下的 flume-telnet.conf 文件。

-Dflume.root.logger=INFO,console :-D 表示 flume 运行时动态修改 flume.root.logger 参数属性值,并将控制台日志打印级别设置为 INFO 级别。日志级别包括:log、info、warn、 error。

5>使用 netcat 工具向本机的 44444 端口发送内容

   nc localhost 44444

   hello

6>在 Flume 监听页面观察接收数据情况

案例二、实时监控单个追加文件

1.案例需求

实时监控hive日志并上传hdfs

2.流程分析

 1>Flume想要将数据上传到Hdfs,首先要依赖Hadoop相关的jar包,确定Hadoop和java的环境变量正常

 2>在Flume目录log下创建Agent配置文件

 vim flume-file-hdfs.conf

 3>在配置文件中添加内容

 # Name the components on this agent

a2.sources = r2

a2.sinks = k2

a2.channels = c2

# Describe/configure the source

a2.sources.r2.type = exec

a2.sources.r2.command = tail -F /opt/module/hive/logs/hive.log

# Describe the sink

a2.sinks.k2.type = hdfs

a2.sinks.k2.hdfs.path = hdfs://hadoop102:8020/flume/%Y%m%d/%H

#上传文件的前缀

a2.sinks.k2.hdfs.filePrefix = logs-

#是否按照时间滚动文件夹

a2.sinks.k2.hdfs.round = true

#多少时间单位创建一个新的文件夹

a2.sinks.k2.hdfs.roundValue = 1

#重新定义时间单位

a2.sinks.k2.hdfs.roundUnit = hour

#是否使用本地时间戳

a2.sinks.k2.hdfs.useLocalTimeStamp = true

#积攒多少个 Event 才 flush 到 HDFS 一次

a2.sinks.k2.hdfs.batchSize = 100

#设置文件类型,可支持压缩

a2.sinks.k2.hdfs.fileType = DataStream

#多久生成一个新的文件

a2.sinks.k2.hdfs.rollInterval = 60

#设置每个文件的滚动大小

a2.sinks.k2.hdfs.rollSize = 134217700

#文件的滚动与 Event 数量无关

a2.sinks.k2.hdfs.rollCount = 0

# Use a channel which buffers events in memory

a2.channels.c2.type = memory

a2.channels.c2.capacity = 1000

a2.channels.c2.transactionCapacity = 100

# Bind the source and sink to the channel

a2.sources.r2.channels = c2 a2.sinks.k2.channel = c2


4>运行Flume

bin/flume-ng agent -n a1 -c conf/ -f job/flume-file-hdfs.conf


5>运行hive并执行操作

hive



6>查看hdfs,数据是先存储在临时文件里,我们配置了a2.sinks.k2.hdfs.rollInterval = 60

    60s过后临时文件变成正常文件。

案例三、实时监控目录下多个新文件

1.案例需求

使用Flume监听整个目录的文件,并上传至Hdfs

2.流程分析

1>在Flume的job目录中创建agent配置文件

     vim flume-dir-hdfs.conf

2>配置文件内容

a3.sources = r3

a3.sinks = k3

a3.channels = c3

# Describe/configure the source

a3.sources.r3.type = spooldir

a3.sources.r3.spoolDir = /opt/module/flume/upload

a3.sources.r3.fileSuffix = .COMPLETED

a3.sources.r3.fileHeader = true

#忽略所有以.tmp 结尾的文件,不上传

a3.sources.r3.ignorePattern = ([^ ]*\.tmp)

# Describe the sink a3.sinks.k3.type = hdfs

a3.sinks.k3.hdfs.path = hdfs://hadoop102:8020/flume/upload/%Y%m%d/%H

#上传文件的前缀 a3.sinks.k3.hdfs.filePrefix = upload-

#是否按照时间滚动文件夹

a3.sinks.k3.hdfs.round = true

#多少时间单位创建一个新的文件夹

a3.sinks.k3.hdfs.roundValue = 1

#重新定义时间单位

a3.sinks.k3.hdfs.roundUnit = hour

#是否使用本地时间戳

a3.sinks.k3.hdfs.useLocalTimeStamp = true

#积攒多少个 Event 才 flush 到 HDFS 一次

a3.sinks.k3.hdfs.batchSize = 100

#设置文件类型,可支持压缩

a3.sinks.k3.hdfs.fileType = DataStream

#多久生成一个新的文件

a3.sinks.k3.hdfs.rollInterval = 60

#设置每个文件的滚动大小大概是 128M

a3.sinks.k3.hdfs.rollSize = 134217700

#文件的滚动与 Event 数量无关

a3.sinks.k3.hdfs.rollCount = 0

# Use a channel which buffers events in memory

a3.channels.c3.type = memory

a3.channels.c3.capacity = 1000

a3.channels.c3.transactionCapacity = 100

# Bind the source and sink to the channel

a3.sources.r3.channels = c3

a3.sinks.k3.channel = c3


3>在Flume中创建目录upload

    mkdir upload


4>启动监控

bin/flume-ng agent -n a3 -c conf/ -f job/flume-dir-hdfs.conf 


5>向upload中添加文件

touch a.txt


6>查看hdfs

案例四、实时监控目录下的多个追加文件

Exec source 适用于监控一个实时追加的文件,不能实现断点续传;Spooldir Source 适合用于同步新文件,但不适合对实时追加日志的文件进行监听并同步;而 Taildir Source 适合用于监听多个实时追加的文件,并且能够实现断点续传。

1.案例需求

使用 Flume 监听整个目录的实时追加文件,并上传至 HDFS

2.流程分析

1>创建agent配置文件

  vim flume-tailder-hdfs.conf


2>配置内容

a3.sources = r3
a3.sinks = k3
a3.channels = c3

# Describe/configure the source
a3.sources.r3.type = TAILDIR
a3.sources.r3.positionFile = /opt/module/flume/tail_dir.json
a3.sources.r3.filegroups = f1 f2
a3.sources.r3.filegroups.f1 = /opt/module/flume/files/.*file.*
a3.sources.r3.filegroups.f2 = /opt/module/flume/files2/.*log.*

# Describe the sink
a3.sinks.k3.type = hdfs
a3.sinks.k3.hdfs.path = hdfs://hadoop102:8020/flume/upload2/%Y%m%d/%H
#上传文件的前缀
a3.sinks.k3.hdfs.filePrefix = upload-
#是否按照时间滚动文件夹
a3.sinks.k3.hdfs.round = true
#多少时间单位创建一个新的文件夹
a3.sinks.k3.hdfs.roundValue = 1
#重新定义时间单位
a3.sinks.k3.hdfs.roundUnit = hour
#是否使用本地时间戳

a3.sinks.k3.hdfs.useLocalTimeStamp = true
#积攒多少个 Event 才 flush 到 HDFS 一次
a3.sinks.k3.hdfs.batchSize = 100
#设置文件类型,可支持压缩
a3.sinks.k3.hdfs.fileType = DataStream
#多久生成一个新的文件
a3.sinks.k3.hdfs.rollInterval = 60
#设置每个文件的滚动大小大概是 128M
a3.sinks.k3.hdfs.rollSize = 134217700
#文件的滚动与 Event 数量无关
a3.sinks.k3.hdfs.rollCount = 0

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

# Bind the source and sink to the channel
a3.sources.r3.channels = c3
a3.sinks.k3.channel = c3
3>启动配置文件

 bin/flume-ng agent -n a3 -c conf/ -f job/flume-taildir-hdfs.conf

4>在flume中创建files文件夹,进入files中创建文件并向里追加内容

mkdir files

cd files

touch a.txt

echo hello >> a.txt

5>观察hdfs

四、Flume进阶

通过对上面的官方案例,相信大家已经对Flume的工作流程有了一定的了解,下面我们将从细节开始对Flume进行讲解。

Flume事务



Flume Agent内部原理

首先Source接收到数据,前往Channel Processor进行事件处理,随后将事件传到拦截器链中进行事件的过滤处理、转换、优化等操作,完成这些操作后事件将会被传往ChannelSelector,后

续简称CS,CS选出Event将要发往哪个Channel,CS有两种一个是Replicating复制类型,一种是Multiplexing多路复用类型,ReplicatingSelector 会将同一个 Event 发往所有的 Channel,Multiplexing 会根据相 应的原则,将不同的 Event 发往不同的 Channel,事件被写入相应的C

hannel后将被发送到SinkProcessor,SinkProcessor 共 有 三 种 类 型 , 分 别 是 DefaultSinkProcessor 、 LoadBalancingSinkProcessor 和 FailoverSinkProcessor DefaultSinkProcessor 对 应 的 是 单 个 的 Sink , LoadBalancingSinkProcessor 和 FailoverSinkProcessor 对应的是 Sink Group,LoadBalancingSinkProcessor 可以实现负 载均衡的功能,FailoverSinkProcessor 可以错误恢复的功能。

Fulme拓扑结构

1.简单串联

该模式将多个Flume串联起来,该模式一般不使用,因为一旦中间某个节点宕机,整个系统都会宕机

2.复制和多路复用

source将相同数据复制到不同的Channel中,sink可以选择传往不同的目的地。

3.负载均衡和故障转移

Flume支持使用将多个sink逻辑上分到一个sink组,sink组配合不同的SinkProcessor 可以实现负载均衡和错误恢复的功能

4.聚合

这种模式是我们最常见的,也非常实用,日常 web 应用通常分布在上百个服务器,大者 甚至上千个、上万个服务器。产生的日志,处理起来也非常麻烦。用 flume 的这种组合方式 能很好的解决这一问题,每台服务器部署一个 flume 采集日志,传送到一个集中收集日志的flume,再由flume上传到hdfs,hive,hbase等进行日志分析。

自定义Interceptor(拦截器)

我们之前在看Flume架构图的时候,可以看到Source在接收到数据后,会将封装的事件发给ChannelProcessor,此时ChannelProcessor会将事件先给拦截器链,相当于去过滤了一遍,

如果没有自定义拦截器,系统会将事件原样返还给ChannelProcessor,ChannelProcessor

再将事件给Channel选择器,此时如果用默认的ChannelSelector——Replicating,Channel

Processor会将事件发送给每一个Channel中,而使用,Multiplexing ChannelSelect,会将e

vents发往相应的channel,Multiplexing可以配置发往哪些Channel,配置方法就是根据event

中的Header中的key的值将event发往不同的Channel,而正常source接收的数据封装成even

t的时候Header中并没有值,这时我们就要写Interceptor来给不同的数据的Header中添加不同的key值。

1.案例需求

使用 Flume 采集服务器本地日志,需要按照日志类型的不同,将不同种类的日志发往不 同的分析系统。

2.需求分析

在实际的开发中,一台服务器产生的日志类型可能有很多种,不同类型的日志可能需要 发送到不同的分析系统。此时会用到 Flume 拓扑结构中的 Multiplexing 结构,Multiplexing 的原理是,根据 event 中 Header 的某个 key 的值,将不同的 event 发送到不同的 Channel中,所以我们需要自定义一个 Interceptor,为不同类型的 event 的 Header 中的 key 赋予 不同的值。 在该案例中,我们以端口数据模拟日志,以端口数据含有字符串"debu"为区分,发往不同的分析系统。



3.案例实操

1.创建一个maven项目,引入依赖

<dependency>
   <groupId>org.apache.flume</groupId>
   <artifactId>flume-ng-core</artifactId>
   <version>1.9.0</version>
</dependency>

2.定义MyInterceptor类并实现Interceptor接口

package com.csdn.interceptor;

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 MyInterceptor implements Interceptor{

    //声明一个存放事件的集合
    private List<Event> addHeaderEvents;

    @Override
    public void initialize() {
        //初始化存放事件的集合
        addHeaderEvents = new ArrayList<>();
    }
    //单个事件拦截
    @Override
    public Event intercept(Event event) {

        //1.获取事件中的头信息
        Map<String, String> headers = event.getHeaders();

        //2.获取事件中的body信息
        String body = new String(event.getBody());

        //3.根据body中是否有字符串"debu"来决定添加怎样的头信息
        if(body.contains("debu")){
            //添加头信息,头信息的key为type,value自定义即可
            headers.put("type","debu");
        } else {
            headers.put("type", "nodebu");

        }
        return event;
    }

    //批量事件拦截
    @Override
    public List<Event> intercept(List<Event> events) {

        //1.清空集合,防止之前有数据
        addHeaderEvents.clear();

        //2.遍历events
        for (Event event : events) {
            //调用单世界拦截
            addHeaderEvents.add(intercept(event));
        }
        return addHeaderEvents;
    }

    @Override
    public void close() {

    }
    public static class Builder implements Interceptor.Builder {
        @Override
        public Interceptor build() {
            return new MyInterceptor();
        }

        @Override
        public void configure(Context context) {

        }
    }
}

3.编辑flume配置文件

(1)在hadoop102上配置1个netcat source 和一个sink组(2个 avro sink) 并配置Multiplexing和自定义拦截器。

在hadoop102上的flume中的job目录中创建group5

#注意红色的部分按自定义的类配置

# Name the components on this agent
a1.sources = r1
a1.sinks = k1 k2
a1.channels = c1 c2

# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type =com.csdn.interceptor.MyInterceptor$Builder
a1.sources.r1.selector.type = multiplexing
a1.sources.r1.selector.header = type
a1.sources.r1.selector.mapping.debu = c1
a1.sources.r1.selector.mapping.nodebu = c2

# Describe the sink
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = hadoop103
a1.sinks.k1.port = 4141
a1.sinks.k2.type=avro
a1.sinks.k2.hostname = hadoop104
a1.sinks.k2.port = 4242

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


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

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


(2)在 hadoop103 上 配置一个 avro source 和一个 logger sink

vim flume-flume-logger
 

a1.sources = r1
a1.sinks = k1
a1.channels = c1

a1.sources.r1.type = avro
a1.sources.r1.bind = hadoop103
a1.sources.r1.port = 4141

a1.sinks.k1.type = logger

a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

a1.sinks.k1.channel = c1
a1.sources.r1.channels = c1


(3)在 hadoop104 上 配置一个 avro source 和一个 logger sink
vim flume-flume-logger2
 

a1.sources = r1
a1.sinks = k1
a1.channels = c1

a1.sources.r1.type = avro
a1.sources.r1.bind = hadoop104
a1.sources.r1.port = 4242

a1.sinks.k1.type = logger

a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

a1.sinks.k1.channel = c1
a1.sources.r1.channels = c1


在103和104上启动服务 再到102上启动服务,同时再开一个102 向端口发送信息

可以看到含有debu的都会到103上 其他的到104上


自定义source

Source 是负责接收数据到 Flume Agent 的组件。Source 组件可以处理各种类型、各种格式的日志数据,官方提供了很多的source,如果我们有开发中的需求,就需要自定义source

案例需求:

使用自定义的source接收数据,给数据加上前缀,后缀,再将数据给channel,最后用logger sink在

控制台输出。

(1)编码

package com.debu.source;

import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.EventDeliveryException;
import org.apache.flume.PollableSource;
import org.apache.flume.conf.Configurable;
import org.apache.flume.event.SimpleEvent;
import org.apache.flume.source.AbstractSource;

import java.util.HashMap;
public class MySource extends AbstractSource implements Configurable, PollableSource {
    private String prefix;
    private String suffix;
    private Long delay;

    @Override
    public void configure(Context context) {
        prefix = context.getString("pre","pre-");
        suffix = context.getString("suf");
        delay = context.getLong("delay",2000L);

    }
    @Override
    public Status process() throws EventDeliveryException {


        //循环创建事件信息,传给Channel
        try {
            for (int i = 0; i < 5; i++) {
                //声明事件
                Event event = new SimpleEvent();
                HashMap<String , String > header = new HashMap<>();
                event.setHeaders(header);
                event.setBody((prefix+"debu:"+i+suffix).getBytes());
                getChannelProcessor().processEvent(event);
            }
            Thread.sleep(delay);
            return Status.READY;
        } catch (Exception e) {
            e.printStackTrace();
            return Status.BACKOFF;
        }
    }

    @Override
    public long getBackOffSleepIncrement() {
        return 0;
    }

    @Override
    public long getMaxBackOffSleepInterval() {
        return 0;
    }
}

编码完成后打成jar包放到flume的lib目录中
(2)配置文件

在flume/job 下创建mysource.conf

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = com.debu.source.MySource

#下面3个注释掉,就默认使用自定义类中的配置
a1.sources.r1.pre = sb-
a1.sources.r1.suf = -bs
a1.sources.r1.delay = 5000

# Describe the sink
a1.sinks.k1.type = logger

# 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


(3)测试

bin/flume-ng agent -c conf/ -f job/mysource.conf -n a1 -Dflume.root.logger=INFO,console


自定义sink
Sink 不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储 或索引系统、或者被发送到另一个 Flume Agent。

Sink 是完全事务性的。在从 Channel 批量删除数据之前,每个 Sink 用 Channel 启动一 个事务。批量事件一旦成功写出到存储系统或下一个 Flume Agent,Sink 就利用 Channel 提 交事务。事务一旦被提交,该 Channel 从自己的内部缓冲区删除事件。

Sink 组件目的地包括 hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、 自定义。官方提供的 Sink 类型已经很多,但是有时候并不能满足实际开发当中的需求,此 时我们就需要根据实际需求自定义某些 Sink。


案例需求

和自定义source类似我们在sink拉取数据的时候加上前缀和后缀


(1)编码:

package com.debu.sink;

import org.apache.flume.*;
import org.apache.flume.conf.Configurable;
import org.apache.flume.sink.AbstractSink;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MySink extends AbstractSink implements Configurable {
    //声明数据的前后缀
    private String prefix;
    private String suffix;

    //创建Logger对象
    private Logger logger = LoggerFactory.getLogger(MySink.class);
    @Override
    public void configure(Context context) {
        prefix = context.getString("pre","pre-");
        suffix = context.getString("suf");
    }


    @Override
    public Status process() throws EventDeliveryException {
        //获取Channel,开启事务
        Channel channel = getChannel();
        Transaction transaction = channel.getTransaction();
        transaction.begin();

        //从Channel中抓取数据打印到控制台
        try{
            //抓取数据
            Event event;
            //没有数据就一直去尝试抓取
            while(true){
                event = channel.take();
                if(event != null){
                    break;
                }
            }

            //处理数据
            logger.info(prefix+new String(event.getBody())+suffix);

            //提交事务
            transaction.commit();
            return Status.READY;

        }catch (Exception e){
            //捕获到异常先回滚,退避一段时间
            transaction.rollback();
            return Status.BACKOFF;

        }finally {
            //关闭事务
            transaction.close();
        }

    }

}

编码完成后打成jar包放到flume的lib目录中

(2)在flume的job中编写配置文件mysink.conf

 

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444

# Describe the sink
a1.sinks.k1.type = com.debu.sink.MySink
a1.sinks.k1.pre = sb-
a1.sinks.k1.suf = -bs

# 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

(3)开启端口发送数据

nc localhost 44444

hello
可以看到数据有了前缀和后缀

上层应用业务对实时数据的需求,主要包含两部分内容:1、 整体数据的实时分析。2、 AB实验效果的实时监控。这几部分数据需求,都需要进行的下钻分析支持,我们希望能够建立统一的实时OLAP数据仓库,并提供一套安全、可靠的、灵活的实时数据服务。目前每日新增的曝光日志达到几亿条记录,再细拆到AB实验更细维度时,数据量则多达上百亿记录,多维数据组合下的聚合查询要求秒级响应时间,这样的数据量也给团队带来了不小的挑战。OLAP层的技术选型,需要满足以下几点:1:数据延迟在分钟级,查询响应时间在秒级2:标准SQL交互引擎,降低使用成本3:支持join操作,方便维度增加属性信息4:流量数据可以近似去重,但订单行要精准去重5:高吞吐,每分钟数据量在千W级记录,每天数百亿条新增记录6:前端业务较多,查询并发度不能太低通过对比开源的几款实时OLAP引擎,可以发现Doris和ClickHouse能够满足上面的需求,但是ClickHouse的并发度太低是个潜在的风险,而且ClickHouse的数据导入没有事务支持,无法实现exactly once语义,对标准SQL的支持也是有限的。所以针对以上需求Doris完全能解决我们的问题,DorisDB是一个性能非常高的分布式、面向交互式查询的分布式数据库,非常的强大,随着互联网发展,数据量会越来越大,实时查询需求也会要求越来越高,DorisDB人才需求也会越来越大,越早掌握DorisDB,以后就会有更大的机遇。本课程基于真实热门的互联网电商业务场景为案例讲解,具体分析指标包含:AB版本分析,下砖分析,营销分析,订单分析,终端分析等,能承载海量数据的实时分析,数据分析涵盖全端(PC、移动、小程序)应用。整个课程,会带大家实践一个完整系统,大家可以根据自己的公司业务修改,既可以用到项目中去,价值是非常高的。本课程包含的技术:开发工具为:IDEA、WebStormFlink1.9.0DorisDBHadoop2.7.5Hbase2.2.6Kafka2.1.0Hive2.2.0HDFS、MapReduceFlume、ZookeeperBinlog、Canal、MySQLSpringBoot2.0.8.RELEASESpringCloud Finchley.SR2Vue.js、Nodejs、Highcharts、ElementUILinux Shell编程等课程亮点:1.与企业接轨、真实工业界产品2.DorisDB高性能分布式数据库3.大数据热门技术Flink4.支持ABtest版本实时监控分析5.支持下砖分析6.数据分析涵盖全端(PC、移动、小程序)应用7.主流微服务后端系统8.天级别与小时级别多时间方位分析9.数据库实时同步解决方案10.涵盖主流前端技术VUE+jQuery+Ajax+NodeJS+ElementUI11.集成SpringCloud实现统一整合方案12.互联网大数据企业热门技术栈13.支持海量数据的实时分析14.支持全端实时数据分析15.全程代码实操,提供全部代码和资料16.提供答疑和提供企业技术方案咨询企业一线架构师讲授,代码在老师的指导下企业可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。 
在这个科技高速发展的时代,经历了PC时代几乎人手一台电脑,随之衍生出站长这个概念;移动互联网时代几乎人手一部智能手机,智能手机一般都会安装很多应用,目前应用呈爆发式的增长;随着产业的不断深入发展,小程序的发展也日益壮大,应用涵盖各个领域;如今一个公司就可能有多个软件应用,对于软件开发商来说,急需一套分析系统帮助软件运营,如果单独开发一个分析系统去针对一个软件进行分析的话,成本会非常的大,这个成本包含开发成本以及以后的维护成本。为了解决了上述的问题,我们开发出了一套云产品:亿级动态数据统计分析系统,本系统可以支持所有的终端  (Web端、移动端、小程序端等 )数据统计,只要简单的使用sdk就可以接入我们的系统,软件开发商可以很轻松的对软件使用的情况进行监控,及时辅助公司对该软件的运营。该产品历经2年的实践,商业价值极高。本套案例是完全基于真实的产品进行开发和讲解的,同时对架构进行全面的升级,采用了全新的 Flink 架构+Node.js+Vue.js等,完全符合目前企业级的使用标准。对于本套课程在企业级应用的问题,可以提供全面的指导。Flink作为第四代大数据计算引擎,越来越多的企业在往Flink转换。Flink在功能性、容错性、性能方面都远远超过其他计算框架,兼顾高吞吐和低延时。Flink能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能。也就是说同时支持流处理和批处理。Flink将流处理和批处理统一起来,也就是说作为流处理看待时输入数据流是无界的;批处理被作为一种特殊的流处理,只是它的输入数据流被定义为有界的。Flink技术特点1. 流处理特性支持高吞吐、低延迟、高性能的流处理支持带有事件时间的窗口(Window)操作支持有状态计算的Exactly-once语义支持高度灵活的窗口(Window)操作,支持基于time、count、session,以及data-driven的窗口操作支持具有Backpressure功能的持续流模型支持基于轻量级分布式快照(Snapshot)实现的容错一个运行时同时支持Batch on Streaming处理和Streaming处理Flink在JVM内部实现了自己的内存管理支持迭代计算支持程序自动优化:避免特定情况下Shuffle、排序等昂贵操作,中间结果有必要进行缓存2. API支持对Streaming数据类应用,提供DataStream API对批处理类应用,提供DataSet API(支持Java/Scala)3. Libraries支持支持机器学习(FlinkML)支持图分析(Gelly)支持关系数据处理(Table)支持复杂事件处理(CEP)4. 整合支持支持Flink on YARN支持HDFS支持来自Kafka的输入数据支持Apache HBase支持Hadoop程序支持Tachyon支持ElasticSearch支持RabbitMQ支持Apache Storm支持S3支持XtreemFS课程所涵盖的知识点包括:Flink、 Node.js、 Vue.js、 Kafka、Flume、Spring、SpringMVC、Dubbo、HDFS、Hbase、Highcharts等等  企业一线架构师讲授,代码在老师指导下可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星星妳睡了吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值