【排查案例】无认证集群空白分区创建元凶排查记录

无认证集群空白分区创建元凶排查记录

  • 前言
  • 正文
    • SparkSQL Thrift审计
    • 通过edit查找操作
    • 抓包分析请求
    • NodeManager日志追踪
    • 结论
  • 后记

前言

今天分享一个最近在生产环境排查的空白分区的问题,先说业务感知,业务那边反馈本身这条业务链每个小时数据应该是3个分区,但是在业务链末端的输出数据中产生了4个分区,其中一个是空白分区,目前业务能够确认那个空白分区压根是不需要的,但是并不确定是什么位置出现的这个分区。

集群的信息大概说明一下,首先没有开审计日志,其次没有开kerberos,也没有ranger这种权限管理,所以这块基本是没法从日志分析出操作细节的。

分区添加可以通过sparksql的thrift,也可能直接启了一个sparksql做操作,因此,接到这个问题以后感觉还是挺摸不着头脑的,但是只要是人做的就一定有蛛丝马迹存在,下面说一下我的整个排查过程。

在这里插入图片描述

正文

SparkSQL Thrift审计

集群有几个常驻的SparkSQL Thrift用来平时做一些快速查询,这几个是开了审计日志的,在问题传达到我这后我第一时间检查了审计日志,并没有相关分区的创建历史,因此直接排除通过thrift进行创建这条路

通过edit查找操作

前面已经说了,我们HDFS没有审计日志,并且NameNode日志是INFO级别,不会记录目录创建的信息,但是我们知道NameNode有一个edit可以记录一段时间内详细的操作信息,因此,我们可以优先根据分区信息,找到edit文件。

直接在hdfs列出指定日期下的空白分区的信息:

hadoop fs -ls /$path/2025-01-21/*|grep 100003

从中选择一个分区信息直接在NameNode的edit目录下grep搜索,然后将指定的edit解析成xml文件

hdfs oev -i edits_0000000105678248337-0000000105678297660 -o /data4/edit_bak/edits_1027.xml

在这里插入图片描述
下面是解析出来的xml种有关问题分区创建的信息:

  <RECORD>
    <OPCODE>OP_MKDIR</OPCODE>
    <DATA>
      <TXID>105678280997</TXID>
      <LENGTH>0</LENGTH>
      <INODEID>20403610530</INODEID>
      <PATH>$path</PATH>
      <TIMESTAMP>1737425813445</TIMESTAMP>
      <PERMISSION_STATUS>
        <USERNAME>mr</USERNAME>
        <GROUPNAME>users</GROUPNAME>
        <MODE>488</MODE>
      </PERMISSION_STATUS>
    </DATA>
  </RECORD>

这个操作的具体时间戳就拿到了,我们可以把操作的具体时间定位到秒级:
在这里插入图片描述

抓包分析请求

对于这种非安全集群,已有条件是不可能追踪请求的,但是我们可以通过tcpdump在NameNode进行抓包,来捕捉具体的请求,原因是客户端执行的操作质量都会经过NameNode,因此只要监听RPC端口就可以,分区的创建操作是每个小时都有,因此我们只需要抓一个小时做排查就行;

需要注意的是,tcpdump抓NameNode的请求包可能量很大,为了方便分析,我们最好分包保存

使用下面命令进行分包保存,筛掉本机的请求:

tcpdump -i bond0 -G 60 -nn 'host 10.0.0.1 and port 9000 and not src 10.0.0.1' -w tcpdump/capture_%H%M%S.pcap 

上面的命令解释一下:

  • -i指定了网卡设备名称是bond0
  • -G指定60秒滚动一个pcap文件
  • -nn不使用主机名,而是直接使用ip
  • 抓取host 10.0.0.1的9000端口并且源端ip不为10.0.0.1
  • -w写入的pcap文件名,%H%M%S使用当前时间来命名文件

然后我们根据edit里面查到的分区创建操作,取对应时间的数据包做分析即可,下面是我们用wireshark拆包的界面:

在这里插入图片描述
这里请求是很多的,我们要用筛选器直接筛选数据包中包含我们业务分区的内容,在筛选框直接筛选:

data contains "partition=100003"

这里就抓到了mkdir操作创建了100003分区,并且所有请求都来自于一个NodeManager存算节点
在这里插入图片描述

到这里我们基本可以确认是Spark任务或者一个SparkSQL实例进行的分区创建,因为集群是Spark on Yarn,下一步我们直接通过NodeManager日志做进一步的排查

NodeManager日志追踪

到这里,我们只要找到指定发包时间的指定节点在进行什么操作连接NameNode就可以了,从抓包情况我们可以知道大概率是一个任务进行的操作,那么我们直接从NodeManager运行日志过滤10点以后得Start Container Request操作:

cat yarn-mr-NodeManager.log |grep "Start Container Request" > /tmp/nodemanager.log

我们将得到类似下面这样的日志信息:

2025-01-21 10:00:28,712 INFO org.apache.hadoop.yarn.server.nodemanager.NMAuditLogger: USER=mr   IP=10.0.0.4  OPERATION=Start Container Request       TARGET=ContainerManageImpl      RESULT=SUCCESS    APPID=application_1684894983964_217978895       CONTAINERID=container_e77_1684894983964_217978895_01_000127
2025-01-21 10:00:28,754 INFO org.apache.hadoop.yarn.server.nodemanager.NMAuditLogger: USER=mr   IP=10.0.0.4  OPERATION=Start Container Request       TARGET=ContainerManageImpl      RESULT=SUCCESS    APPID=application_1684894983964_217978895       CONTAINERID=container_e77_1684894983964_217978895_01_000126
2025-01-21 10:00:28,759 INFO org.apache.hadoop.yarn.server.nodemanager.NMAuditLogger: USER=mr   IP=10.0.0.4  OPERATION=Start Container Request       TARGET=ContainerManageImpl      RESULT=SUCCESS    APPID=application_1684894983964_217978895       CONTAINERID=container_e77_1684894983964_217978895_01_000125
2025-01-21 10:00:28,759 INFO org.apache.hadoop.yarn.server.nodemanager.NMAuditLogger: USER=mr   IP=10.0.0.4  OPERATION=Start Container Request       TARGET=ContainerManageImpl      RESULT=SUCCESS    APPID=application_1684894983964_217978895       CONTAINERID=container_e77_1684894983964_217978895_01_000128

其实我们只需要appid,所以也可以直接这样筛选出来:


cat yarn-mr-NodeManager.log|grep "2025-01-21 10"|grep "Start Container "|awk -F'APPID=' '{split($2, a, " "); if (a[1] != "") appid[a[1]]} END {for (id in appid) print id}'

在这里插入图片描述

因为每个任务的任务名都和其业务有关,所以接下来我们直接排查任务逻辑,就能够定位到具体的操作逻辑是谁做的了;

结论

最终,我确认到这个问题是由2年前的算法逻辑导致,对应SQL在执行具体业务逻辑前,对其前向表进行了分区添加操作:

在这里插入图片描述

后记

整个问题排查到这里就已经盖棺定论了,可以看出,一个大数据集群的权限管理以及审计系统真的非常重要,虽然因为历史原因这个集群无法再去做这些东西,但是如果有小伙伴在自建大数据平台,一定要注意这个。

另外,真的遇到问题的时候,还是要多思考,尤其是遇到这种周期出现的问题时,只要问题还没解决,那么就想办法做足准备,在下次发生时抓住罪魁祸首,这期间就要运用自己的知识技能理清整个数据流向、工作原理,将脉络清晰化,而不是像无头苍蝇一样乱撞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957647.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

音频入门(一):音频基础知识与分类的基本流程

音频信号和图像信号在做分类时的基本流程类似&#xff0c;区别就在于预处理部分存在不同&#xff1b;本文简单介绍了下音频处理的方法&#xff0c;以及利用深度学习模型分类的基本流程。 目录 一、音频信号简介 1. 什么是音频信号 2. 音频信号长什么样 二、音频的深度学习分…

语义分割文献阅读-SegNet:一种用于图像分割的深度卷积编码器-解码器架构(1.13-1.19)

目录 摘要 Abstract 1 引言 2 SegNet架构 2.1 编码器网络 2.2 解码器网络 2.3 最大池化索引(Max-pooling Indices) 3 训练SegNet 3.1 加载预训练权重 3.2 构建MyDataset类 3.3 训练 4 测试 总结 摘要 本周阅读的论文题目是《SegNet&#xff1a;A Deep Convoluti…

深度学习核函数

一、核函数的基本概念 核函数在机器学习中具有重要应用价值&#xff0c;常用于支持向量机&#xff08;SVM&#xff09;等算法中。 核函数是面试中经常被考到的知识点&#xff0c;对于找工作和实际数据转换都有重要作用。 二、数据建模与核函数的作用 数据越多&#xff0c;可…

.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

2024年智慧消防一体化安全管控年度回顾与2025年预测

随着科技的飞速发展&#xff0c;智慧营区一体化安全管控在2024年取得了显著进展&#xff0c;同时也为2025年的发展奠定了坚实基础。 2024年年度回顾 政策支持力度持续加大&#xff1a;国家对消防安全的重视程度不断提高&#xff0c;出台了一系列涵盖技术创新、市场应用、人才培…

抖音小程序一键获取手机号

前端代码组件 <button v-if"!isFromOrderList"class"get-phone-btn" open-type"getPhoneNumber"getphonenumber"onGetPhoneNumber">一键获取</button>// 获取手机号回调onGetPhoneNumber(e) {var that this tt.login({f…

【线性代数】列主元法求矩阵的逆

列主元方法是一种用于求解矩阵逆的数值方法&#xff0c;特别适用于在计算机上实现。其基本思想是通过高斯消元法将矩阵转换为上三角矩阵&#xff0c;然后通过回代求解矩阵的逆。以下是列主元方法求解矩阵 A A A 的逆的步骤&#xff1a; [精确算法] 列主元高斯消元法 步骤 1&am…

从零开始:Spring Boot核心概念与架构解析

引言 在当今的Java开发领域&#xff0c;Spring Boot已经成为构建企业级应用的首选框架之一。它以其简洁、高效、易于上手的特点&#xff0c;极大地简化了Spring应用的开发过程。本文将从Spring Boot的核心概念入手&#xff0c;深入解析其架构设计和运行原理&#xff0c;帮助读…

后端面试题分享第一弹(状态码、进程线程、TCPUDP)

后端面试题分享第一弹 1. 如何查看状态码&#xff0c;状态码含义 在Web开发和调试过程中&#xff0c;HTTP状态码是了解请求处理情况的重要工具。 查看状态码的步骤 打开开发者工具&#xff1a; 在大多数浏览器中&#xff0c;您可以通过按下 F12 键或右键单击页面并选择“检查…

7、数组知识点汇总

一、 数组基本概念 程序算法数据结构 算法&#xff1a;解决程序的流程步骤数据结构&#xff1a;将数据按照某种特定的结构来存储设计良好的数据结构会导致良好的算法。ArrayList、LinkedList 数组是最简单的数据结构。 1、数组&#xff1a; 数组&#xff1a;存放同一种类型…

计算机网络 (48)P2P应用

前言 计算机网络中的P2P&#xff08;Peer to Peer&#xff0c;点对点&#xff09;应用是一种去中心化的网络通信模式&#xff0c;它允许设备&#xff08;或节点&#xff09;直接连接并共享资源&#xff0c;而无需传统的客户端-服务器模型。 一、P2P技术原理 去中心化架构&#…

【技巧】优雅的使用 pnpm+Monorepo 单体仓库构建一个高效、灵活的多项目架构

单体仓库&#xff08;Monorepo&#xff09;搭建指南&#xff1a;从零开始 单体仓库&#xff08;Monorepo&#xff09;是一种将多个相关项目集中管理在一个仓库中的开发模式。它可以帮助开发者共享代码、统一配置&#xff0c;并简化依赖管理。本文将通过实际代码示例&#xff0…

包文件分析器 Webpack Bundle Analyzer

webpack-bundle-analyzer 是一个非常有用的工具&#xff0c;用于可视化和分析 Webpack 打包生成的文件。这使得开发者能够更好地理解应用的依赖关系、包的大小&#xff0c;以及优化打包的机会。以下是关于 webpack-bundle-analyzer 的详细介绍&#xff0c;包括它的安装、使用以…

重学SpringBoot3-WebClient配置与使用详解

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞??收藏评论 重学SpringBoot3-WebClient配置与使用详解 1. 简介2. 环境准备 2.1 依赖配置 3. WebClient配置 3.1 基础配置3.2 高级配置3.3 retrieve()和exchange()区别 4. 使用示例 4.1 基本请求操…

持续升级《在线写python》小程序的功能,文章页增加一键复制功能,并自动去掉html标签

增加复制按钮后的界面是这样的 代码如下&#xff1a; <template><view><x-header></x-header><view class"" v-if"article_info"><view class"kuai bgf"><view class"ac fs26"><img sr…

今天也是记录小程序进展的一天(破晓时8)

嗨嗨嗨朋友们&#xff0c;今天又来记录一下小程序的进展啦&#xff01;真是太激动了&#xff0c;项目又迈出了重要的一步&#xff0c;231啦&#xff01;感觉每一步的努力都在积累&#xff0c;功能逐渐完善&#xff0c;离最终上线的目标越来越近了。大家一直支持着这个项目&…

启动虚拟机中客户机后导致电脑蓝屏的解决办法

不考虑重新安装虚拟机的解决办法有两种&#xff1a; vmx文件破损时使用 1&#xff09;删除CentOS 64-bit.vmx文件 2&#xff09;打开vmware-0.log文件&#xff0c;找到CONFIGURATION 和 USER DEFAULTS 并把这两个之间的内容拷贝出来 删除框出来的部分&#xff0c;复制框出来的…

Word2Vec中的CBOW模型训练原理详细解析

Word2Vec中的CBOW模型训练原理详细解析 1. CBOW模型概述 CBOW模型的训练目标是利用一个单词周围的上下文单词来预测该单词本身。具体来说&#xff0c;给定当前单词的上下文单词&#xff0c;通过训练神经网络来最大化当前单词出现在这些上下文单词中的概率。 2. 模型结构 CB…

Android Studio打包APK

1.导出APK安装包 如果是首次打包&#xff0c;Create new 单击蓝色对话框右边文件夹&#x1f4c2;图标 &#xff0c;选择密钥保存路径&#xff0c;然后在下方File name对话框中填写您想要名称&#xff0c;再点击OK回到密钥创建对话框。 在此对话框中填写密码&#xff08;Passwo…

MySql字段的值是以逗号隔开的另一个表的主键关联查询

查询sql SELECT s.student_id, s.name, c.name as course_name FROM student s INNER JOIN course c ON FIND_IN_SET(c.course_id, s.course_id) > 0 WHERE 1 1;相似sql -- 翻译&#xff08;需要带条件&#xff0c;可用于字典翻译&#xff0c;但条件需要注意唯一性&#…