一、概念

flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。

Flume系统中核心的角色是agent,agent本身是一个Java进程,一般运行在日志收集节点。
一个agent内部有三个组件:
Source:采集源,用于跟数据源对接,以获取数据
Channel:agent内部的数据传输通道,用于从source将数据传递到sink
Sink:下沉地,采集数据的传送目的,用于往下一级agent传递数据或者往最终存储系统传递数据

event:Flume内部数据传输的最基本单元,event将传输的数据进行封装。如果是文本文件,通常是一行记录,event也是事务的基本单位。

  event从source,流向channel,再到sink,本身为一个字节数组,并可携带headers(头信息)信息。
  event代表着一个数据的最小完整单元,从外部数据源来,向外部的目的地去。

二、数据传输

2.1 flume传输数据时会使用事务

  source推送数据到channel以及sink从channel拉取数据时都是以事务方式进行的。

  比如sink输出数据完毕后应该将channel中缓存的数据删除,sink输出数据和channel删除数据是一个事务里面的,要么都成功要么都失败

2.2 常见source和sink

类别   类型 描述
source Avro Source Avro Source监听Avro端口,接收从外部Avro客户端发送来的数据流
source Exec Source 这个source在启动时运行给定的Unix命令,并期望该进程在标准输出上连续生成数据
source Spooling Directory Source 监控指定目录内的数据变更
source Netcat Source 监控某个端口,将流经端口的每一个文本行数据作为event输入
source Http Source 基于Http Post或者Get方式的数据源,支持JSON,BLOB表示形式
Channel Memory Channe Event数据存储在内存中
Channel File Channel Event数据存储在磁盘文件中
Sink kafka kafka
Sink hdfs hdfs
Sink hive等技术 hive等技术

2.3 简单配置参考

# 首先先给agent起一个名字 叫a1
# 分别给source channel sink取名字
a1.sources = r1
a1.channels = c1
a1.sinks = k1 # 分别对source、channel、sink进行配置
# 配置source
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /usr/local/data/test
a1.sources.r1.fileSuffix = .ok
a1.sources.r1.fileHeader = true # 配置sink
# 使用logger作为sink组件,可以将收集到数据直接打印到控制台
a1.sinks.k1.type = logger # 配置channel
# 将channel的类型设置为memory,表示将event缓存在内存中
a1.channels.c1.type = memory # 组装
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

2.4 启动

flume-ng agent -n a1 -f spoolTolog.conf

-n 的含义是agent的名字,与上面conf文件里面的agent名字保持一致
-f 的含义是conf文件位置,这里的spoolTolog.conf 就是我上面编写的conf文件名称

flume1.9 中文文档:https://flume.liyifeng.org/

2.5 新建文件写入些内容,看flume内容

a1.sources.r1.spoolDir = /usr/local/data/test
到这个目录下面创建一个 a.txt 文件,在里面随便写一些数据,然后再来看flume这边

回到a.txt 文件所在的目录下面

上图中消息内容以Event传递,event里面分为两个部分,分别是 header 和 body
header信息,event的头信息,这里显示的内容是file路径,是因为conf文件里面加上了a1.sources.r1.fileHeader = true参数
body信息,body信息又分为两个部分,后半部分的123是 a.txt 文件里面的内容,而前面的31,32,33则分别是 1,2,3的十六进制ASCII码值

2.6 拦截器

flume监听指定目录下的文件数据变更信息,对于这些信息可以全盘保留,然后以指定的sink方式输出。但是也可以通过拦截器的方式,根据需要过滤或者保留一些信息,然后只会把拦截器拦截过后的这一部分信息传输到sink

# 首先先给agent起一个名字 叫a1
# 分别给source channel sink取名字
a1.sources = r1
a1.channels = c1
a1.sinks = k1 # 分别对source、channel、sink进行配置
# 配置source
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /usr/local/data/test
a1.sources.r1.fileSuffix = .ok
a1.sources.r1.fileHeader = true # 给r1这个souces配置一个拦截器并取名为 i1
a1.sources.r1.interceptors = i1
# 将拦截器i1的类型设置为regex_filter 会根据正则表达式过滤数据
a1.sources.r1.interceptors.i1.type = regex_filter
# 配置正则表达式
a1.sources.r1.interceptors.i1.regex = \\d{3,6}
# excludeEvents = true 表示将匹配到的过滤,未匹配到的放行
# excludeEvents = false 表示只传输匹配成功的
a1.sources.r1.interceptors.i1.excludeEvents = true # 配置sink
# 使用logger作为sink组件,可以将收集到数据直接打印到控制台
a1.sinks.k1.type = logger # 配置channel
a1.channels.c1.type = memory # 组装
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

2.7 测试拦截器

12
123
123456
12345678
ab
abcde
123abc

这里只输出了 12,ab,abcde,以及最后的一个空行

a1.sources.r1.interceptors.i1.excludeEvents = true,true表明匹配正则表达式成功则被拦截,不会放行

2.8 hbase输出日志到hdfs

# 起名字
a.sources = r1
a.sinks = k1
a.channels = c1 # 配置source,这次选用 exec source
a.sources.r1.type = exec
# 指定exec source通过执行什么命令来获取信息
a.sources.r1.command = tail -f /usr/local/soft/hbase-1.4.6/logs/hbase-root-master-master.log #配置sink
a.sinks.k1.type = hdfs
a.sinks.k1.hdfs.path = /flume/data/dir2
a.sinks.k1.hdfs.filePrefix = hbaselog
a.sinks.k1.hdfs.rollSize = 102400
a.sinks.k1.hdfs.rollCount = 1000
a.sinks.k1.hdfs.fileType = DataStream
a.sinks.k1.hdfs.writeFormat = text
a.sinks.k1.hdfs.fileSuffix = .txt #配置channel
a.channels.c1.type = memory
a.channels.c1.capacity = 1000
a.channels.c1.transactionCapacity = 100 # 组装
a.sources.r1.channels = c1
a.sinks.k1.channel = c1

2.9 监听端口输出到控制台

# 起名字
a.sources = r1
a.sinks = k1
a.channels = c1 # 配置source
a.sources.r1.type = netcat
# 0.0.0.0表示接收任意ip的用户提交的信息
a.sources.r1.bind = 0.0.0.0
# 设置监听端口
a.sources.r1.port = 8888 #配置sink
a.sinks.k1.type = logger # 配置channel
a.channels.c1.type = memory
a.channels.c1.capacity = 1000
a.channels.c1.transactionCapacity = 100 # 组装
a.sources.r1.channels = c1
a.sinks.k1.channel = c1

如果a.sources.r1.bind = 0.0.0.0 这里设置的bind是127.0.0.1表示,只接受这个ip发来的信息,其余ip的信息不会被被flume接收。而设置为0.0.0.0则是任意ip的信息都会被flume监听接收

先启动flume,然后通过telnet在8888端口发送信息

参考链接:https://blog.csdn.net/qq_44823756/article/details/121832406

Flume概念和启动过程分析的更多相关文章

  1. [HDFS_add_1] HDFS 启动过程分析

    0. 说明 HDFS 文件概念 && HDFS 启动过程分析 1. HDFS 文件概念 [1.1 NameNode 职能] 存储文件类型.大小.权限.路径等等元数据 通过 edits( ...

  2. ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]

    入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢? .NET Web Development and Tools Blog ASP.NE ...

  3. 【Bootloader】bootloader启动过程分析

    Boot Loader启动过程分析 一.    Boot Loader的概念和功能 1.嵌入式Linux软件结构与分布在一般情况下嵌入式Linux系统中的软件主要分为以下及部分: (1)引导加载程序: ...

  4. Net Core MVC6 RC2 启动过程分析

    入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢?.NET Web Development and Tools Blog ASP.NET ...

  5. Linux内核分析(三)内核启动过程分析——构造一个简单的Linux系统

    一.系统的启动(各历史节点) 在最开始的时候,计算机的启动实际上依靠一段二进制码,可以这么理解,他并不是一个真正的计算机启动一道程序.计算机在开始加电的时候几乎是没有任何用处的,因为RAM芯片中包括的 ...

  6. 开机SystemServer到ActivityManagerService启动过程分析

    开机SystemServer到ActivityManagerService启动过程 一 从Systemserver到AMS zygote-> systemserver:java入层口: /** ...

  7. CDH中flume是已经启动着了…

    文章来自:http://www.cnblogs.com/hark0623/p/4174646.html   转发请注明 在CDH中用了几天flume后才发现,原来CDH中的flume默认是启动的……… ...

  8. Neutron分析(2)——neutron-server启动过程分析

    neutron-server启动过程分析 1. /etc/init.d/neutron-server DAEMON=/usr/bin/neutron-server DAEMON_ARGS=" ...

  9. linux视频学习7(ssh, linux启动过程分析,加解压缩,java网络编程)

    回顾数据库mysql的备份和恢复: show databases; user spdb1; show tables; 在mysql/bin目录下 执行备份: ./mysqldump -u root - ...

  10. Activity启动过程分析

    Android的四大组件中除了BroadCastReceiver以外,其他三种组件都必须在AndroidManifest中注册,对于BroadCastReceiver来说,它既可以在AndroidMa ...

随机推荐

  1. .NET周刊【12月第1期 2024-12-01】

    我在.NET Conf China 2024 等你! .NET Conf China 2024 是一场面向开发人员的社区盛会,旨在庆祝 .NET 9 的发布,并回顾过去一年 .NET 在中国的发展成就 ...

  2. 攻防世界:Web习题之 get_post

    攻防世界:Web习题之 get_post 题目内容 https://adworld.xctf.org.cn/challenges/list 题目首先需要我们用GET方式提交一个名为a,值为1的变量: ...

  3. C/C++源码扫描系列- Fortify 篇

    首发于 https://xz.aliyun.com/t/9276 概述 Fortify是一款商业级的源码扫描工具,其工作原理和codeql类似,甚至一些规则编写的语法都很相似,其工作示意图如下: 首先 ...

  4. Microsoft Build 2022 专家对话

    Microsoft Build 2022 专家对话 Build 2022 专家对话地址:https://mybuild.microsoft.com/en-US/sessions/81056450-6f ...

  5. 推荐 groovy 的 sql 模块

    发现 groovy 的 sql 很好用,写下来代码风格和 d2js 很像,唯一的不足是没有 sql{..} 块的设计,但对 Java 程序员来说它已经非常友好了,来自它的网站的一段示例: Now yo ...

  6. SpringBoot结合Liquibase实现数据库变更管理

    https://juejin.cn/post/7171232605478584328 https://juejin.cn/post/7170857098538909732 前言 研发过程中经常涉及到数 ...

  7. 03-FTP和TFTP命令

    http://www.h3c.com/cn/d_202101/1375275_30005_0.htm 1 FTP 1.1 FTP服务器配置命令 1.1.1 display ftp-server 1.1 ...

  8. Docker之操作系统Alpine

    简介 图 1.24.2.1 - Apline Linux 操作系统 Alpine 操作系统是一个面向安全的轻型 Linux 发行版.它不同于通常 Linux 发行版,Alpine 采用了 musl l ...

  9. Qt/C++编写手机版本视频播放器和Onvif工具(可云台和录像)

    一.前言 用Qt+ffmpeg写播放器很多人有疑问,为何不用Qt自己的多媒体框架来写,最重要的原因是Qt自带的目前都依赖具体的本地解码器,如果解码器不支持,那就是歇菜的,最多支持个MP4格式,而且在手 ...

  10. 总结几个Qt版本的冷知识

    Qt4.8.7是Qt4的终结版本,是Qt4系列版本中最稳定最经典的(很多嵌入式板子还是用Qt4.8),其实该版本是和Qt5.5差不多时间发布的.参考链接 https://www.qt.io/blog/ ...