常见问题及解决方案
本章对应课程目录的第 11 章。它把前面十章里最容易卡住的点集中成一份速查表:每一条都按「现象 — 原因 — 解决 — 预防」写,可以直接当排错清单使用。本章没有对应的实验截图,下面的命令都可以在虚拟机或服务器上直接执行。
11.1 这是什么
第 1 章到第 9 章讲的是「把环境搭起来、把程序跑起来」,本章讲的是「跑不起来的时候怎么办」。
按主题分成 13 类:
| 类 | 覆盖范围 |
|---|---|
| 网络与传输 | 11.3.1 网络问题、11.3.2 U 盘文件系统改为 NTFS |
| 虚拟机 | 11.3.3 虚拟机问题、11.3.4 双向复制、11.3.5 分辨率、11.3.6 权限 |
| 远程连接 | 11.3.7 SSH 问题 |
| 大数据组件 | 11.3.8 Hadoop、11.3.9 HBase、11.3.10 Hive、11.3.11 Spark |
| 语言与数据库 | 11.3.12 MySQL、11.3.13 Python |
排错的顺序是固定的:先看清现象,再定位层级,最后才动手改。层级从下往上依次是网络、系统、进程、配置、数据;大多数「服务起不来」实际上卡在下面两层,直接去改上层配置往往越改越乱。
11.2 前置条件
| 项 | 要求 | 检查方式 |
|---|---|---|
| 环境 | 第 1 章的环境已就绪 | jps 能看到进程 |
| 日志 | 找得到组件的日志目录 | ls /usr/local/hadoop/logs |
| 备份 | 改配置前先留一份原文件 | cp 配置 配置.bak |
| 回滚 | 记得住改之前的值 | 改前先 cat 一遍 |
上面第三条是全章共同的前提。大部分「越修越坏」不是修错了地方,而是把原始配置直接覆盖掉、没有退路。
11.3 操作步骤
11.3.1 网络问题
现象:ping 不通外网;或者 ping 域名失败、但 ping 该域名的 IP 正常。
原因:虚拟机网络模式选错、网关与 DNS 没配、或者集群各节点的主机名没写进 hosts。
解决:先分清是「不通」还是「解析不了」:
# 任意目录
ip addr # 网卡是否拿到了地址
ip route # 默认网关在不在
cat /etc/resolv.conf # DNS 指向哪里
ping -c 3 8.8.8.8 # 先测纯 IP
ping -c 3 www.baidu.com # 再测域名
IP 通、域名不通 → 改 DNS;两者都不通 → 回到 VMware 的「虚拟网络编辑器」核对 NAT 网段与虚拟机网关是否一致。
主机名互相 ping 不通时,在每个节点的 hosts 里补上对应关系:
# 每台节点都要做
sudo vim /etc/hosts
# 追加(IP 换成自己的)
# 192.168.1.101 hadoop01
# 192.168.1.102 hadoop02
预防:装系统时就把主机名定好;集群内每台机器的 hosts 内容保持一致。
11.3.2 U盘文件系统改为 NTFS
现象:U 盘插到 Linux 里只读、写不进去,或者大于 4 GB 的镜像复制失败。
原因:U 盘原来是 FAT32,单文件上限 4 GB,且 Linux 下的写支持有限。
解决:在 Windows 上先备份数据,再格式化为 NTFS:
# Windows 资源管理器 → 右键 U 盘 → 格式化 → 文件系统选 NTFS
Linux 下挂载 NTFS 需要 ntfs-3g:
# 任意目录
sudo apt-get install -y ntfs-3g
lsblk # 找到 U 盘的设备名,如 /dev/sdb1
sudo mkdir -p /mnt/usb
sudo mount -t ntfs-3g /dev/sdb1 /mnt/usb
df -h /mnt/usb # 确认挂载成功
预防:装系统用的 U 盘统一格式化成 NTFS;卸载前用 sudo umount /mnt/usb,不要直接拔。
11.3.3 虚拟机问题
现象:虚拟机开不了机、卡在开机画面、或者提示 .vmx 文件被占用。
原因:上一次没有正常关闭、磁盘空间不足、或者 VMware 的锁文件残留。
解决:
# 在宿主机的虚拟机目录下执行(不是虚拟机里面)
ls -l *.lck # 有锁目录说明上次没退干净
# 确认虚拟机进程已退出后再删锁目录
磁盘写满时先腾空间:
# 在虚拟机里执行
df -h # 看哪个分区满了
du -sh /var/log/* | sort -h | tail -5
快照占空间也很常见,在 VMware 的「快照管理器」里删掉不用的快照。
预防:关机走「虚拟机 → 电源 → 关闭客户机」,不要直接关窗口;定期清日志与快照。
11.3.4 虚拟机双向复制
现象:宿主机复制的内容,粘贴不到虚拟机里;反向也一样。
原因:没装(或没装全)open-vm-tools,剪贴板共享没打开。
解决:
# 在虚拟机里执行
sudo apt-get update
sudo apt-get install -y open-vm-tools open-vm-tools-desktop
sudo reboot
重启后在 VMware 的「虚拟机 → 设置 → 选项 → 客户机隔离」里,把「启用拖放」「启用复制粘贴」都勾上。
预防:装完系统就把这两个包装上,随系统一起备份快照。
11.3.5 虚拟机分辨率设置
现象:Ubuntu 桌面只有 800×600 一两档,窗口很小或者拉不满。
原因:显卡驱动是 VMware 的通用驱动,没有读到显示器支持的档位。
解决:先确认 open-vm-tools-desktop 已装(见 11.3.4)。仍不行时手动加档位:
# 在虚拟机里执行
xrandr # 看当前输出名,通常是 Virtual1
cvt 1920 1080 # 生成 Modeline
xrandr --newmode "1920x1080_60.00" <Modeline 后半段>
xrandr --addmode Virtual1 "1920x1080_60.00"
xrandr --output Virtual1 --mode "1920x1080_60.00"
预防:装完系统先装 open-vm-tools-desktop,再调分辨率。
11.3.6 虚拟机权限问题
现象:普通用户执行 sudo 提示不在 sudoers 里;或者自己的文件突然改不动。
原因:用户没加入 sudo 组,或者文件属主被 root 改了。
解决:
# 在虚拟机里执行
groups # 当前用户在哪些组
sudo usermod -aG sudo $USER
# 退出重新登录后再验证
sudo whoami # 应输出 root
文件属主不对时:
# 任意目录
ls -l 目标文件
sudo chown -R $USER:$USER 目标目录
预防:不要长期用 root 登录图形界面;用 sudo 提权,改完即退。
11.3.7 SSH问题
现象:ssh 提示 Connection refused、Connection timed out、或者一直要密码。
原因:服务没起、防火墙拦了 22 端口、或者免密配置的公钥没生效。
解决:按「端口 — 服务 — 认证」三层查:
# 在目标机上执行
ss -tlnp | grep 22 # 服务在不在监听
systemctl status ssh # 服务状态,未起则 start
sudo ufw status # 防火墙是否放行 22
免密登录失败时,检查权限(这是最常踩的一处):
# 在目标机上执行
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
再确认公钥确实追加进去了、当前用户的家目录正确。
预防:改完先留一个已连通的会话不要断;权限固定用 700 / 600。
11.3.8 hadoop问题
现象:start-dfs.sh 之后 jps 只有两三个进程,或者 NameNode 起不来。
原因:配置文件写错、目录权限不对、或者重复格式化导致 clusterID 不一致。
解决:
# Hadoop 安装目录
cd /usr/local/hadoop
bin/hdfs namenode -format # 只在首次初始化时执行一次
sbin/start-dfs.sh
jps # 应看到 NameNode、DataNode、SecondaryNameNode
少进程时看日志尾部:
# Hadoop 安装目录
cd /usr/local/hadoop
tail -50 logs/hadoop-*-namenode-*.log
重复格式化会让 DataNode 的 clusterID 与 NameNode 对不上,表现为 DataNode 起不来。要么清掉数据目录重新格式化,要么手工把两处 VERSION 文件里的 clusterID 统一。
# Hadoop 安装目录
cd /usr/local/hadoop
rm -rf data/ tmp/ # 确认没有要保留的数据后
bin/hdfs namenode -format
预防:格式化只做一次并记下来;每次改 core-site.xml、hdfs-site.xml 后先 cat 核对。
11.3.9 Hbase问题
现象:jps 里没有 HMaster;或者 HBase shell 卡住、连不上 ZooKeeper。
原因:HBase 与 Hadoop 版本不匹配、hbase-site.xml 的 ZooKeeper 地址不对、或者依赖的 ZooKeeper 没起。
解决:
# HBase 安装目录
cd /usr/local/hbase
bin/start-hbase.sh
jps # 应看到 HMaster、HRegionServer
tail -50 logs/hbase-*-master-*.log
日志里出现 ZooKeeper 连接超时,先确认 ZooKeeper 在跑,再核对配置:
# HBase 安装目录
cd /usr/local/hbase
grep -n "hbase.zookeeper.quorum" conf/hbase-site.xml
预防:HBase 必须与 Hadoop 大版本配套;启动顺序是 HDFS → ZooKeeper → HBase。
11.3.10 Hive问题
现象:hive 命令进不去,或进去后执行 show databases 报租户/metastore 相关错误。
原因:metastore 的元数据库(通常是 MySQL)连不上、缺 JDBC 驱动、或者 schema 没初始化。
解决:
# Hive 安装目录
cd /usr/local/hive
ls lib/mysql-connector-java*.jar # 驱动在不在
tail -50 logs/hive/*.log
驱动缺失时补进去:
# Hive 安装目录
cd /usr/local/hive
cp ~/mysql-connector-java-*-bin.jar lib/
元数据表没建时初始化一次:
# Hive 安装目录
cd /usr/local/hive
bin/schematool -dbType mysql -initSchema
预防:Hive 依赖的 MySQL 要先起;配置里使用的主机名要和 hosts 里写的完全一致。
11.3.11 SPARK问题
现象:spark-shell 起不来,或者提交任务时报内存不足、Python 版本不对。
原因:与 Hadoop 版本不匹配、内存给小了、或者 PYSPARK_PYTHON 指向了 Python 2。
解决:
# Spark 安装目录
cd /usr/local/spark
bin/spark-shell # 交互环境能不能起
bin/spark-submit --version
export PYSPARK_PYTHON=python3
内存不足时把并行度压下来(2 核 2 GB 的机器尤其明显):
# Spark 安装目录
cd /usr/local/spark
bin/spark-shell --master local[1] --driver-memory 1g
预防:Spark 与 Hadoop 的大版本配套;PySpark 一律显式指定 python3。
11.3.12 mysql问题
现象:mysql 服务起不来,或者登录被拒(Access denied),中文存进去变问号。
原因:服务未启动、root 的认证方式与客户端不匹配、字符集不是 utf8mb4。
解决:
# 任意目录
sudo systemctl status mysql # 看服务状态与报错
sudo systemctl start mysql
sudo tail -50 /var/log/mysql/error.log
登录被拒时先确认密码与认证插件;忘记 root 密码需要在 --skip-grant-tables 模式下重置。
字符集问题在建库时就定下来:
-- 在 mysql 客户端里执行
CREATE DATABASE demo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
预防:建库统一用 utf8mb4;改配置前先备份 my.cnf。
11.3.13 Python问题
现象:pip install 卡住或报 SSL/超时;程序报 ModuleNotFoundError;python 与 python3 行为不一致。
原因:默认源在国外、系统里同时有 Python 2 和 3、或者装到了另一个解释器的 site-packages。
解决:换源并确认用的是同一个解释器:
# 任意目录
python3 -V
pip3 -V
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名
python3 -c "import 包名; print(包名.__file__)"
Ubuntu 18.04 上 python 默认指向 Python 2,脚本里一律写 python3;系统包与虚拟环境混用时,优先在 venv 里安装。
预防:一个项目一个 venv;pip3 -V 的路径要和 python3 -V 对应的解释器一致。
11.4 结果验证
| # | 验证项 | 通过标准 |
|---|---|---|
| 1 | 网络 | ping -c 3 8.8.8.8 与 ping -c 3 www.baidu.com 都通 |
| 2 | U 盘 | df -h /mnt/usb 能看到挂载点,且可写 |
| 3 | 虚拟机 | 剪贴板双向可用;分辨率能拉到预期档位 |
| 4 | SSH | ssh localhost 免密直接进入,不再询问密码 |
| 5 | Hadoop | jps 里有 NameNode、DataNode、ResourceManager、NodeManager |
| 6 | HBase | jps 里有 HMaster、HRegionServer |
| 7 | Hive | 能进入 hive 并成功执行 show databases; |
| 8 | Spark | bin/spark-shell 能进入 scala> 提示符 |
| 9 | MySQL | systemctl status mysql 为 active,中文写入不乱码 |
| 10 | Python | python3 -c "import pyspark" 无报错 |
11.5 常见问题
1. 按上面的做了还是没解决,下一步看哪里?
先看日志尾部,不要从头读:
# 任意目录
tail -50 /usr/local/hadoop/logs/hadoop-*-namenode-*.log
日志里最先出现的那条 ERROR 通常就是根因,后面的报错大多是它的连锁反应。
2. 各组件的日志都在哪?
# 任意目录
ls -d /usr/local/hadoop/logs /usr/local/hbase/logs /usr/local/hive/logs /var/log/mysql
Hadoop、HBase 在安装目录的 logs/;Hive 在 logs/hive/;MySQL 在 /var/log/mysql/。
3. 配置改坏了想退回去怎么办?
这就是第 2 章要求「改前先备份」的原因:
# 任意目录
ls -l /usr/local/hadoop/etc/hadoop/*.bak
cp /usr/local/hadoop/etc/hadoop/core-site.xml.bak /usr/local/hadoop/etc/hadoop/core-site.xml
4. 提示端口被占用怎么查?
# 任意目录
ss -tlnp | grep 9092
ps -ef | grep -i kafka | grep -v grep
确认是本组件的残留进程再 kill,不要随手杀别的服务。
5. 为什么这一章没有截图?
它是一份速查表而不是一次实验:13 类问题分别对应前面各章可能出现的故障,命令都可以在任意一台搭好环境的机器上复算,因此不附固化在某一次的运行截图。