简介《鲲鹏云大数据实验docx》是一份面向大数据初学者、云计算课程学生与实验指导者的实操型实验报告围绕华为云ECS、OBS及Hadoop集群部署展开可用于课程实验、云端环境搭建练习和集群配置复盘。压缩包仅含1个docx文档体积约2.52MB文件类型单一但内容完整以图文步骤和配置记录承载实验全过程便于集中阅读和按节点对照操作。文档从购买配置ECS、OBS及获取AK/SK入手记录三节点Hadoop集群的hosts设置、SSH免密互信、目录创建、安装包解压、核心站点与HDFS/YARN/MapReduce参数配置以及slaves节点定义和环境变量调整对Java家目录错误导致的重新分发、NameNode初始化与HDFS启动失败等排错过程也有呈现。已有893人学习可帮助读者理解云上大数据基础设施的部署流程、节点一致性维护和常见问题定位。1. 一份能照着跑通的云端 Hadoop 实验记录第一次在鲲鹏云上拉三节点 Hadoop 集群最容易出错的地方往往不是 XML 写错而是JAVA_HOME少写了一层目录。hdfs namenode -format直接报 java 找不到接着start-dfs.sh一路报错你以为集群挂了其实是 JDK 路径没指对。这份大数据实验 docx 记录的就是这样一条从买 ECS、开 OBS 桶、拿 AK/SK到配/etc/hosts、做 SSH 互信、写四个 XML、分发、格式化、起 HDFS 的完整链路中途因为JAVA_HOME写错而重新分发安装包的细节也原样留着。它适合要交实验报告的学生也适合第一次把 Hadoop 部署到 ARM 云主机上的运维。文档更像一份施工记录照着能跑跑出问题时知道该看哪里。2. 云上基础ECS 规格、OBS 桶与 AK/SK 三个参数怎么定动手写配置前先把云上那几样东西定下来。这一章的判断如果错了后面所有配置文件基本都要推倒重来尤其是区域和架构这两项。2.1 选用 ARM 实例的理由与代价鲲鹏云上的算力实例是 aarch64 架构实验文档里 JDK 包名带着.aarch64后缀这就是最直接的证据。选 ARM 的理由很实际同规格下单位算力成本更低三节点集群跑一周实验费用差距能看出来。代价也得提前知道。Hadoop 2.8.3 官方二进制包share/hadoop/common/lib下的 native 库是 x86-64 编译的放到 aarch64 上hadoop checknative -a会报 zlib、snappy、bzip2 全部不可用。这不影响集群起来因为 Hadoop 有纯 Java 的降级实现但压缩比和 CRC 校验会走 Java 路径本地盘 IO 密集的作业能感觉到差距。实验报告只要求跑通 WordCount可以忽略要做性能对比就把 native 关掉统一走 Java 实现至少三台机器行为一致数据不会掺假。另一件事是镜像。文档里 JDK 包名中的.oe1表示该 ECS 跑的是 openEuler 系发行版包管理是dnf而不是apt。买机器时选错镜像后面yum install java-1.8.0-openjdk会直接告诉你找不到包这跟配置无关纯粹是源不匹配。2.2 买 ECS 时要定死的四个参数三台机器的规划是node-0001兼 NameNode 和 ResourceManagernode-0002、node-0003兼 DataNode 和 NodeManager。这是教学实验最常见的非对称部署省一台机器的钱故障域也确实集中但实验够用。参数取值说明规格2 vCPU / 4 GB 起yarn.nodemanager.resource.memory-mb只能给到 2048再低跑不动 MapReduce系统盘40 GBHDFS 副本 临时目录 安装包低于 30 GB 容易在format后写满区域三台同区域跨区域的内网不通只能走公网延迟和流量费都上去了主机名node-0001/0002/0003买完立刻hostnamectl set-hostname别等配 Hadoop 时再改安全组按最小可用开22 端口只放自己的出口 IP9870 是 NameNode 的 Web UI8088 是 ResourceManager 的9000 是 HDFS RPC 端口9868 是 SecondaryNameNode 的 HTTP 端口。这几个如果不开jps看着进程都在浏览器就是打不开页面新手很容易怀疑人生。提示安全组改完立即生效但已经建立的 SSH 连接不会断所以别在改安全组的同时把自己踢出去——先把新规则加上再删旧规则。2.3 OBS 桶、并行文件系统与 AK/SK 的保存位置对象存储这块要建两样东西一个普通桶一个并行文件系统。并行文件系统支持 POSIX 语义rename、append这类操作不会像普通对象桶那样退化成 copydeleteHadoop 的FileSystem.rename()在它上面行为正常这是选它的核心理由。区域必须和 ECS 一致。桶建好之后进桶的概览页能看到两行访问地址一行 IPv4一行双栈。格式长这样obs.region-id.endpoint-suffix # IPv4 obs.dualstack.region-id.endpoint-suffix # 双栈实验环境用 IPv4 那行就够了双栈是给纯 IPv6 环境准备的。把这一整串原样抄进core-site.xml的 endpoint 参数不要自己拼拼错一个字符报的是UnknownHostException排查起来比语法错误还费劲。然后是凭证。建桶时如果选了「下载访问密钥」浏览器会给你一个credentials.csv里面三列User Name、Access Key Id、Secret Access Key。这个文件只给一次下载机会关掉页面就没了SK 在控制台上再也查不到只能重新建一对密钥。我一般会把它落在本机一个不在任何 git 仓库里的目录下chmod 600别放进项目文件夹。# 拿到 credentials.csv 之后先把权限收紧再抽两个字段出来 chmod 600 ~/credentials.csv awk -F, NR2{print AK$2\nSK$3} ~/credentials.csv这段用awk按逗号切第二行直接把 AK/SK 打印出来。注意csv第一行是表头NR2才是真实数据。打印完记得把终端回滚区清一下或者干脆直接在编辑器里打开手抄——把 SK 贴到 shell 历史里~/.bash_history就成了另一个泄露点。AK 是身份标识SK 是签名密钥。Hadoop 的 OBS 接入用的就是这一对任何能读到core-site.xml的人都能拿它们操作你整个桶。所以后面配置完我会把该文件的权限也收到 640而不是默认的 644。3. 节点基础配置/etc/hosts、SSH 互信与 aarch64 JDK 的版本确定云主机买回来是三个互不相识的独立机器。这一章做的三件事——主机名解析、免密登录、Java 环境——任何一件出问题Hadoop 启动阶段都会以看起来毫不相关的方式报错。3.1 /etc/hosts三行映射写错一个字母后面全白干Hadoop 的节点发现不走 DNS走的是slaves文件加主机名解析。三台机器上的/etc/hosts必须完全一致而且要把自己那行也写进去# 三台机器都执行内容一字不差 cat /etc/hosts EOF 192.168.0.11 node-0001 192.168.0.12 node-0002 192.168.0.13 node-0003 EOF # 验证三台互 ping 主机名都要通 ping -c 1 node-0002192.168.0.x换成你自己 VPC 里的内网地址。别用公网 IP走公网不仅慢而且 ECS 的公网地址在重启、迁移后可能变化配置就废了。主机名不一致的后果很隐蔽。假设你在node-0002上忘了hostnamectl set-hostname机器还叫localhost.localdomain那么 DataNode 启动时会用InetAddress.getLocalHost()拿到这个名字去 NameNode 注册。NameNode 一看slaves里没有这台日志里就是一行DatanodeRegistration(...) registering to NN之后连接被拒jps里 DataNode 进程还在hdfs dfsadmin -report却只能看到两台。这种「进程在但节点不在」的现象九成是主机名和 hosts 对不上。3.2 SSH 互信从 id_rsa.pub 到 authorized_keys 的最小闭环start-dfs.sh的启动逻辑是在node-0001上跑然后 SSH 到slaves文件里列的每一台去拉起守护进程——包括它自己。所以互信不是「主节点能连从节点」而是三台任意两台都要能免密互连共 9 条路径。# 三台各自生成密钥-N 表示空口令实验环境够用 ssh-keygen -t rsa -b 2048 -N -f ~/.ssh/id_rsa # 在每台上把自己和另外两台的公钥都追加进去 for h in node-0001 node-0002 node-0003; do sshpass -p 你的密码 ssh-copy-id -o StrictHostKeyCheckingno $h donesshpass只是为了第一次批量灌公钥方便灌完就可以卸载别留着。如果没有sshpass就老老实实ssh-copy-id node-0001逐个敲密码三遍也就一分钟的事。StrictHostKeyCheckingno这个参数要留意。首次 SSH 到一台新机器会弹yes/no问你是否信任主机指纹在脚本里这个交互会把流程卡死。两种处理方式一是像我上面那样在首次连接时关掉校验二是在~/.ssh/config里写死cat ~/.ssh/config EOF Host node-000* StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR EOF chmod 600 ~/.ssh/config实验环境这么干没问题生产环境不要——关掉主机指纹校验等于放弃中间人攻击防护。这是「血泪经验」换来的方便边界要清楚。验证方式要闭环不能只测一个方向# 每台都跑一遍输出的 hostname 应该是目标节点名 for h in node-0001 node-0002 node-0003; do echo -n $h - ; ssh $h hostname done如果某一条还提示输密码去看目标机的~/.ssh/authorized_keys权限和家目录权限。authorized_keys必须是 600.ssh目录 700家目录不能是 777。权限过松的话sshd 会静默拒绝密钥认证日志里只有一行Authentication refused: bad ownership or modes。3.3 aarch64 版 JDKJAVA_HOME 必须落到带版本号的那一层这一段是整个实验最关键的环节文档里反复出现的「因为 javahome 错误重新分发」全是从这儿来的。装完 JDK 之后先看实际目录名ls -1 /usr/lib/jvm/在 aarch64 openEuler 的组合上你大概率会看到类似这样的名字java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64注意这里没有java-1.8.0或java-1.8.0-openjdk这种短名软链只有全名。很多教程写的export JAVA_HOME/usr/lib/jvm/java-1.8.0在 x86 的 CentOS 上能用在这个镜像上就是空目录$JAVA_HOME/bin/java不存在。Hadoop 脚本检查 java 的方式是执行$JAVA_HOME/bin/java -version失败后它给的报错是Error: JAVA_HOME is not set and could not be found.这句话没告诉你哪里错了只说找不到。所以先手工验证一遍再往下走# 把全名粘进去不要手打 export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64 export PATH$JAVA_HOME/bin:$PATH java -version echo $JAVA_HOMEjava -version要能打出1.8.0_242这类版本号echo要能打出完整路径。两行都对了再去写/etc/profile。写入的位置有两个都得写# 位置一系统级给交互式 shell 用 cat /etc/profile EOF export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64 export PATH$JAVA_HOME/bin:$PATH EOF # 位置二Hadoop 自己的环境脚本给非交互式脚本用 cat $HADOOP_HOME/etc/hadoop/hadoop-env.sh EOF export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64 EOF为什么两处都要因为start-dfs.sh是通过 SSH 在远端执行hadoop-daemon.sh的非交互式 shell 不会读/etc/profile。只在 profile 里写本地java -version好使远端启动的 DataNode 还是找不到 JDK——这个现象就是文档里「改了 JAVA_HOME 之后还得重新分发」的根源。3.4 目录骨架与 jar 包归位Hadoop 的本地目录要在启动前建好缺了它 NameNode 会拒绝格式化# 三台都执行 mkdir -p /home/modules/data/buf \ /home/modules/data/tmp \ /home/modules/data/nn \ /home/modules/data/dn \ /home/nm/localdir对应关系是这样的/home/modules/data/buf给 MapReduce 的中间结果用mapreduce.cluster.local.dir/home/nm/localdir给 YARN NodeManager 存容器数据yarn.nodemanager.local-dirsnn和dn分别是 NameNode 元数据和 DataNode 块目录。这几个路径一旦写进 XML改名就要重新格式化所以取名字的时候想清楚。jar 包这块OBS 对接需要hadoop-obs及其依赖esdk-obs-java、okhttp、okio等。把这些 jar 统一丢进公共库目录cd /root cp hadoop-obs-*.jar esdk-obs-java-*.jar okhttp-*.jar okio-*.jar \ $HADOOP_HOME/share/hadoop/common/lib/ # 确认类名后面配 fs.obs.impl 要用 for j in $HADOOP_HOME/share/hadoop/common/lib/hadoop-obs-*.jar; do jar tf $j | grep -i FileSystem.class done最后这条jar tf | grep很重要。fs.obs.impl的取值必须和 jar 里实际的类名完全对齐写错一个包名运行时抛的是No FileSystem for scheme: obs看起来跟类名毫无关系。先查出来再抄别凭记忆。4. 配置与首次启动四个 XML、slaves 到 HDFS 首次启动前面三章都是铺垫这一章才真正动配置文件。四个 XML 加起来不超过 30 个 property但每个都关乎集群能不能起来。4.1 core-site.xmlAK/SK/endpoint 三个参数的写法与两种取舍先要做一个决策fs.defaultFS指向 HDFS 还是 OBS指向 HDFS 的话HDFS 是主存储OBS 作为外部数据源hadoop fs -ls obs://bucket/访问时必须带完整 scheme。指向 OBS 的话所有默认路径都落到对象存储上本地 HDFS 反而成了摆设。实验文档给的线索是「将 ak、sk、endpoint 更改」说明是前一种——HDFS 为主OBS 并联接入。?xml version1.0? configuration !-- 默认文件系统仍然是本地 HDFS -- property namefs.defaultFS/name valuehdfs://node-0001:9000/value /property !-- NameNode 元数据与临时目录 -- property namehadoop.tmp.dir/name value/home/modules/data/tmp/value /property !-- OBS 接入三件套 -- property namefs.obs.endpoint/name valueobs.cn-north-4.xxxxxxxx/value /property property namefs.obs.access.key/name valueYOUR_ACCESS_KEY_ID/value /property property namefs.obs.secret.key/name valueYOUR_SECRET_ACCESS_KEY/value /property !-- 实现类以 jar 包里查到的为准 -- property namefs.obs.impl/name valueorg.apache.hadoop.fs.obs.OBSFileSystem/value /property /configuration参数逐个说。fs.defaultFS的端口 9000 是fs.defaultFS的 RPC 端口不是 Web UI 的 9870两个别搞混。hadoop.tmp.dir如果落在/tmp下ECS 重启会被清掉NameNode 元数据跟着没了集群直接回到格式化之前——这是新手最容易忽略的问题。AK/SK 直接明文写在 XML 里的做法只在实验环境成立生产环境要走 credential provider后面第 6 章会提一句。fs.obs.endpoint一定要用不带https://前缀的裸域名。有人习惯性加协议头OBS 客户端会把它拼成https://https://...报的错是SSLException跟 endpoint 配置看起来八竿子打不着。还有一点三台机器上的 core-site.xml 必须完全一致。只在 node-0001 上改从节点的 DataNode 会用自己的配置去连 OBSAK 不对就是 403。这也是为什么改完配置要重新分发。4.2 hdfs-site.xml、yarn-site.xml、mapred-site.xml 的最小可用集这三个文件的共同原则是能用默认值的就别写。教学实验不是调优多写一个参数就多一个出错点。hdfs-site.xml?xml version1.0? configuration property namedfs.replication/name value2/value /property property namedfs.namenode.name.dir/name valuefile:///home/modules/data/nn/value /property property namedfs.datanode.data.dir/name valuefile:///home/modules/data/dn/value /property property namedfs.namenode.secondary.http-address/name valuenode-0002:9868/value /property /configuration副本数填 2 而不是 3是三节点集群的常规做法容忍一台机器挂掉同时不至于一份数据写三遍把磁盘吃满。填 3 也能跑只是hdfs dfsadmin -report里Under replicated blocks永远是 0一旦掉一台就全变成副本不足。dfs.namenode.name.dir前面要加file://前缀不加的话 Hadoop 会按默认文件系统解析路径而默认文件系统是hdfs://启动直接报路径非法。yarn-site.xml?xml version1.0? configuration property nameyarn.resourcemanager.hostname/name valuenode-0001/value /property property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.nodemanager.local-dirs/name value/home/nm/localdir/value /property property nameyarn.nodemanager.resource.memory-mb/name value2048/value /property property nameyarn.scheduler.maximum-allocation-mb/name value2048/value /property /configurationyarn.nodemanager.local-dirs就是第 3 章建的那个/home/nm/localdir。这个目录如果不存在NodeManager 启动时不会报错只是容器起不来日志里一行LocalDirsHandlerService的 WARN作业一直卡在 ACCEPTED 状态。两个内存参数要配对。resource-memory-mb是这台机器交给 YARN 的总量maximum-allocation-mb是单个容器能申请的上限。前者小于后者的话MapReduce 申请 2048 会被调度器直接拒掉报InvalidResourceRequestException。mapred-site.xmlHadoop 2.x 里可能只有mapred-site.xml.template需要先cp一份?xml version1.0? configuration property namemapreduce.framework.name/name valueyarn/value /property property namemapreduce.application.classpath/name value$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*/value /property /configuration第二个参数在 Hadoop 2.8 上通常能自动推导但 aarch64 环境下我倾向于显式写上省得作业提交时报Could not find or load main class。4.3 slaves 与 hadoop-env.sh把三台机器组成一个集群slaves文件决定start-dfs.sh会去哪几台机器拉进程node-0001 node-0002 node-0003三行都写包括 NameNode 自己。因为 HDFS 是主从同机的伪对称部署node-0001 同时也是 DataNode。hadoop-env.sh在第 3 章已经追加过JAVA_HOME这里再确认一次是否落到了正确位置grep -n JAVA_HOME $HADOOP_HOME/etc/hadoop/hadoop-env.sh输出里应该能找到你写的那一行完整路径。如果看到的是注释掉的# export JAVA_HOME${JAVA_HOME}说明追加到了文件末尾但也可能被后面的行覆盖——Hadoop 的脚本是顺序执行的后出现的赋值生效。所以追加完之后再grep一遍确认最后一条是你要的那个路径这是个成本很低的自检。4.4 分发、环境变量与首次 namenode -format所有配置改完之后才轮到分发。顺序不能反——先分发再改配置就得重来一遍。#!/bin/bash # deploy_hadoop.sh在 node-0001 上执行 HADOOP_HOME/home/modules/hadoop-2.8.3 for host in node-0002 node-0003; do echo syncing to $host rsync -az --delete \ $HADOOP_HOME/ $host:$HADOOP_HOME/ scp /etc/hosts $host:/etc/hosts done用rsync -az --delete而不是scp -r原因是scp只做增量覆盖不会删掉目标端多出来的文件。如果之前误传过一份core-site.xml.bakscp会让它一直留在那里某次排查时你可能打开的就是这个备份文件。--delete保证两端严格一致。/etc/hosts单独scp一份覆盖从节点的。这一步容易被跳过结果从节点解析不了主机名。分发完成后三台各自刷一遍环境变量# 三台分别执行 source /etc/profile java -version echo $JAVA_HOME然后才是格式化。这条命令只执行一次# 仅 node-0001 hdfs namenode -format输出里找Storage directory /home/modules/data/nn has been successfully formatted.。如果看到Re-format filesystem in Storage Directory ... ? (Y or N)说明目录里已经有旧的元数据那你之前格式化过。这时候不要敲 Y先去检查上一次为什么没起来否则 clusterID 会变之前写进去的 DataNode 数据全部作废。启动顺序是先 HDFS 后 YARNstart-dfs.sh start-yarn.sh # 三台都跑一遍 jps 对照 jpsnode-0001上应该有NameNode、SecondaryNameNode、ResourceManagernode-0002、node-0003上应该有DataNode、NodeManager。jps少了哪个就去$HADOOP_HOME/logs/下找对应守护进程的.log日志尾部的Caused by一般直接给出答案。5. 避坑排查JAVA_HOME 错位引发的五个现场实验文档里那些「因为 javahome 的错误导致这里出错」「重新分发」的批注串起来就是一份完整的排错地图。下面五条按发生顺序排每条都是现象、原因、解决三段式。5.1 format 阶段报 JAVA_HOME 无效现象执行hdfs namenode -format终端只吐出Error: JAVA_HOME is not set and could not be found.hdfs命令本身不往下走。原因$HADOOP_HOME/bin/hdfs是个 shell 脚本它读hadoop-env.sh拿JAVA_HOME然后拼$JAVA_HOME/bin/java。路径指向的目录不存在或者指向了/usr/lib/jvm/java-1.8.0这种在 aarch64 镜像上不存在的短名软链脚本就认为没设。解决ls -1 /usr/lib/jvm/看真实目录名把完整名字带-1.8.0.242.b08-1.h5.oe1.aarch64这种后缀写进hadoop-env.sh。写完执行bash -x $HADOOP_HOME/bin/hdfs version看一眼展开后的命令能直接看到它实际调的 java 路径对不对。5.2 从节点还在用旧 JDK现象node-0001上start-dfs.sh顺利两台从节点的 DataNode 起不来或起来就退日志里UnsupportedClassVersionError或者干脆只有一行JAVA_HOME相关的错误。原因只在主节点改了hadoop-env.sh忘了这一步要跟着分发到另外两台。start-dfs.sh是 SSH 到从节点执行脚本的用的还是从节点本地的配置。解决改任何$HADOOP_HOME/etc/hadoop/下的文件都要走一遍第 4.4 节的rsync。养成习惯改配置 → 分发 →source→ 重启。实验文档里「由于 javahome 错误重新分发」出现了三次就是这个动作漏了。5.3 SSH 还要密码或者 Host key verification failed现象ssh node-0002 hostname提示输密码或者脚本跑到一半卡住手动执行报Host key verification failed。原因两件事。一是公钥没灌到目标机的authorized_keys或者权限不对被 sshd 拒绝二是首次连接的新主机指纹没进known_hosts非交互脚本没法回答 yes/no。解决先测单向。ssh -o BatchModeyes node-0002 hostnameBatchMode会在需要密码时直接失败而不是卡住。报权限问题就检查目标机~/.ssh是 700、authorized_keys是 600、家目录不是 777。指纹问题按 3.2 节写~/.ssh/config或者先手动连一次。5.4 jps 里 DataNode 在但集群报告只有两台现象三台jps都能看到DataNodehdfs dfsadmin -report里Live datanodes只有 2。原因主机名不一致。某台机器的hostname和/etc/hosts里的记录对不上DataNode 用实际的 hostname 去注册NameNode 按 IP 反查或者按slaves匹配两边对不上就拒了。日志里一般是Datanode denied communication with namenode。解决三台执行hostname和/etc/hosts逐行比对hostname -i应该能解析出自己那台的内网 IP。不一致就hostnamectl set-hostname改掉再重启 DataNode。改完别忘了stop-dfs.sh再start-dfs.sh热重启有时清不掉注册信息。5.5 访问 obs:// 报 No FileSystem for scheme现象hadoop fs -ls obs://your-bucket/报No FileSystem for scheme: obs。原因三种可能。fs.obs.impl写的类名跟 jar 里实际的不一致hadoop-obs的 jar 没放进share/hadoop/common/lib/或者放进去了但依赖的esdk-obs-java、okhttp版本不匹配类加载到一半抛NoClassDefFoundError外层被包装成 scheme 找不到。解决先用jar tf hadoop-obs-*.jar | grep -i filesystem确认真实类名逐字符比对配置再用hadoop classpath | tr : \n | grep obs确认 jar 在类路径里最后把okhttp、okio的版本对齐到一个能配起来的组合别混用两个大版本。这三步走完还不行就把HADOOP_ROOT_LOGGER调到 DEBUG 跑一次真正的Caused by在 DEBUG 日志里才露出来。6. 端到端验证从 put 一个小文件到 AK/SK 的权限边界集群起来只是第一步得证明它真的能读写。我一般按「本地 HDFS → OBS → 作业」的顺序验每步一个命令出错能立刻定位在哪一层。# 第一层本地 HDFS 可写可读 hdfs dfs -mkdir -p /tmp/smoke echo hello bigdata /tmp/a.txt hdfs dfs -put /tmp/a.txt /tmp/smoke/ hdfs dfs -cat /tmp/smoke/a.txt # 必须原样打印 hello bigdata # 第二层OBS 桶可见 hadoop fs -ls obs://your-bucket-name/ # 第三层跨文件系统拷贝验证 AK/SK 的写权限 hadoop fs -put /tmp/a.txt obs://your-bucket-name/smoke/ # 集群健康度 hdfs dfsadmin -report | head -20第二层如果返回空列表而不是报错说明认证通了桶里本来就没东西这是成功。第一层如果put之后cat出来内容是空的或者乱码别急着怀疑磁盘去看dfs.replication是不是设成了 2 但实际只有 1 台 DataNode 存活。这里有个我踩过的细节hadoop fs和hdfs dfs是两套命令前者走FileSystem抽象层能访问所有注册过的 scheme后者只认 HDFS。用hdfs dfs -ls obs://...会报Wrong FS不是配置问题是命令用错了。关于 AK/SK最后一个建议是别把它长期明文放在core-site.xml。实验阶段无所谓如果这套东西要跑得久一点至少把文件权限从 644 收到 640并且在做完实验后去控制台重新生成一对密钥让旧的失效。我见过有人把整个hadoop目录打包发出去交作业core-site.xml里的 SK 跟着一起走了——补生成密钥只要两分钟泄漏之后清理桶的代价要大得多。从那以后我每次起集群都会在format之前先跑一遍bash -x $HADOOP_HOME/bin/hdfs version把 java 路径、类路径、配置文件加载顺序全部打出来看一眼确认没问题再动-format。这三十秒的自检救回来的时间不止三十小时。希望帮到你。本文还有配套的精品资源点击获取