接手过离线部署大数据集群的活儿大概都知道那种“外网断干净依赖却一堆”的滋味。在生产内网、信创环境或者安全性要求比较高的私有云环境里很多机器根本不允许连外网而 Cloudera Manager 6.3.1 和 CDH 6.3.1 又是很多企业跑数仓和离线计算的老搭档。把这一整套东西在 CentOS 上离线装起来说难不难说简单也不简单最关键的其实是思路版本匹配、仓库准备、依赖处理、以及那台管理机上的初始化步骤。这篇文章就是我实际动手部署多套集群后沉淀下来的完整记录全部基于 CentOS 7 环境、完全离线模式把从环境准备、资源下载、本地仓库搭建到 Manager 安装、CDH 部署、常见故障处理的所有坑都串一遍。如果你正准备在隔离环境里搭 CDH 集群或者只是想搞清楚离线包到底该怎么组织这篇文章可以直接当作战手册用。1. 离线安装的整体思路与版本选型1.1 为什么一定要选离线方式很多团队一开始都在线装 CDH一条命令拉包很方便。但真实的生产环境往往不是这样的业务平台部署在独立的 VPC、政务云或者机房隔离区里这些地方要么完全屏蔽外网要么只开放特定白名单端口。更麻烦的是CDH 版本迭代很快外网源一旦变动在线安装时候的某个依赖版本可能就被替换掉了等装上以后排查环境差异非常痛苦。离线安装最大的好处是确定性把所有需要的 RPM 和 parcel 包提前下载好保存在本地仓库里整个集群全部从本地源取包。这样无论安装多少次、换多少机器最终得到的集群软件版本完全一致部署结果可复现。对于需要文档化和审计的运维项目来说这种可复现性是决定性的优势。而且离线包不依赖外部网络状态下载过程里也不怕源漂移或者 CDN 抽风整个安装节奏完全掌握在自己手里。可以说离线安装不是“有没有外网”的问题而是“我信不信外网”的问题。生产环境里我宁愿多花半天准备资源也不愿意在线装到一半卡在一个依赖上报错。1.2 版本组成与兼容性分析Cloudera Manager 6.3.1 和 CDH 6.3.1 是配套使用的这个版本组合对应的是“传统 CDH 分发”时代比较成熟的组合。CM 负责管理集群的安装、监控、告警、配置和统一运维CDH 则是大数据组件发行版内部包含 HDFS、YARN、ZooKeeper、Hive、Spark、Impala、Kudu、Flume、Sqoop 等一整套组件。在选择离线安装包时有四个核心版本必须严格匹配组件版本要求说明操作系统CentOS 7.2 及以上推荐 7.4~7.9el7 系列 RPM 包内核 3.10 以上JDKOracle JDK 1.8推荐 1.8.0_181 或 _212CM 自带 JDK 也行但生产环境我建议统一手动装数据库MySQL 5.7 / MariaDB 10.2 / PostgreSQL 等CM 元数据存储选一个外部库更稳妥CDH 版本6.3.1parcel 文件名里的内部版本号以 p0.1470578 结尾与 CM 6.3.1 严格配套一个容易踩的坑是 JDK 兼容问题。如果系统默认安装了 OpenJDK 11CDH 6.3.1 里的部分组件可能启动失败因为老版本 Spark 或 HBase 对 JDK 编译版本有要求。我建议直接把 JDK 固定为 1.8并且不要在生产机上看“哪个版本新就装哪个”大数据集群的稳字当头老版本 JDK 反而最可靠。数据库方面也别图省事用 CM 自带的嵌入式 PostgreSQL 作为生产环境存储。虽然它部署起来简单但后期备份、扩容、排障的能力都受限。离线部署时提前规划一个外部 MySQL 或 MariaDB后面的事情会顺很多。2. 集群规划与前置环境准备2.1 主机角色划分与硬件评估离线部署 CDH 集群前最重要的不是急着下载而是先想清楚集群规模和管理节点的部署模型。一套最小可用集群至少包含三种角色管理节点运行 Cloudera Manager Server保存集群监控数据和元数据生产环境建议独立部署视集群规模给 8G 到 16G 内存。主节点Master运行 NameNode、ResourceManager、HMaster 等核心角色至少 16G 内存如果机器资源允许最好 32G。从节点Worker运行 DataNode、NodeManager、RegionServer 等角色按数据量规划 CPU、内存和磁盘容量。我在规划时还习惯把管理节点同时作为本地仓库服务器使用把离线安装包和 parcel 文件放在这台机器的磁盘上通过 Nginx 共享给整个集群。这样可以在不增加额外硬件的情况下解决集群内所有机器拉包和 parcel 分发的问题。磁盘方面要注意避开根分区。CDH 的数据角色默认会占用大量空间HDFS 数据目录、Yarn 日志目录不要放在根目录否则日志一膨胀就把系统盘写满了。我见过不止一次因为日志盘写满导致集群假死的案例这块必须提前做好目录规划。2.2 主机名、网络与系统基础配置集群里每一台机器的主机名必须固定并且要在 /etc/hosts 里写好固定的内部 IP 映射。CDH 的组件对主机名解析非常敏感CM 在安装时会把主机名和 IP 的关系写入数据库如果后面主机名漂移整个集群的 Agent 上报可能全部断掉。# /etc/hosts 示例三台节点规划 192.168.10.11 cmserver # 管理节点 192.168.10.12 node01 # 主节点 192.168.10.13 node02 # 从节点第二件事是关闭防火墙和 SELinux。这里的“关闭”不是说让你忽略安全而是在版本安装阶段先排除干扰。CDH 组件之间的通信端口非常多HDFS 用 8020/50070Yarn 用 8088/8032ZooKeeper 用 2181如果防火墙策略没有完全配置好安装过程中出现的“主机无法连接”“Agent 心跳丢失”排查起来特别耗费时间。验收和加固阶段再通过安全组规则统一开放端口比一开始就在每台机器上折腾 iptables 要省心得多。SELinux 建议设置为 permissive 模式重点不是完全关掉而是避免它默认拦截某些进程的访问。改完配置之后重启或者执行 setenforce 0 临时生效。除此之外各节点的时钟要同步。因为 Hadoop 各类组件对时间漂移非常敏感Kerberos 认证环境更是对时间差有硬性要求。离线环境没有外网 NTP 源时把管理节点配置为内网 NTP 服务端其他节点向其同步时间偏差控制在 0.5 秒以内。2.3 JDK 安装与环境变量虽然 Cloudera Manager 安装包里自带 JDK但我不太推荐依赖它因为 CM 自带的 JDK 路径和权限控制比较特殊后期如果需要用 JDK 命令行工具或者调整 GC 参数操作起来不够直观。我更习惯在装 CM 之前先把 JDK 1.8 装好然后让整个集群都统一使用这一份 JDK。# 解压 JDK 到统一目录 tar -zxvf jdk-8u212-linux-x64.tar.gz -C /usr/local/ mv /usr/local/jdk1.8.0_212 /usr/local/java # 写入环境变量 cat /etc/profile.d/java.sh EOF export JAVA_HOME/usr/local/java export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar EOF source /etc/profile.d/java.sh java -version装完之后建议验证$JAVA_HOME是否对所有用户生效。CM 的 Agent 服务通常以 root 身份启动但如果后续配置了 Kerberos 或者以其他用户运行服务JAVA_HOME 不生效会直接导致组件启动失败。方法是 su 切换用户再执行 java -version 确认。3. 离线安装包准备与本地仓库搭建3.1 资源清单与下载步骤离线安装牵扯的软件包比较多如果不提前理清清单很容易漏下载或者下错版本。我的经验是先列出五类必需资源CM RPM 包cloudera-manager-daemons、cloudera-manager-agent、cloudera-manager-server 等CDH parcel 包CDH-6.3.1-1.cdh6.3.1.p0.1470578-el7.parcel 以及对应的 manifest.jsonJDKOracle JDK 8 安装包数据库驱动MySQL JDBC 驱动 jar 包mysql-connector-java工具类软件Nginx 安装包用于本地源服务以及 createrepo 等依赖。下载时建议在一台有外网的“跳板机”或办公电脑上执行然后把资源拷贝到生产网内。CM 仓库的 RPM 包文件数不少直接 wget 递归下载容易漏掉子目录我习惯用 rsync 同步整个目录结构保证目录层级完整# 同步 CM 6.3.1 的 YUM 仓库到本地 rsync -av rsync://archive.cloudera.com/cm6/6.3.1/redhat7/yum/ /data/repo/cm6/ # 同步 CDH parcel 目录 rsync -av rsync://archive.cloudera.com/p/cdh6/6.3.1/parcels/ /data/repo/cdh6/如果 rsync 协议访问受限也可以直接用 wget 带 -r 参数抓整个页面目录。注意 parcels 目录里除了 CDH parcel 文件还有一个末尾带 .sha 的校验文件这个文件也必须同步过来否则 parcel 校验会失败。3.2 建立本地 YUM 仓库拿到所有 RPM 之后需要把这些 RPM 组织成一个标准的 YUM 仓库让集群里的机器可以通过 HTTP 访问并安装。如果原来下载的 repo 目录里保留了 repodata 信息可以直接用但如果目录结构有变动就需要重新生成 repodata。# 安装 createrepo yum install -y createrepo # 生成 CM6 仓库元数据 cd /data/repo/cm6/ createrepo . # 生成其他子目录的元数据 cd /data/repo/cdh6/ createrepo .生成元数据后用 Nginx 把整个 /data/repo 目录发布为 HTTP 服务。为什么不直接给每台服务器挂载本地共享目录原因很简单HTTP 的部署方式更通用后续扩展节点时只要配置好 repo 文件就能拉包不需要处理复杂的内核挂载和权限问题。Nginx 配置里注意开启目录索引否则客户端无法列出目录和下载文件server { listen 80; server_name _; root /data/repo; autoindex on; autoindex_exact_size off; autoindex_localtime on; }然后写一个统一的 repo 文件分发到集群所有节点上# /etc/yum.repos.d/cloudera-manager.repo [cloudera-manager] nameCloudera Manager 6.3.1 baseurlhttp://cmserver/cm6/ enabled1 gpgcheck0 # /etc/yum.repos.d/cloudera-cdh.repo [cloudera-cdh] nameCloudera CDH 6.3.1 baseurlhttp://cmserver/cdh6/ enabled1 gpgcheck0gpgcheck 建议直接设成 0因为离线环境本身就是受控的可以省略 GPG 签名验证引入的额外麻烦。每台机器执行yum repolist确认仓库目录能看到且能正常列出软件包。3.3 parcel 包的本地分发准备parcel 和前面说的 RPM 仓库不是一个概念它在 CDH 安装向导中由 CM 统一分发到每台 Agent 机器上。离线环境里CM 默认尝试从 archive.cloudera.com 下载 parcel断网环境下需要给 CM 指定一个本地 parcel 仓库也就是把下载好的 CDH parcel 文件放到可以通过 HTTP 访问的位置。实际上 CM 在“实例”栏里可以自定义远程 parcel 仓库 URL。流程是先把 CDH-6.x.parcel 和 manifest.json 放在本地 HTTP 目录然后在 CM 的 parcel 配置里填写这个本地路径直接点击“下载”时CM 实际是从本地 URL 取的包和在线安装时的操作路径完全一致。常见的错误是只放了 .parcel 文件却漏掉 manifest.jsonCM 界面里一直显示无法解析 parcel 列表。还有一个问题是校验文件缺失导致的“证书不匹配”或“校验失败”报错所以 .sha 文件也要一并放进去。4. Cloudera Manager 安装实操4.1 安装并启动 Manager Server在所有前置环境和本地仓库就绪后开始安装 CM。首先在管理节点上安装服务端相关 RPM在每一台 Agent 节点上安装 Agent 包# 管理节点执行 yum install -y cloudera-manager-daemons cloudera-manager-server cloudera-manager-agent # 其他节点执行 yum install -y cloudera-manager-daemons cloudera-manager-agent安装完成后CM 的配置文件在 /etc/cloudera-scm-agent/config.ini 里。Agent 会默认连接 localhost 的 7182 端口这个配置必须重点修改把 server_host 改成 CM Server 的主机名或内网地址[General] server_hostcmserver server_port7182修改完在每个 Agent 节点启动服务systemctl start cloudera-scm-agent systemctl start cloudera-scm-server启动 CM Server 后建议盯着日志文件观察初始化进度不要急着打开网页因为首次启动要初始化数据库并生成配置文件耗时 1-3 分钟不等tail -f /var/log/cloudera-scm-server/cloudera-scm-server.log当日志出现 “Started Jetty server” 这个关键字时说明 Manager 已经就绪浏览器访问 http://cmserver:7180 就能看到登录页面默认账号密码是 admin/admin。4.2 数据库初始化与连接驱动配置CM Server 本身是一个 Java 应用元数据必须存储在数据库中。离线安装通常选择 MySQL 5.7 或 MariaDB。我这里以 MySQL 5.7 为例讲解。先在 MySQL 里为 CM 创建专用的数据库实例和用户CREATE DATABASE IF NOT EXISTS scm DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; CREATE USER scm% IDENTIFIED BY scm_password; GRANT ALL PRIVILEGES ON scm.* TO scm%; FLUSH PRIVILEGES;CM 还有一个可选的监控数据库一般叫 amon我需要一并创建。如果后续需要安装 Hive、Oozie、Hue 等服务它们的体系结构各自需要独立的数据库这类数据库就在向导过程中创建。关键在于驱动放置把 mysql-connector-java.jar 放到 CM Server 和 Agent 节点的特定目录下CM 的类和库必须能扫描到mkdir -p /usr/share/java/ cp mysql-connector-java-5.1.48.jar /usr/share/java/mysql-connector-java.jar不少人在离线安装时到了这一步就卡住了因为包里有驱动却不放对位置最后启动 CM Server 时一直报java.lang.ClassNotFoundException: com.mysql.jdbc.Driver这样的错误。正确提醒除了 ServerAgent 机上如果后续要跑依赖 JDBC 的组件服务也要放这个驱动。数据库初始化可以使用 /opt/cloudera/cm/schema/scm_prepare_database.sh 脚本自动完成表结构创建/opt/cloudera/cm/schema/scm_prepare_database.sh mysql cmserver scm scm_password执行脚本后它会连接 MySQL创建 CM 所需的全部表结构并写入 /etc/cloudera-scm-server/db.properties。看到 “Successfully connected to database” 和 “All done” 字样时就完成了。5. CDH 集群部署实操记录5.1 在 Web 界面中完成集群向导CM Server 启动成功后浏览器访问管理页面用默认账号登录。向导会引导你进行集群创建第一步是给集群起名字然后会让你在“添加主机”里输入 Agent 节点的主机名或 IP 列表。这一步有个关键的认知壁垒CM 检测 Agent 依赖的是 Agent 进程与 Server 的长连接所有 Agent 必须提前启动且 Server 和 Agent 之间的 7182 端口必须通。输入主机列表后CM 会根据 Agent 线程建立的那条链接自动识别主机识别成功的小主机也会显示在界面里。在离线部署中集群向导的下一步是选择 parcel 仓库。这里要选择“使用自定义仓库”把自定义 parcel 仓库地址填成 http://cmserver/cdh6/保证它显示 CDH-6.3.1 版本。点击“下载”时CM 会把 parcel 文件下载到它的本地 parcels 目录这步时间长短取决于网络速度但因为是内网传送速度通常比外网源快很多。下载完成后“分配”到各台主机然后“解压”整个流程是可视化的但解压 parcel 也是耗时操作。集群机器磁盘 IO 性能好的话三五个节点大概几分钟就结束如果数据盘性能较差这个阶段会显得特别漫长实测在机械盘阵列上解压一个 CDH 6.3.1 可能需要十几分钟以上。5.2 主机检查与前置条件核对在 CDH parcel 完成后CM 向导会对每一台主机执行一次“主机健康检查”检查内容包括磁盘空间、内存大小、依赖组件、Python 版本、swap 配置等。这一项在离线环境里经常遇到多种问题常见情况有主机名不是 FQDN 或 /etc/hosts 未配置完整导致主机校验失败Python 版本不对旧版 CDH 需要 Python 2.7swap 过大会提示性能风险磁盘空间不足。处理方式是在计划阶段就按照要求统一配置好。建议在每台节点上把/etc/sysconfig/network里的 HOSTNAME 管理好然后重启网络服务。装 CDH 前一定要设置空闲页处理策略关闭透明大页合并功能echo never /sys/kernel/mm/transparent_hugepage/defrag echo never /sys/kernel/mm/transparent_hugepage/enabled这个设置要写入开机启动脚本里否则节点重启后会恢复默认值。Hadoop 的并发内存访问在启用 THP 的环境下可能发生锁竞争导致性能严重劣化。主机健康检查通过后CM 会让选择要安装的服务组合。最小化情况下我建议先选“自定义服务”把 HDFS、YARN、ZooKeeper 这三个最核心的组件先拉起来后续再通过“添加服务”补 Hive、Spark 等。这样做的原因是如果第一次就一股脑选一堆服务任何一个组件配置问题都会拖慢整个装署部署时间大幅拉长排查问题的时候主机的情况下点难确定。5.3 角色分配与核心参数配置在服务层级选择完成后需要把各角色分配到对应主机。这里我遵循的原则是ZooKeeper 节点和 NameNode 节点要错开避免同一台机器既跑 ZK 又跑 HDFS 的 Namenode防止硬件故障时单点同时丢两块。一般管理节点扛 NameNodeResourceManager另外两台从节点扛 DataNode 和 NodeManagerZooKeeper 放在奇数台节点上最小编号是三台。关键的 HDFS 配置中要检查数据目录和名称目录指向的数据盘位置手动确认没有落到临时分区上。默认配置往往会把 namenode 的数据目录放在系统盘内存和 IO 瓶颈都会在后面凸显。我把数据目录改为 /data1/dfs/nn 和 /data1/dfs/dn 这类大空间的位置然后在向导里勾选“格式化 NameNode”。YARN 的内存配置方面CM 会根据每一台主机的物理内存自动计算建议值但性能调优时不要直接接受默认值。我需要根据实际上运行的任务类型来调整如果只是跑 Spark、Hive SQL 这类计算任务就保留 CM 的推荐值作业多是 Flink 流式时就要给 NodeManager 预留更多内存。配置完成后点击“继续”CM 会在各个角色所在主机上启动全部进程。首次启动阶段可以打开“实例”页面看进程状态把鼠标悬停在红色报警项上基本上可以直接看到具体的启动失败原因。5.4 补充服务安装要点CDH 6.3.1 里的常用补充服务包括 Hive、Spark、Hue、Oozie、Impala 等。如果想尽快把离线数仓的链路跑通先把 Hive 和 Hue 装好是最实用的HDFS 加 Hive 加 Hue 的组合可以解决多半交互式查询需求。Hive 安装需要独立的 MySQL 数据库 hive 库以及对应的 metastore 用户。安装时 CM 会要求填写连接串和驱动地址这里的连接串要注意指定 useSSLfalse 并允许公钥检索不然高版本 MySQL 会拦截连接。Spark 安装相对简单CM 会默认把 Spark 相关 jar 和配置部署到各节点。但 CDH 6.3.1 的 Spark 默认不再支持通过 Cloudera Manager 动态分配 executor 依赖的一些预设参数需要打开 YARN 的“允许 Spark 使用节点内存信任度”配置具体数值要参考该机器同时运行的其他服务占用情况来定不能简单地照着在线教程抄一通。Hue 启动时经常出现的问题是“数据库表创建失败”或者“连接 SCM 数据库超时”这些都要检查 Hue 服务自己的 DB 配置是否正常以及指向的数据库是否提前创建了。6. 常见问题与排查技巧实录6.1 高频故障速查表离线安装过程中遇到的问题主要集中在包依赖、数据库驱动、主机识别、parcel 校验这四类。我整理了一个速查表方便大家在现场对照排查故障现象常见原因解决办法yum 安装 CM 时报依赖冲突本地仓库缺依赖 RPM或者启用了系统自带源导致混合确保整个 yum 只使用本地仓库用yum --disablerepo* --enablerepocloudera-manager安装CM Server 日志报数据库连接失败MySQL 驱动没放到 /usr/share/java或 db.properties 中密码错误放入 mysql-connector-java.jar重新执行 scm_prepare_database.shAgent 启动后 CM 界面不显示主机server_host 配置成了 localhostAgent 端口连不上检查 config.ini先在 Agent 节点执行curl cmserver:7182通不通parcel 一直停留在“下载失败”manifest.json 找不到或校验文件 .sha 缺失确认本地 parcels 目录下有完整文件校验文件命名必须相符主机检测提示“无法从主机检索运行状况”Agent 和 Server 的时间差距超过阈值检查集群时间同步重启 Agent 服务HDFS 启动失败NameNode 报磁盘空间不足默认数据目录放在根分区根分区被打爆重新格式化并给 dfs.namenode.name.dir 指定大分区目录Hue 首次登录一直卡在转圈Hue 数据库权限不足给 Hue DB 用户增加对应库表 DDL 权限重启 Hue 服务这些故障里面“parcel 校验失败”是我见过最多人卡住的。原因不只是缺文件还有可能是下载 parcel 过程中网络断断续续导致文件损坏而 .sha 校验文件没有正确同步。遇到这种情况不要去 CM 界面反复点下载直接把宿主机上 parcel 文件删除重新拷贝一遍干净的包再点击分发。6.2 安装之后的优化策略与维护习惯集群跑起来不代表工作结束离线环境的运维思路跟在线环境有明显差异因为无法随时拉新依赖所以所有行为都要围绕内部仓库做文章。第一要把本地仓库纳入彻底备份机制。CDH 6.3.1 的 parcel 和 CM RPM 体积加起来有好几十 GB维护人员经常忘记备份一旦管理节点磁盘损坏重新离线构建一套仓库的成本特别高。建议把仓库目录纳入定时 rsync 到备份磁盘或者远程备份机至少保留两个副本。第二内核和系统参数调优是稳定性的关键。虽然 CM 在安装时会自动修改一部分配置比如 vm.swappiness但透明大页THP和文件句柄限制这种底层设置它不会完全处理干净。文件句柄数尽量调大在 /etc/security/limits.conf 中把* soft nofile 65536和* hard nofile 65536两条设置写入。第三监控告警要尽早配置。离线环境里 JDBC 服务如果有一个端口悄悄挂掉排查起来效率很低。CM 自带的各种 health check 非常好用把“HDFS 健康”“YARN 内存可用率”“ZooKeeper 服务状态”这几个监控项打开并设置成邮件或短信告警就可以尽量避免等业务方反馈时才后知后觉。第四对集群日志做定期归档。管理节点上的 /var/log/cloudera-scm-server、各节点上的 /var/log/hadoop-hdfs、/var/log/hadoop-yarn 目录会以惊人的速度膨胀。我处理的时候是把日志目录改到容量充足的数据盘再写了一个 cron 脚本将超过 30 天的日志压缩归档到备份目录这样既保留了排查依据又不占用系统盘空间。6.3 一些离线安装特有的操作心得我额外分享几个闭坑经验这些地方普通文档几乎不会提到。第一个不要在“安装 parcel”阶段把 CM 界面的下载并行数调得太大。离线网络环境通常没有外网瓶颈但内网带宽也可能被多个 Agent 同时拉包占满反而导致后续主机检查阶段的性能问题。实测在活动目录环境里下载 parcel 的并发请求数保持默认就挺好速度不差稳定性还好。第二个CM 版本一旦初始化了数据库尽量不要轻易重装或者跨版本升级。离线环境下重装 CM 不是卸载再装那么简单数据库里残留的表结构和配置如果清理不干净下次初始化时很容易报主键冲突。必须完整卸载时先把数据库里的 scm 库、amon 库全部 drop 掉再把各节点的 /opt/cloudera 目录清空最后才可以重新安装。第三个熟悉命令行调试。Web 界面虽然直观但在 Agent 节点多、告警信息不全的情况下直接进日志目录看进程日志比刷界面有效一百倍。比如 Agent 连接 Server 失败的排查一定先在节点上重启服务然后tail -f /var/log/cloudera-scm-agent/cloudera-scm-agent.log日志会把握手失败的原因直接写出来比在界面上猜快得多。写在最后的小提醒离线部署 CDH 说到底是“准备阶段的活”下载资源、搭仓库、装依赖这些事情做得到位不到位直接决定了后面安装是否顺利。我自己装了这么多套集群最大的体会是不要把离线安装理解成一个单步命令的执行过程而要把它当做一个受控环境的构建过程。环境受控了整个集群的软件边界就完全掌握在自己手里这种安心感是在线安装给不了的。最后再分享一个实用习惯每次装完一套离线集群我都会把关键配置项和实际安装步骤整理成一份内部文档并把本地仓库的版本哈希值记录下来。这样后续做同样的环境扩容或者新集群交付时完全可以照着之前的文档依样画葫芦效率翻倍而且不会出现版本漂移。希望这篇记录能帮你在内网环境里顺利把 CDH 6.3.1 跑起来。