Apache DolphinScheduler 远程日志(Remote Logging)完整配置指南:支持 OSS、S3、GCS、ABS
【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinscheduler
Apache DolphinScheduler 的远程日志(Remote Logging)功能允许将任务运行日志异步上传至 OSS、S3、GCS、ABS 等对象存储,从而解决多 Worker 节点日志分散、日志盘空间不足、历史日志难以集中审计的问题。本文以官方文档 remote-logging.md 为主体,结合 dolphinscheduler-common 模块源码,系统讲解远程日志的启用方式、五大对象存储的完整配置参数、底层实现原理与注意事项,帮助你快速落地一套可长期保留、可集中查看的任务日志体系。
远程日志的核心机制
在默认情况下,DolphinScheduler 的任务日志只写入各 Worker 节点本地磁盘,一旦节点被回收或磁盘被清理,历史日志就会丢失。开启远程日志后,日志的读写路径变为:
- 写入(异步上传):任务结束后,Worker 会将本地日志文件异步发送到远程对象存储,不阻塞任务主流程;
- 读取(按需下载):用户在 Web UI 上查看或下载任务日志时,如果本地日志文件不存在,系统会先从远程存储下载对应文件到本地再展示。
从源码看,这一逻辑由 RemoteLogUtils.java 统一封装:sendRemoteLog(logPath)负责触发上传,getRemoteLog(logPath)负责触发下载,二者都会先通过isRemoteLoggingEnable()判断开关状态,并调用对应目标存储的 Handler 完成实际读写。上传操作经由 RemoteLogService.java 中的@Async("remoteLogHandleExecutor")注解异步执行,这意味着日志投递由独立的异步线程池承载,remote.logging.thread.pool.size即用于控制该线程池的大小。
日志路径到对象名的映射规则
远程存储上的对象路径并不是简单地把本地绝对路径原样上传。RemoteLogUtils.getObjectNameFromLogPath()会先计算出本地日志基础目录(由data.basedir.path推导),然后把日志文件相对该基础目录的剩余路径,拼接到remote.logging.base.dir配置的远程基础目录之下。也就是说,本地日志目录与远程对象目录保持一一对应的镜像关系,便于按目录检索与归档。
启用远程日志
远程日志的总开关位于各服务节点的common.properties中,默认关闭(remote.logging.enable=false,见 common.properties)。开启方式取决于部署模式:
- Cluster(集群)或 Pseudo-Cluster(伪集群)模式:需要同时修改
api-server/conf/common.properties、master-server/conf/common.properties和worker-server/conf/common.properties三处配置并重启对应服务; - Standalone(单机)模式:只需修改
standalone-server/conf/common.properties一处即可。
三处配置的意义各有侧重:Worker 负责在任务结束后上传日志,Master 在任务故障转移时需要读取远端日志,API Server 则在用户通过 Web 界面查看、下载日志时负责拉取,因此三者都需要开启并保持一致的目标存储配置。
基础配置项
# 是否启用远程日志 remote.logging.enable=false # 远程日志目标存储,支持 OSS、S3、GCS、ABS(源码中同时支持 COS) remote.logging.target=OSS # 远程日志基础目录(对应对象存储上的根目录前缀) remote.logging.base.dir=logs # 异步上传日志的线程池大小 remote.logging.thread.pool.size=10各参数说明如下:
| 参数 | 默认值 | 必填 | 说明 |
|---|---|---|---|
remote.logging.enable | false | 是 | 远程日志总开关,置为true后才会触发上传与下载逻辑 |
remote.logging.target | OSS | 启用后必填 | 目标存储类型,可选OSS、S3、GCS、ABS(COS亦有实现) |
remote.logging.base.dir | logs | 启用后必填 | 远程对象存储中的日志基础目录,日志对象将存放于该目录之下 |
remote.logging.thread.pool.size | 10 | 否 | 异步发送日志到远程存储的线程数,任务量较大时可适当调大 |
除上述基础项外,不同目标存储还需补充各自的访问凭据与桶/容器信息,见下文分节说明。
写入阿里云 OSS
目标存储选择阿里云对象存储 OSS 时,配置如下:
# OSS AccessKey ID,target=OSS 时必填 remote.logging.oss.access.key.id=<access.key.id> # OSS AccessKey Secret,target=OSS 时必填 remote.logging.oss.access.key.secret=<access.key.secret> # OSS Bucket 名称,target=OSS 时必填 remote.logging.oss.bucket.name=<bucket.name> # OSS Endpoint,target=OSS 时必填 remote.logging.oss.endpoint=<endpoint>这些参数在 Constants.java 中均有对应的REMOTE_LOGGING_OSS_*常量定义。Endpoint 应填写你 Bucket 所在区域对应的访问域名(如公网或内网 Endpoint),部署在阿里云 ECS 内部时建议使用内网 Endpoint 以降低流量费用并提升速度。
写入 Amazon S3
目标存储选择 Amazon S3 时,配置如下:
# S3 AccessKey ID,target=S3 时必填 remote.logging.s3.access.key.id=<access.key.id> # S3 AccessKey Secret,target=S3 时必填 remote.logging.s3.access.key.secret=<access.key.secret> # S3 Bucket 名称,target=S3 时必填 remote.logging.s3.bucket.name=<bucket.name> # S3 Endpoint,target=S3 时必填 remote.logging.s3.endpoint=<endpoint> # S3 区域,target=S3 时必填 remote.logging.s3.region=<region>region应与 Bucket 所在区域保持一致,例如us-east-1。从实现上看,S3 的客户端由 S3RemoteLogHandler.java 构建:它会通过PropertyUtils.getByPrefix("aws.s3.", "")收集所有aws.s3.前缀的属性并交给AmazonS3ClientFactory创建客户端,因此在配置时你既可以使用remote.logging.s3.*系列参数,也可以复用仓库中 AWS 认证模块(dolphinscheduler-aws-authentication)约定的aws.s3.*通用配置。
值得注意的一个细节是:S3 Handler 在构造时就会执行checkBucketNameExists()校验——如果remote.logging.s3.bucket.name为空,或目标 Bucket 不存在,会直接抛出IllegalArgumentException终止初始化。也就是说S3 的 Bucket 必须预先手动创建好,DolphinScheduler 不会替你自动建桶。上传与下载则分别通过putObject与getObject完成。
写入 Google Cloud Storage(GCS)
目标存储选择 GCS 时,配置如下:
# Google Cloud 凭据文件路径,target=GCS 时必填 remote.logging.google.cloud.storage.credential=/path/to/credential # GCS Bucket 名称,target=GCS 时必填 remote.logging.google.cloud.storage.bucket.name=<your-bucket>GCS 使用服务账号凭据文件(JSON 格式的 key file)完成认证,credential指向该文件在服务器上的绝对路径。请确保运行 DolphinScheduler 的进程对该文件具备读取权限。
写入 Azure Blob Storage(ABS)
目标存储选择 Azure Blob Storage 时,配置如下:
# ABS 账户名,target=ABS 时必填 remote.logging.abs.account.name=<your-account-name> # ABS 账户密钥,target=ABS 时必填 remote.logging.abs.account.key=<your-account-key> # ABS 容器名,target=ABS 时必填 remote.logging.abs.container.name=<your-container-name>ABS 的 Handler(AbsRemoteLogHandler.java)及其测试用例(AbsRemoteLogHandlerTest.java)位于 dolphinscheduler-common 模块中,可直接查阅作为参考实现。
关于 ABS 空目录文件的说明
由于 Azure Blob Storage 不支持空目录的概念,开启 ABS 远程日志后,资源目录下会出现名为<no name>的空文件。这是 Azure 存储语义导致的正常现象,不会影响 DolphinScheduler 资源中心对文件的正常展示与使用,可忽略。
源码视角:存储适配的扩展机制
远程日志对不同存储的适配遵循典型的工厂模式。所有实现都实现统一的 RemoteLogHandler.java 接口,其中定义了两个方法:sendRemoteLog(String logPath)与getRemoteLog(String logPath)。
RemoteLogHandlerFactory.java 根据remote.logging.target的大小写无关取值,返回对应的单例 Handler:
OSS→OssRemoteLogHandlerS3→S3RemoteLogHandlerGCS→GcsRemoteLogHandlerABS→AbsRemoteLogHandlerCOS→CosRemoteLogHandler
也就是说,除了文档正文列出的四种存储,当前仓库的 remote 目录 中还包含了腾讯云 COS 的实现,且 remote-logging.yaml 中同样提供了 COS 的配置模板:
remote.logging: cos: # COS AccessKey ID access.key.id: <access.key.id> # COS AccessKey Secret access.key.secret: <access.key.secret> # COS Bucket 名称 bucket.name: <bucket.name> # COS 区域 region: <region>这一点从侧面印证了远程日志目标是可插拔、易扩展的:新增一种对象存储,只需实现RemoteLogHandler接口并在工厂中注册即可。
完整配置示例与验证建议
以 S3 为例,一个完整的common.properties远程日志段落如下:
remote.logging.enable=true remote.logging.target=S3 remote.logging.base.dir=logs remote.logging.thread.pool.size=10 remote.logging.s3.access.key.id=AKIAXXXXXXXXXXXXXXXX remote.logging.s3.access.key.secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx remote.logging.s3.bucket.name=ds-task-logs remote.logging.s3.endpoint=https://s3.us-east-1.amazonaws.com remote.logging.s3.region=us-east-1验证配置是否生效,可以从以下三个层面检查:
- 服务启动日志:S3 Handler 初始化时若 Bucket 校验失败会直接报错,服务启动即可发现配置问题;
- 任务运行后:等待任务结束,观察远程存储
logs/目录下是否出现了与本地日志目录结构一致的对象; - 界面查看:删除 Worker 本地日志目录后,再通过 Web UI 查看该任务日志,若能正常展示,说明按需下载链路(API Server 侧
getRemoteLog)工作正常。
注意事项
- 三处配置保持一致:集群模式下 API Server、Master、Worker 的
common.properties中的远程日志参数必须一致,否则会出现上传成功但查询失败的现象; - 提前创建桶/容器:S3、OSS 等目标的 Bucket 需预先创建,DolphinScheduler 不会自动建桶,S3 尤其会因桶不存在而拒绝启动 Handler;
- 凭据安全:
access.key.id/access.key.secret等敏感信息以明文写入配置文件,建议严格限制配置文件所在目录的读写权限,生产环境可结合云厂商的 RAM/IRSA 等机制管理凭据; - 线程池调优:
remote.logging.thread.pool.size决定日志上传的并发能力,在任务频繁、日志量大的集群中可适当调大,避免上传积压; - 磁盘占用:开启远程日志后,本地日志文件仍会按原有策略保留,远程存储只是增加一份集中归档,并不会释放本地磁盘空间,如需释放可结合日志清理策略使用。
通过本文的配置与原理讲解,你可以将 DolphinScheduler 的任务日志从"节点本地文件"升级为"云端集中归档",在享受 Web 界面无缝查看日志体验的同时,为日志的长期留存、集中审计和多集群统一运维打下基础。更深入的实现细节可继续阅读 remote-logging.yaml 配置模板与 remote 包 下的各 Handler 源码。
【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinscheduler
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考