Iceberg HDP 文件监听与 Spark 任务自动提交模块设计文档文档信息归属服务cspservhdp核心实现类IcebergSqlWatchService触发机制Spring 定时轮询下游执行Spark 集群完成 Iceberg 建表、老化数据清理一、业务流程文字流程图流程文字对应说明HDFS 分两个独立目录存放上游生成的建表、老化 sql.yaml服务开启两条独立定时任务每小时分别扫描对应目录进入统一通用扫描方法自动检测 Spark 运行所需配置文件缺失则通过本地模板渲染生成 app-config.yaml、config.yaml读取 sql.yaml 文件修改时间和内存 ConcurrentHashMap 缓存的上一次时间做对比文件无变更直接结束本轮扫描文件发生更新更新缓存时间调用 Spark 客户端异步提交任务Spark 集群读取 yaml 执行对应建表或数据老化清理逻辑。二、分层组件及职责1. 定时调度层两套独立定时方法互不干扰扫描间隔统一 1 小时fullScan扫描建表目录任务标识 icebergCreateTableTask启动延迟 5 秒scanAgingTaskDir扫描老化目录任务标识 icebergAgingTask启动延迟 10 秒每次扫描先校验 HDFS 集群连通状态HDFS 不可用直接终止本轮扫描并打印错误日志各自独立 try-catch 捕获异常其中一个目录扫描失败不阻塞另一个定时任务2. 通用目录扫描工具方法 scanSingleDir统一复用逻辑接收监听目录、配置路径、任务标识、修改时间缓存 Map、根目录、应用名称入参判断监听 sql 目录是否存在不存在打印警告日志直接返回调用方法自动补全 app-config.yaml、config.yaml 两份 Spark 运行配置获取目录下 sql.yaml 文件进入文件变更判断逻辑3. 模板渲染子能力loadTemplate读取 classpath 内置 yaml 模板使用并发 Map 缓存模板文本避免重复读取本地资源renderTemplate识别 ${key} 占位符替换应用名、HDFS 根目录等参数生成完整配置文本writeHdfsFile将渲染后的配置写入指定 HDFS 路径打印生成成功 / 失败日志4. 文件变更判断逻辑 processFileChange维护两套独立 ConcurrentHashMap分别缓存建表、老化 sql.yaml 上次修改时间保证线程安全对比当前文件修改时间与缓存值一致则直接返回不提交任务时间发生变化则更新缓存记录发起 Spark 任务提交5. Spark 任务提交能力 submitSparkTask依赖 SparkClientUDA 客户端实现异步任务提交传入任务名称、HDFS 任务配置文件路径提交过程出现异常抛出 ScheduleProcessingException由上层定时方法捕获记录错误日志。三、输入输出定义输入上游产出aggregation-schedule 模块生成存放在 HDFS 两套目录的 sql.yaml建表 DDL、老化 DML静态资源classpath 下 app-config-template.yaml、config-template.yaml 任务模板底层依赖工具HdfsClient、SparkClientUDA输出自动产物HDFS 目录下 Spark 运行配置文件 app-config.yaml、config.yaml执行动作异步提交 Spark 任务分为两类执行逻辑建表任务执行 CREATE NAMESPACE、CREATE TABLE IF NOT EXISTS老化任务执行 DELETE 过期数据、expire_snapshots 清理快照、remove_orphan_files 清理孤立文件四、隔离设计存储隔离建表、老化使用完全独立 HDFS 根目录、独立 sql 监听子目录资源隔离独立任务名称、独立定时方法、独立修改时间缓存 Map异常隔离两个定时任务独立捕获异常故障互不影响五、核心设计规则轮询周期固定 3600000 毫秒1 小时执行一次扫描幂等设计基于文件修改时间缓存做增量判断文件无更新不会重复提交 Spark 任务免人工运维Spark 依赖的配置文件缺失时自动根据模板生成无需人工上传维护性能优化模板文本全局内存缓存减少频繁 IO 读取本地模板文件六、容错处理规则HDFS 集群离线直接跳过本次扫描输出错误日志监听 sql 目录不存在仅打印警告日志不中断服务运行模板读取、HDFS 文件写入异常捕获异常记录错误日志不终止服务Spark 任务提交失败抛出业务调度异常可对接监控告警单目录扫描异常仅中断当前任务另一套定时扫描正常执行不受影响