v-zhangjc9 8cbbe97381 fix(monitor): 修复pulsar backlog查询指标为NaN
Map.getOrDefault只会保证一个默认值,但不会重新放入map里,导致每次都新创建一个指标,重复的guage指标会覆盖导致指标值为NaN
2024-03-08 16:10:45 +08:00
2024-03-08 15:19:17 +08:00
2024-03-07 18:06:39 +08:00
2024-03-07 18:06:39 +08:00
2024-03-07 14:45:03 +08:00
2024-03-07 14:45:03 +08:00
2024-03-08 15:19:17 +08:00

概述

围绕Hudi同步和压缩流程建立了一整套的工具和流程。

部署

由于部份配置需要在源码增删,无法通过配置文件修改,如果部署新集群建议对master建立分支进行操作避免配置混淆

配置准备

主机规划

通常来说,应用部署需要逻辑上规划有

  • 一台接口机用于操作脚本、存放jar包等。
  • 一台组件机;用于部署应用配套的外部组件。
  • 剩下的作为应用机;用于部署应用服务节点。

上述为逻辑规划,原则上对于机器配置没有特别要求,可以混用;如接口机上也用于部署外部组件,同时也作为服务节点部署服务。

组件机上规划有指标和日志汇聚hudi任务多的情况下对IO和磁盘有一定的负载要求建议单独部署。

外部资源确认

  • Hadoop3
    用于存放Hudi数据、Flink任务业务jar包等
    • Yarn集群节点到HDFS的增删改查权限
    • 应用部署主机到HDFS的增删改查权限
  • Zookeeper
    用于hudi同步压缩服务注册通常可以使用Hadoop3集群附带的zookeeper
    • Yarn集群节点到zookeeper的网络连通
    • 应用部署主机到zookeeper的网络连通
  • Yarn
    用于运行hudi同步压缩任务
    • 应用部署主机提交任务的权限
  • MySQL
    配置数据库;目前和汇聚平台配置库耦合,不能改,只能直接使用汇聚配置数据库
    • 应用部署节点到MySQL的访问连通
  • Pulsar
    数据源
    • Yarn集群节点到pulsar的读取连通
    • 应用部署主机到pulsar的client连通和admin连通
  • 应用部署主机
    部署配套应用服务
    • JDK 1.8实现OpenJDK标准即可
    • Kerberos
    • 接口机到应用机的ssh免密用于服务启停部署

Hadoop配置

config目录下以「hudi数据所有集群名称+hudi同步运行集群名称」的格式建立配置文件夹b2b12,并将下列配置文件放在这里

  • core-site.xml
  • hdfs-site.xml
  • yarn-site.xml
  • viewfs-mount-table.xml如果需要使用联邦core-site.xml也需要将引用改为相对路径引用

外部组件部署

组件安装包放在研发云制品库:汇聚平台项目-制品库 odcp-snapshot-generic-local/cluster-tools下面

Victoria Metrics

Victoria Metrics是一款替代Prometheus的开源指标采集应用支持分布式部署和指标主动推送完全兼容Prometheus API提供了接近数倍于Prometheus的性能。

目前项目采用单节点模式部署,性能还有富裕,后期可根据性能需求,改为分布式部署。

victoria_metrics-1.98
 ├── prometheus.yml                配置文件
 ├── start_victoria_metrics.sh     启动脚本
 ├── stop_victoria_metrics.sh      停止脚本
 ├── version
 ├── victoria-metrics-prod-amd64   x86架构
 └── victoria-metrics-prod-arm64   arm架构
启动脚本

启动脚本需要根据部署的主机区分CPU架构修改脚本内容引用合适的可执行文件。

用户名为EsCFVuNkiDWv7PKmcF,密码为Abf%x9ocS^iKr3tgrd用于保护Victoria Metrics的Web页面。

nohup $current_path/victoria-metrics-prod-amd64 \
  -search.maxQueryLen=1MB \
  -promscrape.maxScrapeSize=100MB \
  -loggerLevel=ERROR \
  -storageDataPath=$current_path/data \
  -retentionPeriod=7d \
  -httpAuth.username=EsCFVuNkiDWv7PKmcF \
  -httpAuth.password=Abf%x9ocS^iKr3tgrd \
  -httpListenAddr=":35710" \
  -promscrape.config=$current_path/prometheus.yml \
  -promscrape.httpSDCheckInterval=15s \
  > $current_path/victoria-metrics.log 2>&1 &

启动完成后可以通过脚本指定的端口35710访问Web页面即为启动成功。

采集配置

Victoria Metrics的配置文件完全兼容Prometheus可以直接替换使用。

global:
  scrape_interval: 15s
  scrape_timeout: 15s

scrape_configs:
  # Victoria Metrics 本身的指标
  - job_name: 'Victoria Metrics Single Cluster'
    metrics_path: '/metrics'
    basic_auth:
      username: EsCFVuNkiDWv7PKmcF
      password: Abf%x9ocS^iKr3tgrd
    static_configs:
      - targets:
          - '132.126.207.34:35710'
  # Loki日志采集
  - job_name: 'Loki'
    metrics_path: '/metrics'
    static_configs:
      - targets:
          - '132.126.207.34:33100'
  # 集群主机管理,根据需要启用
  - job_name: 'Node Exporter'
    metrics_path: '/metrics'
    static_configs:
      - targets:
          - '132.126.207.124:20110'
  # 应用服务的指标采集部署Victoria Metrics的时候可以注释等应用部署完成后再打开
  - job_name: 'Service'
    metrics_path: '/actuator/prometheus'
    basic_auth:
      username: AxhEbscwsJDbYMH2
      password: cYxg3b4PtWoVD5SjFayWxtnSVsjzRsg4
    # 可以通过service-cloud-query模块动态获取各个服务节点的IP
    http_sd_configs:
      - url: http://132.126.207.34:35690/hudi_services/service_cloud_query/cloud/targets
        basic_auth:
          username: AxhEbscwsJDbYMH2
          password: cYxg3b4PtWoVD5SjFayWxtnSVsjzRsg4

Loki

Loki是一款日志汇聚工具Grafana公司出品可以通过Grafana直接查询日志相比ELK更为轻量级不需要额外的日志采集组件支持应用直接推送日志对简单的分布式应用更友好。

根据规划Loki分为服务日志和Hudi日志选择两台机器分别部署Hudi日志较多如果所有日志划分到一个Loki可能会影响服务日志查询

loki-2.9
 ├── stop_loki.sh       停止脚本
 ├── version
 ├── loki-linux-amd64   x86架构
 ├── loki-linux-arm64   arm架构
 ├── loki-config.yml    配置文件
 ├── start_loki.sh      启动脚本
 └── logs
配置文件
# Loki不支持直接配置访问控制官方建议使用Nginx来实现
auth_enabled: false

query_range:
  parallelise_shardable_queries: false

server:
  # 日志推送端口
  http_listen_port: 33100
  grpc_listen_port: 39096
  log_level: error
  grpc_server_max_recv_msg_size: 1572864000
  grpc_server_max_send_msg_size: 1572864000

common:
  # 指向规划好的数据盘
  path_prefix: /data/datalake/data/loki
  storage:
    filesystem:
      chunks_directory: /data/datalake/data/loki/chunks
      rules_directory: /data/datalake/data/loki/rules
  replication_factor: 1
  ring:
    instance_addr: 127.0.0.1
    kvstore:
      store: inmemory

table_manager:
  retention_deletes_enabled: true
  retention_period: 72h

schema_config:
  configs:
    - from: 2023-12-06
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

Grafana

根据CPU架构选择grafana-amd64-10.3或者grafana-arm64-10.3部署包。

grafana-amd64-10.3
 ├── data
 ├── start_grafana.sh
 ├── stop_grafana.sh
 ├── npm-artifacts
 ├── packaging
 ├── plugins-bundled
 ├── public
 ├── bin
 ├── conf
 ├── storybook
 ├── tools
 ├── VERSION
 ├── LICENSE
 ├── NOTICE.md
 ├── README.md
 └── Dockerfile
数据源配置

根据部署的组件新增数据源其中Loki区分服务日志和Hudi日志如果没有部署两个可以不区分

配置数据库

database路径下,有数据库初始化脚本,其中tb_app_hudi_job_configtb_app_yarn_job_config两张表提供了预设配置。

建议为每一个环境创建一个单独的database避免不同集群的配置混在一起。

database
 ├── tb_app_collect_table_info.sql
 ├── tb_app_collect_table_version.sql
 ├── tb_app_flink_job_config.sql
 ├── tb_app_global_config.sql
 ├── tb_app_hudi_compaction_job.sql
 ├── tb_app_hudi_compaction_metrics.sql
 ├── tb_app_hudi_event.sql
 ├── tb_app_hudi_job_config.sql
 ├── tb_app_hudi_sync_state.sql
 └── tb_app_yarn_job_config.sql

部署配置

service-cli/service-cli-runner/src/main/resources/application-b12.yml为模版,补全应用部署信息

service-web/src/main/resources/static/common/info.js#commonInfo为模板补全web页面相关信息

接口机目录规划

选择一个空白目录作为根目录(下文简称「根目录」),创建下列子目录。

.
 ├── cloud      服务管理脚本
 ├── command    应用命令行
 ├── data       应用数据
 ├── extra      外部组件
 ├── logs       应用日志
 └── uploader   上传服务

脚本生成

bin/generate 脚本复制到根目录下根据实际情况改动脚本中指向的一些目录、jdk和jar包路径执行脚本正常情况下脚本将会为cloudcommanduploader 目录生成脚本。

启动上传服务

如果使用其他文件服务如YTP则不需要操作这一步直接使用其他文件服务即可。

uploader
  ├── start.sh    启动脚本
  ├── stop.sh     停止脚本
  └── update.sh   更新脚本

执行start.sh启动上传服务,默认端口为36800

编译打包项目

将文件服务的url补充到bin/library.sh中,执行bin/build-all.sh,打包编译全部模块并上传到文件服务。

运维

应用提供三部分运维方案:

  • 命令行提供命令行操作包括同步的启动、停止等在Web无法使用的情况下做一些简单运维操作
  • Web:提供表信息、运行总览等,完成常见的运维操作;
  • HDFS在上述手段出现问题或无法操作的情况下直接访问HDFS查看hudi表相关的状态。

命令行

Web

概览

概览页面可以看到应用的主要运行情况,从上到下分别有:

  • 表数量
    • 逻辑表(根据上游源表名去重得到)
    • 湖底表根据目标hudi表路径去重得到
    • 嗨福表根据hive表名去重得到
  • Flink运行同步任务数量
    • flink任务数
    • flink任务下对应表总数
  • hudi同步集群情况
  • hudi压缩集群情况
  • 跨天情况
    • 重点表跨天情况
    • 普通表跨天情况
  • 压缩调度定时策略

表任务

可以按表级别查询到相关配置、运行、周边信息,完成常见的表运维跟踪。

Flink任务详情

点击Flink job id项目可以打开Flink任务详情页面。

表任务详情

点击别名项目可以打开表任务详情页面,在这个页面主要可以查看表本身的配置信息,尤其是字段信息。

同步情况

查看Flink同步任务的详情和历史情况方便直接跳转日志查看。

压缩情况

查看Flink同步任务的详情和历史情况方便直接跳转日志查看由于压缩任务运行在多集群历史任务保留多久会受到各个集群任务量、配置的限制如果超出集群保留任务列表的限制比如b1集群任务列表整个集群最后10000条就会在这里查询不到在使用的时候需要注意这一点。

历史压缩

记录在数据库中的历史压缩情况,由各个服务端维护,方便查询历史压缩情况,不受集群保留历史任务限制。

时间线

查询实时hudi表时间线可以更清晰地看到压缩情况和同步情况对于查询压缩任务启停时间点以及压缩任务包含文件数非常有帮助。

Pulsar队列

Hudi表结构

压缩队列

跨天

同步集群

压缩集群

Cloud

小工具

查询时间线

提交压缩任务

批量提交压缩任务

停止所有压缩任务

离线检索

查询文件

检索最后操作时间

HDFS

模块

模块主要分为三部分,包含 Hudi 运行代码、运维服务和部署工具。

Hudi 运行代码

sync

sync 模块包含 Hudi 运行的全部业务逻辑Hudi on flink 的运行模式为

运维服务

部署工具

开发

Description
一个完整的基于Hudi的同步应用
Readme 32 MiB
Languages
CSS 55.2%
JavaScript 41.3%
Java 3.5%