17 KiB
概述
围绕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_config和tb_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包路径,执行脚本;正常情况下,脚本将会为cloud、command、uploader
目录生成脚本。
启动上传服务
如果使用其他文件服务,如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_id和alias。
停止所有压缩任务
停止压缩任务往往遍布各个集群,压缩任务又可能会存在各个压缩队列里,这个工具可以直接清除各个压缩队列里的任务、停止各个集群里正在运行的压缩任务。
离线检索
使用Flink运行一些需要耗时较长的查询任务,和hudi同步任务一样,提交到Yarn集群上,可以做一些牛逼操作;查询结果在页面下方的任务列表中查看。
提交Flink任务有一定的延时,尤其在调度压缩任务的时候,可能会由于资源不足导致提交失败,要观察一些,不要多次提交,避免消耗集群资源。
查询记录
可以查询包含指定字符串(通常是主键)的记录,横跨Pulsar、hudi日志、hudi数据,通常用于丢数据时,找到数据丢在哪一个环节,解析出记录的时间线;
有时候Pulsar查询可能会有一点问题,导致整个任务失败,建议Pulsar查询单独启动一个任务。
检索最后操作时间
查询hudi表最后操作时间,逐条检索data文件的记录,这个时间应该会比较准确;通常用于想知道某个表的准确最新更新时间。
HDFS
案例
丢主键为xxx的某条数据
xxx表的数据没有到最新
模块
模块主要分为三部分,包含 Hudi 运行代码、运维服务和部署工具。
Hudi 运行代码
sync
sync 模块包含 Hudi 运行的全部业务逻辑,Hudi on flink 的运行模式为






















