Flume 监控配置和实践
要解释 Flume 的监控机制,需要了解 Flume 是如何设计其监控架构的,以及如何将性能指标暴露给用户或集成工具。下面我将详细分解 Flume 的监控机制,从基础架构、实现原理到源码解析,并提供非专业人也能理解的通俗解释。
Flume 的监控架构
Flume 的监控架构分为以下几个部分:
- 监控指标的收集:Flume 的每个组件(Source、Channel、Sink)都会通过内置的监控逻辑统计运行时的性能指标(如事件速率、处理错误、队列深度等)。
- 监控数据的暴露:这些指标会通过 JMX 或 HTTP 接口暴露给外部工具。
- 外部工具集成:通过开放接口将这些监控数据集成到外部监控系统中。
详细实现原理与流程
1. 指标的定义和收集
Flume 内部有一个 Instrumentation(仪表)系统,用于定义和收集各类监控指标。
-
核心概念:
Flume 的每个组件(Source、Channel 和 Sink)都实现了一个 Monitorable 接口。这个接口规定了组件如何收集自己的监控数据。主要接口定义:
public interface Monitorable {String getName(); // 获取组件名称Map<String, String> getMetrics(); // 返回指标的键值对 }
指标示例:
- Source:接收的事件速率、累计事件数、失败次数。
- Channel:当前事件数、容量利用率、读取/写入速率。
- Sink:发送速率、成功发送事件数、失败次数。
-
源码逻辑:
Flume 内部的每个组件都有对应的 Instrumentation 实现。例如,Channel 的实现类 MemoryChannel 会统计当前队列的大小和容量:@Override public Map<String, String> getMetrics() {Map<String, String> metrics = new HashMap<>();metrics.put("ChannelSize", String.valueOf(queue.size()));metrics.put("ChannelCapacity", String.valueOf(capacity));return metrics; }
2. 数据的存储与更新
每个组件的监控指标会实时更新,并存储在 Flume 的内存中。
-
MetricsStorage 机制:
Flume 使用一个 MetricsRegistry 注册表来集中存储和管理这些监控指标。每次组件状态发生变化时,都会通过注册表更新相应的数据。核心代码:
MetricsRegistry metricsRegistry = new MetricsRegistry(); metricsRegistry.addMetric("Source.EventReceived", eventReceivedCount); metricsRegistry.addMetric("Source.EventFailed", eventFailedCount);
作用:
- MetricsRegistry 是一个线程安全的数据结构,可以同时被多个组件更新和读取。
- 它负责维护所有组件的监控数据,提供统一的访问接口。
3. 数据的暴露机制
Flume 将监控数据暴露给外部主要通过两种方式:JMX 和 HTTP。
(1) JMX 暴露
-
原理:
JMX 是 Java 自带的管理扩展框架,允许应用程序通过标准接口暴露内部状态,提供内置的监控功能。Flume 的每个组件都会注册一个 JMX MBean,将自己的监控数据暴露给 JMX 客户端。 -
代码实现:
Flume 的每个 Monitorable 组件都会注册为一个 MBean。以 Source 为例:ManagementFactory.getPlatformMBeanServer().registerMBean(new SourceInstrumentation(source), new ObjectName("flume:type=Source,name=MySource"));
外部工具访问:
用户可以通过 JMX 客户端(如 JConsole 或 VisualVM)实时查看这些监控数据。
可以监控以下指标:- Source:事件接收速率、累计事件数、错误次数等。
- Channel:当前事件数量、容量使用率、读写速率等。
- Sink:发送速率、累计发送事件数、错误次数等。
(2) HTTP 暴露
-
原理:
Flume 内置了一个简单内置的 HTTP 服务,将监控指标以 JSON 格式的状态数据暴露在指定端口上。默认情况下,HTTP 端口是41414
。
示例:curl http://<hostname>:41414/metrics
返回的数据包括每个组件的详细状态,可以解析和分析。
-
代码实现:
Flume 的 HTTP 监控模块通过 MetricsServlet 实现:public class MetricsServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) {Map<String, String> metrics = metricsRegistry.getAllMetrics();resp.getWriter().write(new Gson().toJson(metrics));} }
示例输出:
{"Source.EventReceived": "1000","Channel.ChannelSize": "500","Sink.EventSent": "950" }
下面是较为全面的参数:
{"CHANNEL.memoryChannel": {"ChannelCapacity": "550000","ChannelFillPercentage": "0.18181818181818182","Type": "CHANNEL","ChannelSize": "1000","EventTakeSuccessCount": "33541400","EventTakeAttemptCount": "33541527","StartTime": "1536572886273","EventPutAttemptCount": "33542500","EventPutSuccessCount": "33542500","StopTime": "0"},"SINK.hdfsSink": {"ConnectionCreatedCount": "649","ConnectionClosedCount": "648","Type": "SINK","BatchCompleteCount": "335414","BatchEmptyCount": "27","EventDrainAttemptCount": "33541500","StartTime": "1536572886275","EventDrainSuccessCount": "33541400","BatchUnderflowCount": "0","StopTime": "0","ConnectionFailedCount": "0"},"SOURCE.avroSource": {"EventReceivedCount": "33542500","AppendBatchAcceptedCount": "335425","Type": "SOURCE","EventAcceptedCount": "33542500","AppendReceivedCount": "0","StartTime": "1536572886465","AppendAcceptedCount": "0","OpenConnectionCount": "3","AppendBatchReceivedCount": "335425","StopTime": "0"}
}
参数说明:
字段名称 | 含义 | |
---|---|---|
SOURCE.OpenConnectionCount | 打开的连接数 | |
SOURCE.TYPE | 组件类型 | |
SOURCE.AppendBatchAcceptedCount | 追加到channel中的批数量 | |
SOURCE.AppendBatchReceivedCount | source端刚刚追加的批数量 | |
SOURCE.EventAcceptedCount | 成功放入channel的event数量 | |
SOURCE.AppendReceivedCount | source追加目前收到的数量 | |
SOURCE.StartTime(StopTime) | 组件开始时间、结束时间 | |
SOURCE.EventReceivedCount | source端成功收到的event数量 | |
SOURCE.AppendAcceptedCount | source追加目前放入channel的数量 | |
CHANNEL.EventPutSuccessCount | 成功放入channel的event数量 | |
CHANNEL.ChannelFillPercentage | 通道使用比例 | |
CHANNEL.EventPutAttemptCount | 尝试放入将event放入channel的次数 | |
CHANNEL.ChannelSize | 目前在channel中的event数量 | |
CHANNEL.EventTakeSuccessCount | 从channel中成功取走的event数量 | |
CHANNEL.ChannelCapacity | 通道容量 | |
CHANNEL.EventTakeAttemptCount | 尝试从channel中取走event的次数 | |
SINK.BatchCompleteCount | 完成的批数量 | |
SINK.ConnectionFailedCount | 连接失败数 | |
SINK.EventDrainAttemptCount | 尝试提交的event数量 | |
SINK.ConnectionCreatedCount | 创建连接数 | |
SINK.Type | 组件类型 | |
SINK.BatchEmptyCount | 批量取空的数量 | |
SINK.ConnectionClosedCount | 关闭连接数量 | |
SINK.EventDrainSuccessCount | 成功发送event的数量 | |
SINK.BatchUnderflowCount | 正处于批量处理的batch数 |
注意问题:每个任务都需要占用一个端口,且需要不停调用端口来获取json格式数据,占用资源。
(3) 日志监控(不是暴露机制,但是也可以算是一个方法)
Flume 会生成详细的日志文件,记录运行状态、错误和异常信息。日志文件可以通过以下方式进行监控:
- 使用 grep 定期检查错误日志。
- 配置 Log4j 的日志级别,设置为
INFO
或DEBUG
以获取更详细的信息。 - 使用日志收集工具(如 ELK、Splunk)集中分析日志。
4. 外部集成与可视化
Flume 暴露的监控数据可以通过以下工具进一步处理和可视化:
- Prometheus 集成:
使用 JMX Exporter 或 HTTP Exporter 将 Flume 的监控数据转换为 Prometheus 格式。 - Grafana 可视化:
从 Prometheus 中获取 Flume 指标,创建实时监控面板。 - 定制化监控脚本:
用户可以通过 HTTP 接口抓取数据,编写自己的报警或分析脚本。
生产环境中:Apache Flume 与 Prometheus 集成-CSDN博客
- Nagios 或 Zabbix
配置定制化的监控插件,定期检查 Flume 运行状态和性能指标。 - Ganglia
Flume 提供对 Ganglia 的支持,可以将监控指标直接发送到 Ganglia。
自定义监控
Flume 支持自定义监控指标,开发者可以基于 Flume 的 Monitoring
API 编写自定义的监控程序:
- 编写监控报告器
使用 Flume 的org.apache.flume.instrumentation
包,获取组件运行状态。 - 接入内部监控系统
将采集到的指标发送到公司内部的监控系统(如 Kafka、InfluxDB)。
报警设置
通过结合日志、JMX 或外部工具,设置报警机制:
- 数据流量突然下降或停止。
- Channel 长时间高负载或已满。
- Source 或 Sink 出现高错误率。
完整流程总结
- Flume 的每个组件实现了 Monitorable 接口,收集自身的性能指标。
- 指标通过 MetricsRegistry 集中管理,并实时更新。
- Flume 将这些指标通过 JMX 和 HTTP 暴露出来。
- 用户或外部工具通过这些接口抓取监控数据,进行分析和报警。
通俗解释
-
想象 Flume 是一座工厂:
- Source 是原材料进来的门卫,统计有多少原材料进来(事件数)。
- Channel 是存放原材料的仓库,记录仓库的容量和存货。
- Sink 是成品运出的通道,统计每天运出多少成品。
-
监控的工作方式:
每个部门(Source、Channel、Sink)都会用一个计数器记录自己的工作情况。
然后,这些记录通过两种方式展示出来:- JMX:像管理者的内部管理系统,可以实时查看每个部门的状态。
- HTTP:像一个报表系统,每隔一段时间生成一份公开的统计报告。
通过这种架构设计,Flume 能够在运行时持续监控自己的健康状态,并提供丰富的接口供用户扩展和分析。
相关文章:
Flume 监控配置和实践
要解释 Flume 的监控机制,需要了解 Flume 是如何设计其监控架构的,以及如何将性能指标暴露给用户或集成工具。下面我将详细分解 Flume 的监控机制,从基础架构、实现原理到源码解析,并提供非专业人也能理解的通俗解释。 Flume 的监…...
深度学习基础1
目录 1. 深度学习的定义 2.神经网络 2.1. 感知神经网络 2.2 人工神经元 2.2.1 构建人工神经元 2.2.2 组成部分 2.2.3 数学表示 2.2.4 对比生物神经元 2.3 深入神经网络 2.3.1 基本结构 2.3.2 网络构建 2.3.3 全连接神经网络 3.神经网络的参数初始化 3.1 固定值初…...
《FPGA开发工具》专栏目录
《FPGA开发工具》专栏目录 1.Vivado开发 1.1使用相关 Vivado工程创建、仿真、下载与固化全流程 Vivado工程快速查看软件版本与器件型号 Vivado IP核的快速入门 官方手册和例程 Vivado中对已调用IP核的重命名 Vivado中增加源文件界面中各选项的解释 Vivado IP中Generate…...
李春葆《数据结构》-查找-课后习题代码题
一:设计一个折半查找算法,求查找到关键字为 k 的记录所需关键字的比较次数。假设 k 与 R[i].key 的比较得到 3 种情况,即 kR[i].key,k<R[i].key 或者 k>R[i].key,计为 1 次比较(在教材中讨论关键字比…...
【Git】:分支管理
目录 理解分支 创建分支 切换分支 合并分支 删除分支 合并冲突 分支管理策略 快进合并 正常合并 bug 分支 总结 理解分支 在版本控制系统中,分支是一条独立的开发线路。它允许开发者从一个主要的代码基线(例如master分支)分离出来…...
C、C++ 和 Java的区别
C、C 和 Java 是三种广泛使用的编程语言,它们各有特点,适合不同的应用场景。以下从多个角度对它们的区别进行分析: 基础特性 特性CCJava语言类型过程式编程语言过程式 面向对象编程语言纯面向对象编程语言(也支持过程式&#x…...
【Python-Open3D学习笔记】005Mesh相关方法
TriangleMesh相关方法 文章目录 TriangleMesh相关方法1. 查看mesh三角形面信息2. 可视化三角形3. 上采样4. 计算mesh形成的面积和体积 1. 查看mesh三角形面信息 def view_hull_triangles(hull: o3d.geometry.TriangleMesh):"""查看mesh三角形面信息(…...
js原型、原型链和继承
文章目录 一、原型1、prototype2、constructor 二、原型链1、字面量原型链2、字面量继承3、构造函数的原型链4、Object.create5、Object.setPrototypeOf 三、继承1、构造函数继承2、原型链继承3、组合继承 四、常见链条1、Function2、Object.prototype 继承是指将特性从父代传递…...
团队自创【国王的魔镜-2】
国王的魔镜-2 题目描述 国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话&am…...
c++编程玩转物联网:使用芯片控制8个LED实现流水灯技术分享
在嵌入式系统中,有限的GPIO引脚往往限制了硬件扩展能力。74HC595N芯片是一种常用的移位寄存器,通过串行输入和并行输出扩展GPIO数量。本项目利用树莓派Pico开发板与74HC595N芯片,驱动8个LED实现流水灯效果。本文详细解析项目硬件连接、代码实…...
【Jenkins】docker 部署 Jenkins 踩坑笔记
文章目录 1. docker pull 超时2. 初始化找不到 initialAdminPassword 1. docker pull 超时 docker pull 命令拉不下来 docker pull jenkins/jenkins:lts-jdk17 Error response from daemon: Get "https://registry-1.docker.io/v2/": 编辑docker配置 sudo mkdir -…...
Unreal Engine使用Groom 打包后报错
Unreal Engine使用Groom打包后报错 版本5.4.4 blender 4.2.1 项目头发用了groom,运行后报错 错误: Assertion failed: Offset BytesToRead < UncompressedFileSize && Offset > 0 [File:E:\UnrealEngine-5.4.4-release\Engine\Source\R…...
嵌入式QT学习第3天:UI设计器的简单使用
Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 Qt Creator 里自带的 Qt Designer,使用 Qt Designer 比较方便的构造 UI 界 面。 在 UI 文件添加一个按钮 左边找到 Push Button,然后拖拽到中…...
【连接池】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...
图论入门编程
卡码网刷题链接:98. 所有可达路径 一、题目简述 二、编程demo 方法①邻接矩阵 from collections import defaultdict #简历邻接矩阵 def build_graph(): n, m map(int,input().split()) graph [[0 for _ in range(n1)] for _ in range(n1)]for _ in range(m): …...
在Java中使用Apache POI导入导出Excel(三)
本文将继续介绍POI的使用,上接在Java中使用Apache POI导入导出Excel(二) 使用Apache POI组件操作Excel(三) 24、拆分和冻结窗格 您可以创建两种类型的窗格;冻结窗格和拆分窗格。 冻结窗格按列和行进行拆分。您创建…...
UR开始打中国牌,重磅发布国产化协作机器人UR7e 和 UR12e
近日,优傲(UR)机器人公司立足中国市场需求,重磅推出UR7e和UR12e 两款本地化协作机器人。它们延续优傲(UR)一以贯之的高品质与性能特质,着重优化负载自重比,且在价格层面具竞争力&…...
FRU文件
FRU(Field Replaceable Unit)源文件的格式通常遵循IPMI FRU Information Storage Definition标准。在实际应用中,FRU源文件可以是JSON格式的,这种格式允许用户指定所有的FRU信息字段。以下是FRU源文件的JSON格式的一些关键点&…...
AI需求条目化全面升级!支持多格式需求,打破模板限制!
AI需求条目化全面升级!支持多格式需求,打破模板限制! 一、多格兼济 标准立成 1、功能揭秘 预览未来 平台需求板块的AI需求条目化功能迎来全面升级。它支持多种需求格式,不再受限于模板文件,能够一键自动快速且灵活地生…...
Java—I/O流
Java的I/O流(输入/输出流)是用于在程序和外部资源(如文件、网络连接等)之间进行数据交换的机制。通过I/O流,可以实现从外部资源读取数据(输入流)或将数据写入外部资源(输出流&#x…...
Huginn服务部署
工作中需要使用爬虫系统,做为技术选型需要对Huginn系统进行部署并进行功能验证。下面的文章会记录了Huginn的部署过程,本次部署采用的Ubuntu-23.0.4系统,使用Docker部署。部署过程需要翻墙。 一、安装Docker 删除旧版本 sudo apt-get remo…...
深入解析Java数据包装类型:特性、机制与最佳实践
文章目录 1. 基本概念2. 自动装箱与拆箱3. 缓存机制4. 不可变性5. 常见陷阱与最佳实践a. 空指针异常b. 不要用 比较两个包装类实例c. 高精度计算d. 字符串解析 总结 1. 基本概念 Java提供了每个基本数据类型的包装类,位于java.lang包中。这些包装类允许我们将基本…...
【Java基础入门篇】二、控制语句和递归算法
Java基础入门篇 二、控制语句和递归算法 2.1 switch-case多分支选择语句 switch执行case语句块时,若没有遇到break,则运行下一个case直到遇到break,最后的default表示当没有case与之匹配时,默认执行的内容,代码示例如…...
PostgreSQL WAL日志膨胀处理
作者:Digital Observer(施嘉伟) Oracle ACE Pro: Database PostgreSQL ACE Partner 11年数据库行业经验,现主要从事数据库服务工作 拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、P…...
用户该怎么管理维护自己的服务器?
管理和维护自己的服务器是确保其长期稳定、高效和安全运行的重要任务。以下是一些关键的服务器管理和维护的步骤和建议,适用于Linux或Windows服务器。 1.定期备份数据 定期备份是防止数据丢失和恢复故障的关键步骤。备份策略应包括: 全量备份:…...
【MYSQL数据库相关知识介绍】
MySQL 在我们日常技术中是一个广泛使用的开源关系型数据库管理系统,所以作为测试同学,掌握mysql的相关知识是必不可少的技能之一,所以小编从软件测试的角色出发,来整理一些跟测试相关的知识,希望能够帮助到大家。 一、…...
初窥 HTTP 缓存
引言 对于前端来说, 你肯定听说过 HTTP 缓存。 当然不管你知不知道它, 对于提高网站性能和用户体验, 它都扮演着重要的角色! 它通过在客户端和服务器之间存储和重用先前获取的资源副本, 来减少网络流量和降低资源加载时间, 从而提升用户体验! 以下是 HTTP 缓存的重要性: 减少…...
yolov8的深度学习环境安装(cuda12.4、ubuntu22.04)
目录 一、先安装基础环境包 1.首先给Ubuntu安装Chrome浏览器(搜索引擎换成百度即可) 2、ubuntu 22.04中文输入法安装 3、安装 terminator 4、安装WPS for Linux 5、安装其它之前需要先安装anaconda 6、安装配置anaconda 7、安装完成anaconda后创建…...
RSA算法和AES算法,哪种更安全
目录 一、RSA (非对称加密算法) 二、AES (对称加密算法) 三、对比总结 四、更安全的选择 五、结合使用:RSA AES RSA 和 AES 是两种不同类型的加密算法,适用于不同的场景,因此它们的安全性不能直接比较,而是取决于具体的应用…...
Vue教程|搭建vue项目|Vue-CLI新版脚手架
一、安装Node环境 安装Node及Npm环境 Node下载地址:Node.js — Run JavaScript EverywhereNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en/ 安装完成后,检查安装是否成功,并检查版本,命令如下: node -v npm -v mac@Macd…...
推荐网站在线看兄弟们/广州疫情最新动态
2019独角兽企业重金招聘Python工程师标准>>> 一、框架原理 sqlMapConfig.xml:(是mybatis的全局配置文件,名称不固定的)配置了数据源、事务等mybatis运行环境 mapper.xml:配置sql语句 SqlSessionFactory:(会…...
做网站接私单/seox
def get_tags_list(input_file):#统计NER数据集中标签的种类with open(input_file, r, encodingutf-8) as f:tags_list []lines f.readlines()seq_sum 0word_sum 0for line in lines:#对每一行if line.isspace() False:for i,word in enumerate(line):if word.isspace()Tr…...
织梦做英文网站/seo网站技术培训
Atitit .h5文件上传 v3 1. 上传原理1 2. V3版新特性1 3. Html1 4. Js2 5. uploadV2.js2 6. upServlet & FileUploadService {3 7. 注意::去除struts的干扰3 8. 参考4 1. 上传原理 FormData apache io 2. V3版新特性 组件化 ࿰…...
云南定制化网站建设/seopeix
题意: 用n个木棒凑成数字,和最大是多少 思路: 直接dp写。 #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #include<iostream>typedef long long ll; using namespace std; const…...
wordpress视频略缩图/域名解析查询工具
这篇文章主要为大家详细介绍了python小程序: 剪子,石头,布实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 闲来无事,写一个小程序,练习一下python,哈哈: #!/usr/bin/env python #co…...
网站开发需要的编程软件/线上营销推广公司
1.1 RIP概述 1、静态路由的缺点 不能响应网络拓扑的变化 2、RIP协议的特性 内部网关协议(Interior Gateway Protocol)距离矢量(Distance-Vector)算法的协议它使用跳数(Hop Count)作为度量来衡量到达目的…...