# mrs-master-backend **Repository Path**: wubaidev/mrs-master-backend ## Basic Information - **Project Name**: mrs-master-backend - **Description**: 对接华为FI集群,集群状态相关指数分析页。包含服务故障数、节点故障数、实例故障数、HDFS使用率、YARN RUNNING任务、HIVE业务访问统计、大数据集群主机状态性能指数 | 后端代码 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-04-04 - **Last Updated**: 2025-04-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java ## README **后端项目初始化:mrs-master-backend** 技术选型: SSM+AOP日志组件 **前端项目初始化: √** 技术选型: Next.js(同构渲染)、React+TS、 Procomponents(表单组件)、Request(Axios 的封装)、弹性布局组件Flex 业务流程: 服务故障数、节点故障数、实例故障数这3个卡片,当前现状如图所示:当前每天显示的数据还是为null,日期范围还是当日至未来17日,要求修改为:日期范围17天,开时日期是当日前17天,截至日期是当日,每天的数据是显示良好或者故障,且每日数据良好时卡片的里面的图显示一个绿色的点,故障显示一个红色的点 ![输入图片说明](conf/image-20250325212454766.png) 服务故障数、节点故障数、实例故障数这3个卡片,卡片中显示散点,散点如果值为故障显示红色的点,值为良好显示绿色的点,且鼠标指向这个点时显示当前的值为故障或良好,且还要显示日期(格式为2025-03-25这种日期格式),如图现在鼠标指向这个点时显示的值还是为null 1、searchServers接口 { "code": 0, "data": [ { "currentSatus": 0, "2025-04-03": 0, "2025-04-02": 0, "2025-04-01": 0, "2025-03-31": 0, "2025-03-30": 0, "2025-03-29": 0, "2025-03-28": 0, "2025-03-27": 0, "2025-03-26": 0, "2025-03-25": 0, "2025-03-24": 0, "2025-03-23": 0, "2025-03-22": 0, "2025-03-21": 0, "2025-03-20": 0, "2025-03-19": 0, "2025-03-18": 0, "total": 0 } ], "message": "ok" } 这是服务故障数后端接口:/api/mrs/servers返回的数据, 要求:如图我标1的位置加载加载返回值response.data中的total,我标2的位置加载加载返回值response.data中的currentSatus,即currentSatus表示当前状态若值为0表示良好,值为1表示故障。如图面积图中的x表示日期加载response.data中除开currentSatus、total这两个key,面积图中的y值加载response.data中除开currentSatus、total这两个value值。 2.searchHdfs接口 { "code": 0, "data": [ { "key": "Host", "name": "Host", "value": "3", "type": "TEXT" }, { "key": "Yarn Running Tasks", "name": "Yarn Running Tasks", "value": "1", "type": "TEXT" }, { "key": "HDFS File", "name": "HDFS File", "value": "2342", "type": "TEXT" }, { "key": "HDFS Disk Space", "name": "HDFS Disk Space", "value": { "total": 1336, "current": 284.0266, "unit": "GB" }, "type": "PERCENT" } ], "message": "ok" } 这是searchHdfs接口的返回值,参考原有图片样式,调用searchHdfs接口加载图标数据, 原始代码中的total使用接口返回值data中第四个元素中的current除以total(取整数加百分号),原始代码中的周同比改成文件数 使用接口返回值data中第三个元素中的value值,原始代码中的日同比去掉 原始代码参考如下 } total="78%" footer={
周同比 12% 日同比 11%
​ } ​ contentHeight={46} 3、searchHive接口 { "code": 0, "data": [ { "count": 9, "tableName": "default.source_table2" }, { "count": 6, "tableName": "_dummy_database._dummy_table" }, { "count": 3, "tableName": "default.source_table" } ], "message": "ok" } 这是searchHive接口的返回值,参考原始样式,调用searchHive接口加载图标数据,表单中columns字段含:count对应访问次数, tableName对应表名,原始代码中的 周涨幅字段帮我替换成 访问比例:searchHive接口返回值data中的当前count除以所有data中count累加值(比如示例中的返回值 :9/(9+6+3)取整加百分号) 原始代码如下: return ( rowKey={(record) => record.index} size="small" columns={columns} dataSource={searchData || []} pagination={{ style: { marginBottom: 0, }, pageSize: 7, }} /> ); 4、searchYarn接口 { "code": 0, "data": [ { "id": "application_1743475217621_0010", "user": "xx", "queueUser": "xx", "name": "Flink session cluster", "queue": "default", "state": "RUNNING", "finalStatus": "UNDEFINED", "progress": 100, "trackingUI": "ApplicationMaster", "trackingUrl": "https://10-xx-53:26001/proxy/application_1743475217621_0010/", "diagnostics": "", "clusterId": 1743475217621, "applicationType": "Apache Flink", "applicationTags": "", "priority": 0, "startedTime": 1743606442965, "launchTime": 1743606443122, "finishedTime": 0, "elapsedTime": 65768246, "amContainerLogs": "https://10-xx-53:26010/node/containerlogs/container_e03_1743475217621_0010_01_000001/sharkdw", "amHostHttpAddress": "10-xx-53:26010", "amRPCAddress": "10-xx-53:32261", "masterNodeId": "10-xx-53:26009", "allocatedMB": 2048, "allocatedVCores": 1, "reservedMB": 0, "reservedVCores": 0, "runningContainers": 1, "memorySeconds": 134688958, "vcoreSeconds": 65766, "queueUsagePercentage": 229.27861, "clusterUsagePercentage": 2.0833335, "resourceSecondsMap": { "entry": { "key": "vcores", "value": "65766" } }, "preemptedResourceMB": 0, "preemptedResourceVCores": 0, "numNonAMContainerPreempted": 0, "numAMContainerPreempted": 0, "preemptedMemorySeconds": 0, "preemptedVcoreSeconds": 0, "preemptedResourceSecondsMap": {}, "logAggregationStatus": "NOT_START", "unmanagedApplication": false, "amNodeLabelExpression": "", "timeouts": { "timeout": [ { "type": "LIFETIME", "expiryTime": "UNLIMITED", "remainingTimeInSeconds": -1 } ] } } ], "message": "ok" } 这是searchYarn接口的返回值,参考原始样式, 调用searchYarn接口加载图标数据,表单中columns字段含:id对应字段为表单中的applicationId,user对应字段表单中的user,startedTime对应字段表单中的startedTime并转为"yyyy-MM-dd'T'HH:mm:ss"时间格式显示,elapsedTime对应字段表单中elapsedTime这个字段的含义是运行时长帮我转换为分钟,不足1分钟的显示为1分钟(单位为min),表单按elapsedTime排序显示,原始代码中排名字段保留,其余字段去掉 原始代码如下: return ( >rowKey={(record) => record.index} >size="small" >columns={columns} >dataSource={searchData} >pagination={{ >style: { >marginBottom: 0, >}, >pageSize: 7, >}} >/> > >); **创建定时器:**需要周期执行的接口,创建定时器 **增加故障数累加计算:**total (近17天的故障总次数) √ 故障数页面数据加载: { "code": 0, "data": [ { "currentSatus": 0, "2025-04-03": 0, "2025-04-02": 0, "2025-04-01": 0, "2025-03-31": 0, "2025-03-30": 0, "2025-03-29": 0, "2025-03-28": 0, "2025-03-27": 0, "2025-03-26": 0, "2025-03-25": 0, "2025-03-24": 0, "2025-03-23": 0, "2025-03-22": 0, "2025-03-21": 0, "2025-03-20": 0, "2025-03-19": 0, "2025-03-18": 0, "total": 0 } ], "message": "ok" }这是服务故障数、节点故障数、实例故障数的后端接口返回值,背景:后端接口分别为:/api/mrs/servers,/api/mrs/nodes,/api/mrs/instances,要求:生成接口调用代码,全用get请求方式,代码放在masterController.ts里面,并修改IntroduceRow.tsx 服务故障数、节点故障数、实例故障数分别通过调用后端接口的方式加载数据至页面,页面的布局和样式这样不要去修改,这3个接口在IntroduceRow.tsx 现有代码total={numeral(getFaultCount(visitData)).format("0,0")}这个加载后端返回值data中的total,当前状态值加载data中的currentSatus,其中0为正常,1为故障 > **最后:** 优化日志、缩小项目体积、复用代码 **指标:** 1.hdfs已使用/总 # ![输入图片说明](conf/image-20250323120949462.png) 2.实例故障数(进程故障id) 17天的数据 # 3.节点故障数(节点故障id) # ![输入图片说明](conf/image-20250323115837203.png) 4.服务故障 # ![输入图片说明](conf/image-20250323120447020.png) 5.表访问情况 √后端已实现 # 6.yarn业务running任务 :appid、用户、启动时间、运行时长 、停止,展示10个 # 7.主机列表:主机ip、主机状态、cpu、内存、磁盘 √ 每页5条吧 **后端程序现状:** - hive访问记录返回上限1000条记录 - 时间段:范围可自定义 - 问题:在一个时间段内,可能返回记录不全,也就是说实际记录为1000条以上 ​ 怎么与集群的20026端口绑定 **解决办法:** - 采用springboot 写一个定时器 - 尽量缩小查询时间范围段,减少时间段 取出前20000条数据 - 数据写入到hbase中 x - 配置库: **流程:** x 现有程序生成第一批数据 -》将第一批数据加入一个key(48位)字段 ,这一截数据缓存在一个变量Map中,然后sink到hbase 现有程序生成第一批数据 -》两批数据怎么累加? **后端完成度:** 1. 已经完成后端表访问量统计,定时器为每3分钟执行一次,tableCounts长度限制为20000条记录 返回值:限制最多50条记录 ```json [ { "tableName": "database1.table1", "count": 125 }, { "tableName": "database2.table2", "count": 98 }, { "tableName": "database3.table3", "count": 76 }, // ... 更多表记录 ] ``` 2. 服务故障数后端:监控:ALM-13000(zookeeper)、ALM-14000(HDFS)、ALM-18000(yarn)、ALM-16004(hive)、ALM-19000(hbase)、ALM-43200 (ES)、ALM-38000(kafka) 返回值: ```js { "code": 0, "data": [ { "currentSatus": 0, "2025-04-03": 0, "2025-04-02": 0, "2025-04-01": 0, "2025-03-31": 0, "2025-03-30": 0, "2025-03-29": 0, "2025-03-28": 0, "2025-03-27": 0, "2025-03-26": 0, "2025-03-25": 0, "2025-03-24": 0, "2025-03-23": 0, "2025-03-22": 0, "2025-03-21": 0, "2025-03-20": 0, "2025-03-19": 0, "2025-03-18": 0, "total": 0 } ], "message": "ok" } ``` 3. 节点故障数后端 :ALM-12006 节点故障 返回值: ```js [ { "2025-03-26": 1, // 当天服务不可用 "2025-03-25": 0, "2025-03-24": 0, "2025-03-23": 1, // 历史某天服务不可用 "2025-03-22": 0, // ... 其他14天的数据 "2025-03-10": 0 // 16天前的数据 "currentSatus": 0 } ] ``` 4. 实例故障数后端 :ALM-12007 进程故障 返回值: ```js [ { "2025-03-26": 1, // 当天服务不可用 "2025-03-25": 0, "2025-03-24": 0, "2025-03-23": 1, // 历史某天服务不可用 "2025-03-22": 0, // ... 其他14天的数据 "2025-03-10": 0 // 16天前的数据 "currentSatus": 0 } ] ``` 5. hdfs容量 接口:/api/v2/clusters/summary 返回值: ```javascript { "code": 0, "data": [ { "key": "Host", "name": "Host", "value": "3", "type": "TEXT" }, { "key": "Yarn Running Tasks", "name": "Yarn Running Tasks", "value": "1", "type": "TEXT" }, { "key": "HDFS File", "name": "HDFS File", "value": "1091", "type": "TEXT" }, { "key": "HDFS Disk Space", "name": "HDFS Disk Space", "value": { "total": 1336, "current": 302.72024, "unit": "GB" }, "type": "PERCENT" } ], "message": "ok" } ``` 6. YARN 接口 地址:/ws/v1/cluster/ 大坑:本地运行时,一定要配置集群host在电脑的hosts文件里面 测试 :flink run -m yarn-cluster -yt ssl ../examples/streaming/WordCount.jar 或 yarn-session.sh 返回值: ```java { "code": 0, "data": [ {"message": "无任务运行"} ], "message": "ok" } } ``` ```ja { "code": 0, "data": [ { "id": "application_1743475217621_0005", "user": "sharkdw", "queueUser": "sharkdw", "name": "Flink session cluster", "queue": "default", "state": "RUNNING", "finalStatus": "UNDEFINED", "progress": 100, "trackingUI": "ApplicationMaster", "trackingUrl": "https://10-xx-53:26001/proxy/application_1743475217621_0005/", "diagnostics": "", "clusterId": 1743475217621, "applicationType": "Apache Flink", "applicationTags": "", "priority": 0, "startedTime": 1743599331428, "launchTime": 1743599331577, "finishedTime": 0, "elapsedTime": 298423, "amContainerLogs": "https://10-xx-52:26010/node/containerlogs/container_e03_1743475217621_0005_01_000001/sharkdw", "amHostHttpAddress": "10-xx-52:26010", "amRPCAddress": "10-xx-52:32261", "masterNodeId": "10-xx-52:26009", "allocatedMB": 2048, "allocatedVCores": 1, "reservedMB": 0, "reservedVCores": 0, "runningContainers": 1, "memorySeconds": 604954, "vcoreSeconds": 295, "queueUsagePercentage": 229.27861, "clusterUsagePercentage": 2.0833335, "resourceSecondsMap": { "entry": { "key": "vcores", "value": "295" } }, "preemptedResourceMB": 0, "preemptedResourceVCores": 0, "numNonAMContainerPreempted": 0, "numAMContainerPreempted": 0, "preemptedMemorySeconds": 0, "preemptedVcoreSeconds": 0, "preemptedResourceSecondsMap": {}, "logAggregationStatus": "NOT_START", "unmanagedApplication": false, "amNodeLabelExpression": "", "timeouts": { "timeout": [ { "type": "LIFETIME", "expiryTime": "UNLIMITED", "remainingTimeInSeconds": -1 } ] } } ], "message": "ok" } ``` ![image-20250402202034956](C:\Users\hecunqian\AppData\Roaming\Typora\typora-user-images\image-20250402202034956.png) 7. 主机: 问题:跨域问题Next.js AxiosError: Network Error 解决:const DEV_BASE_URL = ""; // 使用相对路径,让 Next.js 代理处理请求(request.js) 8. 测试数据 ```sql CREATE TABLE source_table2 ( column1 varchar(10), column2 INT, column3 varchar(3) ); insert into source_table2 (column1,column2,column3) values ('d010',1,'flink'); ```