本文最后更新于 2026-08-11T00:02:21+08:00
本文基于本地源码工程(datasophon,2.0.0 分支,对应 datasophon-api/src/main/resources/meta/DDP-2.0.0)梳理 DataSophon 的组件部署机制:服务如何定义、参数如何组织、平台如何自动注入变量,并逐一给出核心组件的参数说明与优化建议。此前的手工部署与调优系列(HDFS/YARN/Hive/Spark/Flink/ZK/Kafka 等调优实践)可作为参数取舍的理论依据,本文讲”在 DataSophon 里这些参数长什么样、怎么配”。
一、DataSophon 2.0.0 组件全景
源码中 meta/DDP-2.0.0/ 目录定义了当前版本支持的全部服务,每个服务一个 service_ddl.json。共 21 个组件:
| 组件 |
版本 |
依赖 |
角色(roleType) |
| ZOOKEEPER |
3.6.4 |
无 |
ZkServer(master) |
| HDFS |
3.3.6 |
ZOOKEEPER |
JournalNode、NameNode、ZKFC(master)、DataNode(worker)、HdfsClient(client) |
| YARN |
3.3.6 |
HDFS |
ResourceManager、HistoryServer(master)、NodeManager(worker)、YarnClient(client) |
| HIVE |
3.1.3 |
HDFS |
HiveMetaStore、HiveServer2(master)、HiveClient(client) |
| SPARK3 |
3.4.3 |
无 |
SparkClient3(client) |
| FLINK |
1.16.2 |
无 |
FlinkClient(client) |
| KAFKA |
2.8.2 |
ZOOKEEPER |
KafkaBroker(master) |
| TEZ |
0.10.4 |
HDFS |
TezServer(master)、TezClient(client) |
| HBASE |
2.4.16 |
HDFS |
HbaseMaster(master)、RegionServer(worker) |
| DORIS |
1.2.6 |
无 |
DorisFE(master)、DorisFEObserver(worker)、DorisBE(worker) |
| DS(DolphinScheduler) |
3.1.8 |
ZOOKEEPER |
ApiServer、MasterServer、AlertServer(master)、WorkerServer(worker) |
| KYUUBI |
1.7.3 |
无 |
KyuubiServer(master)、KyuubiClient(client) |
| RANGER |
2.1.0 |
无 |
RangerAdmin(master) |
| KERBEROS |
1.15.1 |
无 |
Krb5Kdc、KAdmin(master)、Krb5Client(client) |
| TRINO |
367 |
无 |
TrinoCoordinator(master)、TrinoWorker(worker) |
| ELASTICSEARCH |
7.16.2 |
无 |
ElasticSearch(master)、EsExporter(master) |
| ICEBERG |
1.4.0 |
无 |
IcebergClient(client) |
| STREAMPARK |
2.1.1 |
无 |
StreamPark(master) |
| PROMETHEUS |
2.54.0 |
无 |
Prometheus(master) |
| GRAFANA |
11.2.1 |
无 |
Grafana(master) |
| ALERTMANAGER |
0.23.0 |
无 |
AlertManager(master) |
依赖关系即安装顺序:HDFS 依赖 ZOOKEEPER,YARN/Hive/Tez/HBase 依赖 HDFS,Kafka/DolphinScheduler 依赖 ZOOKEEPER。DataSophon 在安装向导中按依赖拓扑排序,先装依赖服务。
本地工程为定制版本:Hive/Ranger 等服务的元数据库默认指向达梦数据库(javax.jdo.option.ConnectionDriverName=dm.jdbc.driver.DmDriver),与社区版默认 MySQL 不同。部署前务必按企业环境修改数据库连接参数。
二、服务定义模型(service_ddl.json)
每个组件的 service_ddl.json 描述四件事:服务、角色、启停脚本、参数。
1. 服务与角色
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| { "name": "HDFS", "version": "3.3.6", "dependencies": ["ZOOKEEPER"], "packageName": "hadoop-3.3.6.tar.gz", "roles": [ { "name": "NameNode", "roleType": "master", "runAs": { "user": "hdfs", "group": "hadoop" }, "cardinality": "1+", "logFile": "${hadoopLogDir}/hadoop-hdfs-namenode-${host}.log", "jmxPort": 27001, "externalLink": { "name": "NameNode Ui", "url": "http://${host}:9870" } } ] }
|
关键字段:
cardinality:角色实例数约束(1 表示固定 1 个,1+ 表示至少 1 个可多个)——HDFS 的 JournalNode/NameNode 是 1+,配合 HA 参数实现双主
runAs:进程运行用户与组(hdfs:hadoop、kafka:kafka 等),平台自动创建用户与组
startRunner/stopRunner/statusRunner:调用的控制脚本与参数(如 control_hadoop.sh start namenode),脚本在服务目录内
externalLink:部署完成后 Web UI 直链(NameNode 9870、RM 8088 等)
jmxPort:JMX 指标端口,Prometheus 抓取用
2. 参数模型
每个参数是一个对象,字段含义:
| 字段 |
说明 |
name |
参数名(即写入组件配置文件的键) |
label / description |
界面展示的中文名与说明 |
type |
控件类型:input、select、switch、slider、multiple(数组)、multipleWithKey(自定义键值对) |
configType |
参数归属:ha(高可用)、path(路径)、map(环境变量)、rack(机架)、kb(Kerberos)、permission(Ranger 权限)、custom(自定义配置) |
value / defaultValue |
当前值 / 默认值 |
configurableInWizard |
是否在安装向导中可改 |
hidden |
是否在界面隐藏 |
参数渲染机制:configType 决定参数在向导中如何分组展示(HA 组、Kerberos 组、机架组……),最终由 worker 端的 FreeMarker 模板(templates/*.ftl,如 hdfs-site.xml 由 xml.ftl、capacity-scheduler.ftl、jvm.config.ftl)渲染成组件真实配置文件。multipleWithKey 类型的参数允许”自定义配置 key=value 追加到配置文件”——这是不改源码扩展参数的口子。
三、变量注入机制
参数默认值大量使用 ${...} 占位符,部署时平台自动解析:
| 变量 |
来源 |
示例用途 |
${zkUrls} |
Zookeeper 服务实例 |
HDFS 的 ha.zookeeper.quorum、Kafka 的 zookeeper.connect 自动填入 ZK 地址 |
${dfs.nameservices} / ${nn1} / ${nn2} |
HDFS HA 参数 |
fs.defaultFS=hdfs://${dfs.nameservices} 自动组装 |
${host} |
当前角色所在主机 |
角色专属参数(hive.server2.thrift.bind.host) |
${realm} |
KERBEROS 服务 |
各组件 Kerberos principal 自动拼接 |
${apiHost} |
管理端地址 |
数据库连接(jdbc:...${apiHost}...) |
${HADOOP_HOME} / ${INSTALL_PATH} 等 |
安装路径 |
日志、配置目录引用 |
${metastoreHost} / ${historyserverHost} / ${rm1} |
对应角色部署主机 |
服务间地址互引 |
变量注入是”编排正确性”的核心:手工部署最大的痛点(地址写错、主机名不统一)被这套机制消解。但注意:${变量} 引用的服务必须已部署(如 ${zkUrls} 需要先装 Zookeeper),依赖顺序错误会导致渲染出空地址。
四、部署流程
- 建集群:创建集群、选框架版本(对应 DDP-2.0.0)
- 加主机:填 IP/SSH 信息,管理端向节点分发 Worker 并采集主机信息(
host-info-collect.sh)
- 选服务与角色分配:勾选组件 → 每个角色指定节点(master/worker/client 三类角色各就各位)
- 参数配置:向导中按 configType 分组展示参数,改动
value 即可;HA/路径/Kerberos 参数集中在此
- 一键部署:管理端生成 DAG(DAGBuildActor)→ 分发部署包(DispatcherWorkerActor)→ worker 解压 → 渲染配置(ConfigureServiceActor,FreeMarker)→ 执行
control_xxx.sh 启停(InstallServiceActor/StartServiceActor)→ 状态回传
五、核心组件参数说明与优化
以下参数均来自 DDP-2.0.0 实际定义(含默认值),优化建议与《XXX 生产调优实践》系列一致。
HDFS(默认:blocksize 256M、replication 3、NN 堆 8G)
| 平台参数 |
默认值 |
说明与优化 |
dfs.blocksize |
268435456(256M) |
已比社区默认 128M 大一档:大块省元数据;文件以小文件为主时改回 134217728 |
dfs.replication |
3 |
容量与可靠性取舍:有异地备份可降 2 |
namenodeHeapSize(slider) |
8 |
NN 堆内存,按”每百万块 2~4G”估算:32C256G 中型集群调 16,64C512G 大规模调 32 |
datanodeHeapSize |
8 |
DN 堆,写密集调大 |
dfs.namenode.handler.count(slider) |
16 |
按 20×log2(节点数):百节点集群应调到 130~200 |
dfs.datanode.handler.count |
8 |
写密集调 30~50 |
dfs.namenode.name.dir(multiple) |
空 |
必填:多目录分盘(如 /data1/nn,/data2/nn),元数据命根子 |
dfs.datanode.data.dir(multiple) |
空 |
每节点多盘逗号填多目录 |
hadoop.tmp.dir |
/data/tmp/hadoop |
运行临时目录,放数据盘 |
dfs.journalnode.edits.dir |
/data/hdfs/jn |
JournalNode 日志目录,独立盘 |
enableRack + rack 参数 |
false |
大集群开启机架感知(TableMapping + rack.properties) |
dfs.permissions.enabled |
false |
注意默认关闭权限检查;接 Ranger 后由 Ranger 策略管权限 |
YARN(默认:NM 内存 32G、容器上限 128G、公平调度)
| 平台参数 |
默认值 |
说明与优化 |
yarn.nodemanager.resource.memory-mb |
32768 |
单节点容器内存总量:8C16G 配 12G、32C256G 配 220G、64C512G 配 460G(预留系统) |
yarn.nodemanager.resource.cpu-vcores |
4 |
与 pcores-vcores-multiplier(2.1)配合:pcores × 2.1 是默认核数算法,可按物理核直接改 |
yarn.scheduler.minimum/maximum-allocation-mb |
2048 / 131072 |
容器内存上下限:最小 2G、最大 128G,防单容器”一口吃太多” |
yarn.nodemanager.local-dirs / log-dirs(multiple) |
空 |
多盘填多目录,容器临时数据与日志分散 IO |
yarn.log-aggregation-enable |
true |
日志聚合到 HDFS,yarn.nodemanager.remote-app-log-dir 指定位置 |
yarn.nodemanager.aux-services |
spark_shuffle,mapreduce_shuffle |
已预置 Spark Shuffle Service,配合 Spark 动态分配 |
yarn.resourcemanager.scheduler.class |
FairScheduler |
生产按队列规划选 Capacity 或保留 Fair:配合 yarn.scheduler.fair.allocation.file 定义队列 |
yarn.node-labels.enabled |
true |
节点标签调度:大集群按”计算型/内存型”打标签隔离 |
Zookeeper(默认:堆 1G、tickTime 2000)
| 平台参数 |
默认值 |
说明与优化 |
dataDir / dataLogDir |
/data/zookeeper、/data/log/zookeeper |
快照与事务日志分目录分盘,事务日志盘性能决定写性能 |
zkHeapSize(slider) |
1 |
ZK 数据全在内存,2~4G 足够;不随规格盲目加大 |
maxClientCnxns |
60 |
连接池大的业务调 500~3000 |
initLimit / syncLimit |
10 / 5 |
大集群/慢网络调 30/10 |
server.1 ~ server.7 |
空 |
集群节点声明(ip:2888:3888),几台配几个 |
autopurge.snapRetainCount / purgeInterval |
3 / 12 |
快照自动清理,防磁盘写满 |
custom.zoo.cfg(multipleWithKey) |
- |
追加任意 zoo.cfg 配置的扩展口 |
Kafka(默认:分区 8、副本 2、IO 线程 12、堆 6G)
| 平台参数 |
默认值 |
说明与优化 |
num.partitions |
8 |
分区数按吞吐规划:目标吞吐 ÷ 单分区吞吐;后期只加不减 |
default.replication.factor |
2 |
生产 3 副本 + 内置 topic(offsets.topic.replication.factor=3) |
num.network.threads / num.io.threads |
3 / 12 |
按核数调:8C 网络 4、IO 8;32C IO 16 |
log.dirs(multiple) |
空 |
数据目录多盘 |
log.retention.hours |
168 |
与磁盘容量联动,配 log.retention.bytes 更可控 |
kafkaHeapSize(slider) |
6 |
页缓存优先,堆 4~8G 即可,不随规格涨 |
message.max.bytes |
10000120 |
单条消息上限,大消息业务按需调 |
unclean.leader.election.enable |
false |
保持 false,杜绝数据乱序 |
Hive(默认:MR 引擎、map/reduce 内存 8G、堆 256M)
| 平台参数 |
默认值 |
说明与优化 |
hive.execution.engine |
mr(select) |
生产切 tez(装 TEZ 服务后)或 spark |
mapreduce.map/reduce.memory.mb |
8192 |
MR 引擎容器内存;切 Tez 后由 tez.container.size 接管 |
mapreduce.input.fileinputformat.split.maxsize |
1073741824(1G) |
输入分片上限:小文件多调小(如 256M)提并行 |
hive.merge.mapfiles / mapredfiles / merge.size.per.task |
true/true/256M |
小文件合并三件套已默认开启 |
hive.metastore.warehouse.dir |
/user/hive/warehouse |
数仓根目录 |
hiveHeapSize |
256 |
默认偏小:HiveServer2 堆按规格调 4~8G |
hive.server2.support.dynamic.service.discovery |
true |
HS2 多实例 + ZK 动态发现,HiveServer2 可多台 |
custom.hive.site.xml |
- |
追加 hive-site.xml 参数扩展口(如 CBO、MapJoin 阈值) |
Spark3(默认:executor 8g×2core、driver 8g、动态分配开)
| 平台参数 |
默认值 |
说明与优化 |
spark.executor.memory / spark.executor.cores |
8g / 2 |
单 Executor 内存 832G、核 35;8C16G 节点降 4g×2 |
spark.driver.memory |
8g |
client 模式本地 JVM;大规模调 16g |
spark.dynamicAllocation.enabled + min/max |
true、1/6 |
动态分配已开;maxExecutors 按队列资源定 |
spark.shuffle.service.enabled |
true |
与 YARN aux-services 的 spark_shuffle 配套 |
spark.eventLog.enabled / spark.history.fs.logDirectory |
true / hdfs://…/spark-logs |
事件日志与 HistoryServer 已默认开 |
custom.spark.defaults.conf |
- |
追加参数口(AQE、广播阈值、Kryo 等按调优文章补) |
Flink(默认:JM 堆 1.6G、TM 1.28G)
| 平台参数 |
默认值 |
说明与优化 |
jobmanager.memory.heap.size |
1600m |
8C16G 够用;大集群调 4~8G |
taskmanager.memory.flink.size |
1280m |
偏小:按规格调(8C16G→12G、32C256G→24G),配合 custom.flink.conf.yaml 补托管内存比例 |
enableJMHA + zookeeper 参数 |
false |
生产开启:high-availability=zookeeper、storageDir 指向 HDFS |
custom.flink.conf.yaml |
- |
追加 flink-conf.yaml 参数口(RocksDB、checkpoint、并行度) |
Tez(依赖 HDFS)
| 平台参数 |
默认值 |
说明与优化 |
tez.lib.uris |
${fs.defaultFS}/tez/tez.tar.gz |
平台自动把 Tez 库上传到 HDFS 并注入,无需手工 put |
custom.tez.site.xml |
- |
追加 tez-site.xml(tez.container.size、Session 超时等) |
Kerberos(1.15.1)
| 平台参数 |
默认值 |
说明与优化 |
realm |
HADOOP.COM |
域名(全大写惯例) |
ticketLifetime / renewLifetime |
24h / 7d |
覆盖长作业:按作业时长调大 renew 并配自动续票 |
kdcHost / kadminHost |
${kdcHost} |
KDC 主机自动回填 |
Kerberos 全局联动:各组件参数中的 enableKerberos 开关 + configType=kb 组(principal/keytab 等)会统一启用:HDFS 的 nn/_HOST@${realm}、Kafka 的 SASL_PLAINTEXT、Hive 的 hive.server2.authentication=kerberos 全部由平台按 ${realm} 自动组装——这正是”编排平台”相对手工部署的巨大优势。
Ranger(2.1.0)
| 平台参数 |
默认值 |
说明与优化 |
auditStore |
elasticsearch |
审计存储指向 ES(版本内已集成 7.16.2) |
enableHDFSPlugin / enableHIVEPlugin / enableHBASEPlugin |
false |
按需开启:开插件后对应组件侧自动生成 Ranger 集成(HDFS 的 RangerHdfsAuthorizer、HBase 的 coprocessor 类) |
rangerWebUrl / rangerUserPass |
${rangerAdminUrl} / 初始密码 |
部署后立即修改默认密码 |
六、三档规格参数速查
| 组件 |
8C16G |
32C256G |
64C512G |
HDFS namenodeHeapSize |
4 |
16 |
32 |
YARN memory-mb |
12G |
220G |
460G |
YARN cpu-vcores |
6 |
28 |
58 |
Kafka kafkaHeapSize |
4 |
8 |
8 |
| Spark executor |
4g×2 |
16g×4 |
32g×5 |
Flink taskmanager.memory.flink.size |
12G |
24G |
48G |
Hive hiveHeapSize(MB) |
4096 |
8192 |
16384 |
ZK zkHeapSize |
2 |
4 |
4 |
七、部署优化建议
- 先装依赖链:ZOOKEEPER → HDFS → YARN → Hive/Tez/Spark/Kafka;Kerberos 建议最早装(后续组件 principal 自动联动)
- 路径类参数(configType=path)部署前一次配对:数据目录、日志目录、HA 地址,后期改动需重启组件
- 善用
custom.* 扩展参数:官方参数表没有的(如 Spark AQE、Hive MapJoin 阈值、Tez container 大小),用 multipleWithKey 追加,不必改源码
- HA 参数组在向导中集中核对:HDFS 双 NN + JournalNode(3 台)+ ZKFC、YARN 双 RM,
cardinality=1+ 保证可分配两台
- Kerberos/Ranger 一键联动:安全需求高的集群,先装 KERBEROS,各组件开启
enableKerberos;再装 RANGER 并开启各组件插件
- 监控栈随装随用:PROMETHEUS + GRAFANA + ALERTMANAGER 由平台部署并自动抓取各组件 jmxPort
- 与手工部署的衔接:DataSophon 生成的配置文件在组件安装目录(
${INSTALL_PATH})下,custom.* 追加的参数与平台默认参数合并渲染,排障时可直接查看最终配置文件,与调优系列文章的参数互相印证
常见问题
- 变量渲染出空地址(如
zookeeper.connect 为空):依赖服务未安装或未启动,检查服务依赖顺序
- 参数修改不生效:向导中改参数后需重新分发配置并重启对应角色;
custom.* 参数修改同理
- 达梦/数据库连接失败:定制版默认达梦驱动,换 MySQL 需同步修改驱动类与连接串
- 角色分配不符校验:HA 角色(NameNode/JournalNode/RM)
cardinality=1+,至少分配 1 个;双主需 2 个
- 部署失败排查入口:worker 端组件目录的
control_xxx.sh 脚本与日志(logFile 参数定义了路径),单角色可单独重装
总结
DataSophon 的价值不在”省去敲命令”,而在把组件间的依赖、地址、安全联动固化成参数模型:变量注入解决了地址编排,configType 分类管理了 HA/Kerberos/Ranger 等横切关注点,custom.* 保留了手工调优的全部自由度。部署时按”依赖链 → 路径参数 → 规格参数 → 安全联动”的顺序推进,再结合调优系列的三档规格表,即可从”能装”走向”装好”。