一、概念

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. ZCMU-1101

    这个题不怎么难,就是当时没有理解到字典序的意思:我一直以为是自己元素间的比较,后再同学帮助下明白这里是与其他比,这样就很简单了.就是要求当前那个最小就可以了. 对这道题我有点吐槽明明自己都说了最后一组 ...

  2. web移动端基础

    1.像素密度 PPI 说到屏幕就离不开2个因素,屏幕大小和屏幕分辨率. PPI是Pixels Per Inch缩写,pixels per inch所表示的是每英寸所拥有的像素(pixel)数目. PP ...

  3. cas5配置LDAP的域控验证

    ​pom.xml 在这个下面添加LDAP依赖: <!-- ...Additional dependencies may be placed here... --> <dependen ...

  4. 史上最牛X的微信公众号!

    今天给大家推荐一个最牛逼的微信公众号,专注分享技术干货,包括但不限于Java,HTML,JavaScript,MySQL,Redis,Windows,Linux,Spring,SpringBoot,V ...

  5. HttpClientFactory in ASP.NET Core 2.1 Part 5: 日志

    HttpClientFactory in ASP.NET Core 2.1 Part 5: 日志 原文地址:https://www.stevejgordon.co.uk/httpclientfacto ...

  6. 【C#】【平时作业】习题-8-异常处理

    目录 一.概念题 什么是异常处理? 异常处理的语法结构是什么? finally块有何作用? throw语句有何作用? 二.程序设计 一.概念题 什么是异常处理? 异常是在程序执行期间出现的问题.C# ...

  7. 【SpringMVC】获取请求参数的方式

    SpringMVC获取请求参数的方式 目录 SpringMVC获取请求参数的方式 方式1:ServletAPI 方法2:通过控制器方法的形参获取请求参数 方法3:@RequestParam 方法4:@ ...

  8. Qt音视频开发01-共享解码线程(耗时一年/性能凶残/至臻完美)

    一.前言 大概在8年前就开始用ffmpeg做视频解码的显示,第一个版本就100行代码左右,功能极其简单,就是开个线程解码视频流转成图片发给主界面绘制.时间过得真快,从当初的一胎到现在二胎都上学了三胎计 ...

  9. Qt编写地图综合应用57-跨平台(win、linux、mac、uos、kylin等)

    一.前言 跨平台着实花了不少的精力,为了从Qt4.7兼容到Qt6.2及后续版本,头发掉了不少,仅有的几根毛所剩无几,哎,可能这就是程序员的命,本人写Qt程序这么多年,比较喜欢支持多个Qt版本,尤其是钟 ...

  10. error: undefined reference to `cv::imread(cv::String const&, int)' 解决方法

    方法1 原文链接:https://blog.csdn.net/WhiteLiu/article/details/72901520 编译时出现下列错误: undefined reference to ' ...