news 2026/11/4 7:24:58

Hadoop 3.1.3伪分布式实验环境搭建与Live Nodes为0排错

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hadoop 3.1.3伪分布式实验环境搭建与Live Nodes为0排错

简介:这份大数据实验指导文档面向刚接触大数据环境搭建的初学者,围绕常用 Linux 操作与 Hadoop 基础操作展开,可用于课程实验、自学入门及课前环境准备。压缩包内仅有 1 个 docx 文件,约 289KB,按照实验目的、平台、内容和要求编排,便于直接查阅与逐项练习。正文覆盖虚拟机与镜像安装准备,并练习目录切换、创建删除、复制移动、查看内容、压缩打包、查找字符串、修改权限、环境变量配置等常用命令;同时包含 Hadoop 伪分布式安装、分布式文件系统目录创建与文件查看,以及自带单词计数实例的运行检测思路,能帮助读者把环境搭建、命令操作和基础验证串联起来。已有 981 人学习,适合需要一份结构清晰、可按步骤完成实验并复盘知识点的入门读者。

1. 9870 页面 Live Nodes 显示 0:这份实验一资源先帮你把地基打平

浏览器里敲下localhost:9870,页面转出来了,Live Nodes 那一栏却写着 0——这是很多人做 hadoop 大数据 linux 实验撞上的第一堵墙。这份实验一资源要拆的正是这段地基:在 Windows 上用 VirtualBox 装一台 Ubuntu 18.04,把 cd、ls、mkdir 一路敲到 tar、grep,再把 Hadoop 3.1.3 以伪分布式跑起来,最后在 HDFS 里建目录、传文件、跑通自带的 WordCount。

它适合刚开大数据课、手上只有一台笔记本、又不想把硬盘格成双系统的同学;也适合工作里临时要搭一个验证环境、不愿意动生产集群的工程师。整套东西不吃硬件,宿主 8G 内存就能跑得很稳,唯一要花的是把每一步的参数对上。

2. 虚拟机与基线环境:VirtualBox 参数、网络模式和 3 个必做快照

2.1 为什么优先虚拟机而不是双系统或子系统

先把选型说清楚,不然后面所有排错都是白费。双系统的问题是切换成本:实验做到一半要回 Windows 查资料,就得重启一次,两次下来心态就崩了,而且分区操作本身有把数据搞丢的风险。Windows 自带的 Linux 子系统看着轻便,但它的进程模型、网络栈、/etc/hosts解析行为跟教材里那台「真正的 Linux」并不一致,SSH 免密、9870 端口监听这些环节出问题时,你搜到的答案和你看到的报错对不上号,这才是最耗时间的。

虚拟机的核心价值只有一个词:快照。Hadoop 伪分布式最怕的就是反复格式化把 clusterID 搞乱,而有快照意味着你在装完系统、配完 SSH、格式化之前各打一个点,任何时候翻车都能 30 秒回到干净状态。这个「后悔药」在后面的实验里会救你很多次。

另一个实际考虑是截图。课程实验报告要求贴运行命令和结果截图,虚拟机窗口和教材里的界面完全对得上,省掉解释成本。

2.2 内存、CPU、磁盘三组参数怎么填

VirtualBox 新建虚拟机时那几个滑块不是随便拖的,伪分布式虽然不是真集群,但 NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager 五个 JVM 同时常驻,内存给小了 NodeManager 会莫名其妙掉。

配置项建议值说明
内存4096 MB(宿主 8G 时给 3072)低于 2048 基本跑不动 YARN
CPU2 核单核会在格式化时明显卡顿
虚拟硬盘30 GB,VDI 动态分配实际占用随使用增长,不会一次吃满
显存128 MB桌面版 Ubuntu 的最低舒适值
网络NAT + 端口转发,或桥接NAT 更省事,桥接更方便宿主机直连

网络这块值得多说一句。选 NAT 时虚拟机可以上网,但宿主机的浏览器访问不到虚拟机的 9870,必须配端口转发;选桥接则虚拟机会拿到局域网 IP,宿主直接访问http://<虚拟机IP>:9870就行,代价是换网络环境(比如从家里到公司)IP 会变。我一般先用 NAT 加转发,环境稳定后再考虑切桥接。

端口转发可以直接用命令行配,比在图形界面里点来点去快得多:

# 虚拟机名假设为 hadoop-vm,先关机再执行 VBoxManage modifyvm "hadoop-vm" --natpf1 "ssh,tcp,,2222,,22" VBoxManage modifyvm "hadoop-vm" --natpf1 "namenode,tcp,,9870,,9870" VBoxManage modifyvm "hadoop-vm" --natpf1 "yarn,tcp,,8088,,8088"

--natpf1表示第一条 NAT 端口转发规则,四个参数依次是规则名、协议、宿主机 IP(留空表示所有网卡)、宿主机端口、虚拟机 IP(留空表示本机)、虚拟机端口。配好之后宿主用ssh -p 2222 hadoop@127.0.0.1就能连进去,浏览器访问127.0.0.1:9870也能看到 NameNode 页面,不用每次去查虚拟机 IP。

2.3 装完系统先做三件事:建 hadoop 用户、配 sudo、打快照

系统装完不要急着装 Java。先按实验要求建一个名为hadoop的专用账号,后面所有安装、配置、运行都用它,避免出现「用 root 装完、用 hadoop 跑不起来」的经典翻车。

# 新建实验账号并授予 sudo sudo adduser hadoop sudo usermod -aG sudo hadoop # 切换到该账号,确认提权可用 su - hadoop sudo whoami # 应输出 root # 更新源并装基础工具 sudo apt update sudo apt install -y vim openssh-server net-tools curl

adduser是交互式的,会提示设置密码和用户信息,比useradd省事,还会自动创建家目录和默认 shell。usermod -aG sudo里的-a是追加而不是覆盖,漏了这个参数会把用户从原有附加组里踢出去,虽然这里影响不大,但养成习惯。openssh-server必须显式装,否则后面 SSH 免密那一步会一直卡在Connection refused。

装完这三步立刻关机打一个快照,命名成base-clean。这是第一个后悔药,后面不管怎么折腾,回到这里只需要几十秒。

3. 十八条 Linux 命令逐条落地:从 cd 到 tar 的完整敲击顺序

3.1 目录与文件:cd、ls、mkdir、rmdir、cp、mv、rm

这一组命令是整个实验里最容易「看着会、敲起来错」的部分,主要坑在权限。/usr目录普通用户没有写权限,教材上那些cp ~/.bashrc /usr/bashrc1的命令直接敲会报Permission denied,得加sudo。

# cd:三种切换方式 cd /usr/local # 绝对路径 cd .. # 返回上一级 cd ~ # 回到当前用户主目录,等价于直接敲 cd # ls:查看 /usr 下全部内容(含隐藏文件) ls -a /usr ls -l /usr # 长格式,能看到权限和属主 # mkdir:普通建目录与递归建目录 sudo mkdir /tmp/a ls /tmp mkdir -p /tmp/a1/a2/a3/a4 # -p 一次性建出多级,父目录已存在也不报错 # rmdir:只能删空目录 rmdir /tmp/a rmdir -p /tmp/a1/a2/a3/a4 # -p 从最深层开始逐级往上删 # cp:复制文件与目录 sudo cp ~/.bashrc /usr/bashrc1 # 复制并重命名 mkdir /tmp/test sudo cp -r /tmp/test /usr/ # -r 递归复制目录,漏了会报 omitting directory # mv:移动与重命名是同一个命令 sudo mv /usr/bashrc1 /usr/test/ sudo mv /usr/test /usr/test2 # rm:删文件与删目录 sudo rm /usr/test2/bashrc1 sudo rm -r /usr/test2 # 删目录必须带 -r

mkdir -p和rmdir -p是一对,很多人只知道前者。rmdir的边界在于它只删空目录,目录里但凡有一个文件就会报Directory not empty,这其实是保护机制;真要连内容一起删只能用rm -r,而rm -rf在没有快照的机器上属于高危操作,实验环境里也建议少用。

3.2 看内容:cat、tac、more、head、tail

这五条命令针对同一个文件~/.bashrc,差别只在于「怎么切」。.bashrc通常两三百行,刚好适合拿来练手。

cat ~/.bashrc # 一次性全部输出 tac ~/.bashrc # 按行倒序,最后一行变第一行 more ~/.bashrc # 分页,空格翻页,q 退出 head -n 20 ~/.bashrc # 前 20 行 head -n -50 ~/.bashrc # 除了最后 50 行,其余全显示 tail -n 20 ~/.bashrc # 最后 20 行 tail -n +51 ~/.bashrc # 从第 51 行开始一直到最后

head -n -50和tail -n +51这两个写法是新手最容易卡住的地方:负号在head里表示「排除末尾 N 行」,加号在tail里表示「从第 N 行起」。两者配合正好能把一个文件切成三段来看,查配置改了哪一行时比cat高效得多。

more只能往下翻,想往回翻得用less,后者还支持/关键词搜索。实验要求写的是more,但实际排查配置文件时我基本都用less。

3.3 时间、属主、查找、打包、检索:touch、chown、find、tar、grep

# touch:建空文件,也能改时间戳 touch /tmp/hello ls -l /tmp/hello touch -d "5 days ago" /tmp/hello # 把修改时间往前调 5 天 stat /tmp/hello # 看三个时间(访问/修改/变更)的精确值 # chown:改属主 sudo chown root /tmp/hello ls -l /tmp/hello # 第三列变成 root # find:按名字找 find ~ -name ".bashrc" find / -name ".bashrc" 2>/dev/null # 全盘找,屏蔽权限报错 # tar:打包与解包 sudo mkdir /test sudo tar -czvf /test.tar.gz /test # -c 创建 -z gzip -v 显示过程 -f 指定文件名 sudo tar -xzvf /test.tar.gz -C /tmp # -x 解包 -C 指定目标目录 # grep:在文件里找字符串 grep 'examples' ~/.bashrc grep -n 'examples' ~/.bashrc # -n 带行号

tar的参数顺序有讲究:-f后面必须紧跟文件名,写成tar -czf test.tar.gz /test才对,如果写成tar -czf /test test.tar.gz就会把整个根目录打进去。这个错我在早期犯过不止一次,打出来的包体积异常大就是信号。

另外教材要求在根目录/下新建test文件夹,普通用户没有这个权限,必须sudo。如果不想动不动提权,把路径换成/tmp或者家目录下的某个位置,效果完全一样。

3.4 环境变量:在 ~/.bashrc 里写 JAVA_HOME 并验证

Hadoop 启动脚本靠JAVA_HOME找 JDK,这个变量没配对,start-dfs.sh会直接甩一句JAVA_HOME is not set然后退出。

# 先确认 JDK 实际安装路径 readlink -f $(which java) # 典型输出:/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java # 那么 JAVA_HOME 就是 /usr/lib/jvm/java-8-openjdk-amd64 # 编辑 ~/.bashrc,在末尾追加两行 vim ~/.bashrc export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH # 让配置立即生效并验证 source ~/.bashrc echo $JAVA_HOME java -version

readlink -f会一路解析软链接到真实路径,比which java可靠,因为/usr/bin/java往往只是个指向 alternatives 的符号链接。PATH里把$JAVA_HOME/bin放在最前面,是为了让系统优先用你指定的这个 JDK,而不是系统里可能存在的另一个版本。

source ~/.bashrc只对当前终端生效,新开的终端会自动读一次。所以如果你在 A 终端里source了、在 B 终端里echo $JAVA_HOME是空的,这不是配置没写进去,只是 B 终端还没重新加载。

4. Hadoop 3.1.3 伪分布式:四个 XML 文件填完到 WordCount 出结果

4.1 前置三件事:JDK、hostname、SSH 免密

Hadoop 3.1.3 对 JDK 版本比较挑,Java 8 是最稳的选择,Java 11 在部分模块上会报反射相关的警告甚至异常。Ubuntu 18.04 上装 openjdk-8 即可。

sudo apt install -y openjdk-8-jdk java -version # 确认输出 1.8.x # 设置主机名,并确保能解析到自己 sudo hostnamectl set-hostname hadoop-node hostname ping -c 2 $(hostname) # 必须能通,不通就检查 /etc/hosts # 生成密钥并授权给自己 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh # 验证免密登录 ssh localhost

ssh-keygen的-P ''表示空密码,不加的话每次启动 Hadoop 都要输三次密码,start-dfs.sh会卡在那里等输入,看起来像「启动了但没反应」。chmod 600和chmod 700这两步不能省,SSH 对权限过于宽松的密钥文件会直接拒绝使用,报错信息还挺隐晦。

ping $(hostname)这一步经常被跳过然后后面出问题:如果/etc/hosts里没有把主机名映射到127.0.0.1,start-dfs.sh会去解析一个不存在的外部域名,超时几十秒后失败。

4.2 core-site 与 hdfs-site:端口、副本数、数据目录

Hadoop 的配置文件都在$HADOOP_HOME/etc/hadoop/下。假设安装目录是/usr/local/hadoop,下面四个文件必须改。

cd /usr/local/hadoop/etc/hadoop cat > core-site.xml << 'EOF' <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> </property> </configuration> EOF

fs.defaultFS是整个文件系统的入口地址,伪分布式下写localhost:9000或hdfs://localhost:9000都行,端口 9000 是约定俗成的,改成别的也可以但要和后面客户端命令一致。hadoop.tmp.dir是基础临时目录,NameNode 和 DataNode 的元数据默认都放在它下面,显式指定它的好处是后面清理环境时只需删一个目录,而不是满系统去找。

cat > hdfs-site.xml << 'EOF' <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///usr/local/hadoop/tmp/dfs/data</value> </property> </configuration> EOF

dfs.replication在伪分布式下必须是 1,因为只有一台 DataNode,写 3 的话上传文件会一直卡在等待副本的阶段,日志里反复刷could only be replicated to 0 nodes。后两个属性把 NameNode 和 DataNode 的数据目录分开指定,路径里的file://前缀是 URI 格式,不能带中文和空格。

提示:这两个属性一旦定下来就不要再改。改了路径等于让 DataNode 去一个空目录里找自己的 VERSION 文件,结果就是 Live Nodes 变成 0。

4.3 mapred-site 与 yarn-site:让任务真的跑在 YARN 上

cat > mapred-site.xml << 'EOF' <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> EOF cat > yarn-site.xml << 'EOF' <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>localhost</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> EOF

mapreduce.framework.name设成yarn是伪分布式和本地模式的分水岭。设成local时 WordCount 也能跑出结果,但那是单进程跑的,不经过 HDFS 和 YARN,等于没验证到分布式链路,实验报告里想写「成功启动集群」就站不住脚。yarn.nodemanager.aux-services里的mapreduce_shuffle是 MapReduce 在 YARN 上跑必需的辅助服务,漏了这一项的表现是任务一直处于 Accepted 状态不往前走。

最后别忘了把JAVA_HOME写进hadoop-env.sh,这是启动脚本真正读的地方,光在~/.bashrc里配好不够:

echo 'export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64' >> /usr/local/hadoop/etc/hadoop/hadoop-env.sh

4.4 格式化、启动与 jps 期望输出

格式化只做一次,这一条要刻进肌肉记忆里。

# 格式化 NameNode,只执行一次 hdfs namenode -format # 启动 HDFS 与 YARN start-dfs.sh start-yarn.sh # 检查进程 jps

hdfs namenode -format会在dfs.namenode.name.dir指定的目录下生成current/VERSION,里面有一个随机生成的 clusterID。每执行一次格式化的动作,这个 ID 都会重新生成一遍。而 DataNode 启动时会去读自己current/VERSION里的 clusterID,如果两者对不上,NameNode 根本不会接受它登记,表现出来的就是jps里没有 DataNode 进程。

格式化正常的输出末尾会有Storage directory ... has been successfully formatted。启动正常的话,jps应该看到五到六个进程:

进程名作用缺失时的典型现象
NameNodeHDFS 元数据管理9870 页面打不开
DataNode实际存数据块Live Nodes 显示 0
SecondaryNameNode合并镜像与日志影响不大,但属于配置不完整
ResourceManagerYARN 资源调度8088 页面打不开
NodeManager单节点容器管理任务一直停在 Accepted

jps输出的行数还跟有没有Jps自己有关,数进程数量的时候别把它算进去。

4.5 WordCount 与 HDFS 目录上传下载

验证链路是否真跑通,用自带的示例 jar 最直接。

# 在 HDFS 上准备输入目录 hdfs dfs -mkdir -p /user/hadoop/input # 造两个本地测试文件并上传 echo "hello hadoop hello hdfs" > ~/f1.txt echo "hello mapreduce" > ~/f2.txt hdfs dfs -put ~/f1.txt ~/f2.txt /user/hadoop/input/ hdfs dfs -ls /user/hadoop/input # 跑 WordCount hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar \ wordcount /user/hadoop/input /user/hadoop/output # 看结果,输出目录必须事先不存在 hdfs dfs -cat /user/hadoop/output/part-r-00000

hadoop jar后面跟的是 jar 包完整路径和主类名,wordcount就是主类。最后两个参数是输入目录和输出目录,输出目录必须不存在,否则 MapReduce 会直接报Output directory already exists退出——这是新手最常撞的一个假故障,删掉重跑就行。

实验内容第四部分要求的 HDFS 操作基本都在这几条里了:

# 为 hadoop 用户在 HDFS 建用户目录 hdfs dfs -mkdir -p /user/hadoop # 建 test 目录并查看 hdfs dfs -mkdir /user/hadoop/test hdfs dfs -ls /user/hadoop # 把本地 .bashrc 上传到 test hdfs dfs -put ~/.bashrc /user/hadoop/test hdfs dfs -ls /user/hadoop/test # 把 HDFS 上的 test 整个拉到本地 hadoop 安装目录 hdfs dfs -get /user/hadoop/test /usr/local/hadoop ls /usr/local/hadoop

-put与-get是一对方向相反的命令,前者本地上传、后者下载回本地。-get的目标路径如果已存在同名目录,文件会被塞进那个目录里面而不是覆盖它,这一点跟cp -r的行为一致,查文件找不着时先看看是不是套了一层。

5. 避坑与排查:DataNode 起不来、9870 打不开这类问题怎么定位

5.1 先看进程再看日志:jps 与 logs 目录的读法

出问题时的固定动作是三步:jps看少了谁、去对应日志找 ERROR、再决定改配置还是清数据。Hadoop 的日志在$HADOOP_HOME/logs/下,命名规则是<角色>-<用户名>-<主机名>.log,比如hadoop-hadoop-datanode-hadoop-node.log。

cd /usr/local/hadoop/logs ls -lt | head # 按时间排序,最近改的那个就是刚出问题的 tail -n 100 hadoop-hadoop-datanode-*.log grep -i "error\|exception" hadoop-hadoop-datanode-*.log | tail -n 20

日志里最该盯的关键词是Incompatible clusterIDs、Connection refused、BindException、No space left on device,这四个基本覆盖了伪分布式 90% 的启动失败。前两个是配置和数据目录问题,第三个是端口被占,第四个是磁盘满了——/tmp分区小的话很容易在跑几次任务后就满。

5.2 五条踩坑记录:现象、原因、解决

现象一:9870 页面能打开,但 Live Nodes 一直是 0,jps里看不到 DataNode。原因:之前为了「保险起见」多次执行了hdfs namenode -format,NameNode 的 clusterID 每次格式化都会重新生成,而 DataNode 目录里存的还是旧的,两边对不上,DataNode 启动时校验失败直接退出。日志里能看到Incompatible clusterIDs字样。 解决:停掉集群,删掉dfs.datanode.data.dir指向的整个目录,也就是hadoop.tmp.dir下的dfs/data,然后重新格式化并启动。原文里删/usr/local/hadoop/data再hadoop namenode -format的思路就是这个,只是路径要按自己hdfs-site.xml里配的来。如果 DataNode 里有想保留的数据,另一种做法是手动把 NameNode 的 clusterID 抄到 DataNode 的VERSION文件里,但对实验环境来说不如直接重来干净。

现象二:虚拟机里curl localhost:9870通,宿主机浏览器打不开。原因:NAT 模式下虚拟机的服务只对虚拟机内部可见,宿主机和它不在同一个网络平面上。 解决:要么按 2.2 里那样配--natpf1端口转发,要么把虚拟机网络改成桥接。还有一种更隐蔽的情况是fs.defaultFS写的是localhost,NameNode 的 Web 端口只绑在回环地址上,这时就算桥接了外部也访问不到,需要额外配dfs.namenode.http-address为0.0.0.0:9870。

现象三:start-dfs.sh报JAVA_HOME is not set and could not be found。原因:~/.bashrc里配的JAVA_HOME只对交互式 shell 生效,而 Hadoop 的启动脚本是以非交互方式执行的,读不到那段配置。 解决:把export JAVA_HOME=...写进$HADOOP_HOME/etc/hadoop/hadoop-env.sh。同时确认JAVA_HOME指向的是 JDK 根目录而不是bin目录,指向.../jre/bin/java也是错的。

现象四:start-all.sh起了一半就退出,日志说某目录Permission denied。原因:Hadoop 是用 root 解压安装到/usr/local/hadoop的,目录属主是 root,而运行用的是hadoop用户,写不了logs/和tmp/。 解决:sudo chown -R hadoop:hadoop /usr/local/hadoop。这一步在安装完立刻做,能省掉后面一连串莫名其妙的报错。装软件用 root、跑服务用普通账号,这个分工要一开始就定下来。

现象五:跑 WordCount 时任务一直停在 Accepted,NodeManager 起来了但 CPU 不动。原因:内存不够。虚拟机给了 2G,NameNode、DataNode、ResourceManager、NodeManager 一分,NodeManager 分给容器的可用内存不足,YARN 找不到能满足请求的节点。 解决:先把虚拟机内存提到 4G;还不行就在yarn-site.xml里调小yarn.nodemanager.resource.memory-mb(比如 2048)和yarn.scheduler.maximum-allocation-mb(比如 1024)。这两个值在真集群里是需要精心规划的,实验环境里调小只是为了让它先跑起来。

6. 让环境可重建:clusterID 校验与一次干净的重置

伪分布式最烦的不是装,是装完之后状态开始漂移。我在踩过几次 DataNode 消失之后,养成了一个习惯:任何启动之前先比一次 clusterID。

# 两个路径要按 hdfs-site.xml 里实际配的改 grep clusterID /usr/local/hadoop/tmp/dfs/name/current/VERSION grep clusterID /usr/local/hadoop/tmp/dfs/data/current/VERSION

两行输出的值一致,说明元数据是配套的;不一致就别浪费时间重启了,直接走重置流程。这个检查比jps更早发现问题,因为 clusterID 不一致时 DataNode 可能还会短暂出现在进程列表里,给人一个「好像起来了」的错觉。

重置的完整动作只有四步,顺序不能乱:

stop-all.sh # 先停,避免进程占着文件句柄 rm -rf /usr/local/hadoop/tmp # 清掉所有元数据和数据 hdfs namenode -format # 重新生成一套新的 clusterID start-all.sh && jps # 启动并确认 DataNode 在列表里

stop-all.sh要在删目录之前执行,否则残留的进程还持有文件句柄,删完再启动容易撞上端口被占。rm -rf这一步之所以安全,是因为hadoop.tmp.dir指向的目录里只有 Hadoop 自己生成的东西,不掺任何业务数据——这也是当初把它单独指定出来的原因。

顺带说一个判断职业度的细节:如果你在hdfs-site.xml里没有显式配dfs.namenode.name.dir和dfs.datanode.data.dir,元数据默认会散落在系统临时目录下,Ubuntu 重启时有一定概率被清掉,然后你就得面对一个「昨天还好今天 Live Nodes 是 0」的玄学现场。显式配死的价值就在这里。

从那以后我每次动 Hadoop 配置之前都会先打一个虚拟机的快照,改完跑通再删掉旧的,宁可多占几 GB 磁盘也不愿意再花两个小时从日志里捞原因。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/4 7:22:57

VS2010精简版安装配置全攻略:环境变量、项目调试与避坑指南

简介&#xff1a;VS2010绿色精简版面向只需基础开发功能的初学者、临时项目开发者以及系统资源有限的电脑用户&#xff0c;解决完整版安装繁琐、体积庞大、需手动配置环境变量的问题。压缩包为rar格式&#xff0c;约37.53MB&#xff0c;上游未提供具体文件数量与类型明细&#…

作者头像 李华
网站建设 2026/11/4 7:22:28

ASP+SQL Server旅游管理系统实战部署与二次开发指南

简介&#xff1a;本资源是一套完整的ASPSQL旅游管理系统毕业设计实战材料&#xff0c;面向计算机专业本科生、Web开发初学者及课程设计实践者&#xff0c;解决旅游业务信息化管理中的用户交互、线路展示、在线预订与后台运维等核心需求。压缩包共148个文件&#xff0c;含41个AS…

作者头像 李华
网站建设 2026/11/4 7:21:03

靠谱的游戏语音平台怎么选 多维度对比及优质产品推荐

本文速览本文面向有合作游戏、开黑需求的游戏玩家&#xff0c;梳理了游戏语音平台选型的5大核心评估维度&#xff0c;明确各维度的判断标准&#xff0c;避免用户选型时踩坑。本文核心结论为&#xff1a;当前国内游戏语音垂直赛道中&#xff0c;OOPZ的综合表现处于行业前列&…

作者头像 李华
网站建设 2026/11/4 7:19:52

可联调 · 可回放 · 可回滚迁移实战工具包:让 Gauss 版真正“能跑、能验、能回退“前四章解决了“语法能编译“,这一章解决“业务能对账“。提供两套可落地的工程件:对外 API 适配包(HTT

可联调 可回放 可回滚迁移实战工具包&#xff1a;让 Gauss 版真正"能跑、能验、能回退"前四章解决了"语法能编译"&#xff0c;这一章解决"业务能对账"。提供两套可落地的工程件&#xff1a;对外 API 适配包&#xff08;HTTP 重试 死信队列&a…

作者头像 李华
网站建设 2026/11/4 7:19:49

5. MLIR相关语法

系列文章目录 章节1&#xff1a;什么是MLIR 章节2&#xff1a;MLIR的引入 章节3&#xff1a;MLIR完成一个端到端的流程 章节4&#xff1a;编写一个pass 章节5&#xff1a;MLIR相关语法 目录 系列文章目录 一、TableGen中的Trait 核心区别对比 1. 使用方式&#xff1a;混入 vs 实…

作者头像 李华
网站建设 2026/11/4 7:18:56

2.倒排索引、KNN、ANN、PQ乘积量化

1.倒排索引倒排索引&#xff08;Inverted Index&#xff09;就是一张 词→文档编号 的查找表。假设你手里三张纸&#xff1a;1&#xff1a;我 爱 北京2&#xff1a;北京 好 大3&#xff1a;我 爱 吃 烤鸭 问题&#xff1a;哪张纸上写了“北京”&#xff1f;正排索引&…

作者头像 李华