Files
hudi-service/README.md
2024-03-08 15:19:17 +08:00

498 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- TOC -->
* [概述](#概述)
* [部署](#部署)
* [配置准备](#配置准备)
* [主机规划](#主机规划)
* [外部资源确认](#外部资源确认)
* [Hadoop配置](#hadoop配置)
* [外部组件部署](#外部组件部署)
* [Victoria Metrics](#victoria-metrics)
* [启动脚本](#启动脚本)
* [采集配置](#采集配置)
* [Loki](#loki)
* [配置文件](#配置文件)
* [Grafana](#grafana)
* [数据源配置](#数据源配置)
* [配置数据库](#配置数据库)
* [部署配置](#部署配置)
* [接口机目录规划](#接口机目录规划)
* [脚本生成](#脚本生成)
* [启动上传服务](#启动上传服务)
* [编译打包项目](#编译打包项目)
* [运维](#运维)
* [命令行](#命令行)
* [Web](#web)
* [概览](#概览)
* [表任务](#表任务)
* [Flink任务详情](#flink任务详情)
* [表任务详情](#表任务详情)
* [同步情况](#同步情况)
* [压缩情况](#压缩情况)
* [历史压缩](#历史压缩)
* [时间线](#时间线)
* [Pulsar队列](#pulsar队列)
* [Hudi表结构](#hudi表结构)
* [压缩队列](#压缩队列)
* [跨天](#跨天)
* [同步集群](#同步集群)
* [压缩集群](#压缩集群)
* [Cloud](#cloud)
* [小工具](#小工具)
* [查询时间线](#查询时间线)
* [提交压缩任务](#提交压缩任务)
* [批量提交压缩任务](#批量提交压缩任务)
* [停止所有压缩任务](#停止所有压缩任务)
* [离线检索](#离线检索)
* [查询文件](#查询文件)
* [检索最后操作时间](#检索最后操作时间)
* [HDFS](#hdfs)
* [模块](#模块)
* [Hudi 运行代码](#hudi-运行代码)
* [sync](#sync)
* [运维服务](#运维服务)
* [部署工具](#部署工具)
* [开发](#开发)
<!-- TOC -->
# 概述
围绕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也需要将引用改为相对路径引用
### 外部组件部署
_组件安装包放在研发云制品库:[汇聚平台项目-制品库](https://www.srdcloud.cn/artifact/26151/project#generic)_
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页面。
```Bash
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页面即为启动成功。
![](assets/victoria_metrics_web.png)
##### 采集配置
Victoria Metrics的配置文件完全兼容Prometheus可以直接替换使用。
```yaml
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
```
##### 配置文件
```yaml
# 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日志如果没有部署两个可以不区分
![](assets/grafana_datasource.png)
### 配置数据库
`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压缩集群情况
- 跨天情况
- 重点表跨天情况
- 普通表跨天情况
- 压缩调度定时策略
![](assets/hudi_web_override.png)
### 表任务
可以按表级别查询到相关配置、运行、周边信息,完成常见的表运维跟踪。
![](assets/hudi_web_tables.png)
#### Flink任务详情
点击`Flink job id`项目可以打开Flink任务详情页面。
![](assets/hudi_web_flink_job_detail.png)
#### 表任务详情
点击`别名`项目可以打开表任务详情页面,在这个页面主要可以查看表本身的配置信息,尤其是字段信息。
![](assets/hudi_web_table_meta_detail.png)
##### 同步情况
查看Flink同步任务的详情和历史情况方便直接跳转日志查看。
![](assets/hudi_web_table_meta_detail_sync.png)
##### 压缩情况
查看Flink同步任务的详情和历史情况方便直接跳转日志查看由于压缩任务运行在多集群历史任务保留多久会受到各个集群任务量、配置的限制如果超出集群保留任务列表的限制比如b1集群任务列表整个集群最后10000条就会在这里查询不到在使用的时候需要注意这一点。
![](assets/hudi_web_flink_job_detail_compaction.png)
##### 历史压缩
记录在数据库中的历史压缩情况,由各个服务端维护,方便查询历史压缩情况,不受集群保留历史任务限制。
![](assets/hudi_web_flink_job_detail_compaction_history.png)
##### 时间线
查询实时hudi表时间线可以更清晰地看到压缩情况和同步情况对于查询压缩任务启停时间点以及压缩任务包含文件数非常有帮助。
![](assets/hudi_web_flink_job_detail_timeline.png)
##### Pulsar队列
![](assets/hudi_web_table_meta_detail_pulsar.png)
##### Hudi表结构
![](assets/hudi_web_table_meta_detail_struct.png)
### 压缩队列
![](assets/hudi_web_queue.png)
### 跨天
![](assets/hudi_web_version.png)
### 同步集群
![](assets/hudi_web_sync.png)
### 压缩集群
![](assets/hudi_web_compaction.png)
### Cloud
![](assets/hudi_web_cloud_service.png)
### 小工具
#### 查询时间线
#### 提交压缩任务
#### 批量提交压缩任务
#### 停止所有压缩任务
### 离线检索
#### 查询文件
#### 检索最后操作时间
## HDFS
# 模块
模块主要分为三部分,包含 Hudi 运行代码、运维服务和部署工具。
## Hudi 运行代码
### sync
sync 模块包含 Hudi 运行的全部业务逻辑Hudi on flink 的运行模式为
## 运维服务
## 部署工具
# 开发