Files
hudi-service/README.md
2024-03-10 21:59:33 +08:00

17 KiB
Raw Blame History

概述

围绕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队列

用于查询Pulsar Topic的相关信息查看Reader积压情况生产者是否在线等。

Hudi表结构

常用于查看实际的表结构是否和配置表相同判断hudi表有没有更新表结构。

压缩队列

查看各个压缩队列的任务详情,方便查找问题任务。

跨天

查看一些简单的跨天信息。

同步集群

常用页面用于监控同步集群中的同步任务的启停状态Yarn页面不能自动刷新状态显示不清晰这个界面基本可以替代Yarn页面页面默认筛选hudi同步任务也可以方便跳转同步任务对应的Yarn页面和日志。

压缩集群

和「同步集群」页面功能一致,这个页面还能聚合各个集群在同一个表格中,方便同时查看多个集群内的压缩任务。

Cloud

查看服务部署实时状态和方便跳转服务日志。

小工具

提供一些实际运维过程中需要的小工具。

查询时间线

根据指定的HDFS路径查询常有一些情况需要查询备份目录下的hudi表情况这些备份表不在配置体系里面可以通过这个工具直接查看指定路径下的hudi表时间线、表结构。

提交压缩任务

手动提交压缩任务,可以指定压缩任务执行的集群。

批量提交压缩任务

批量提交压缩任务一行一个hudi表使用空格分开flink_job_idalias

停止所有压缩任务

停止压缩任务往往遍布各个集群,压缩任务又可能会存在各个压缩队列里,这个工具可以直接清除各个压缩队列里的任务、停止各个集群里正在运行的压缩任务。

离线检索

使用Flink运行一些需要耗时较长的查询任务和hudi同步任务一样提交到Yarn集群上可以做一些牛逼操作查询结果在页面下方的任务列表中查看。

提交Flink任务有一定的延时尤其在调度压缩任务的时候可能会由于资源不足导致提交失败要观察一些不要多次提交避免消耗集群资源。

查询记录

可以查询包含指定字符串通常是主键的记录横跨Pulsar、hudi日志、hudi数据通常用于丢数据时找到数据丢在哪一个环节解析出记录的时间线

有时候Pulsar查询可能会有一点问题导致整个任务失败建议Pulsar查询单独启动一个任务。

检索最后操作时间

查询hudi表最后操作时间逐条检索data文件的记录这个时间应该会比较准确通常用于想知道某个表的准确最新更新时间。

HDFS

案例

丢主键为xxx的某条数据

xxx表的数据没有到最新

模块

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

Hudi 运行代码

sync

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

运维服务

部署工具

开发