-今日
-本周
-本月
-累计
独立访客
项目工作台‹大数据平台实训 个人项目与实践记录

常见问题及解决方案

本章对应课程目录的第 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 都通
2U 盘df -h /mnt/usb 能看到挂载点,且可写
3虚拟机剪贴板双向可用;分辨率能拉到预期档位
4SSHssh localhost 免密直接进入,不再询问密码
5Hadoopjps 里有 NameNode、DataNode、ResourceManager、NodeManager
6HBasejps 里有 HMaster、HRegionServer
7Hive能进入 hive 并成功执行 show databases;
8Sparkbin/spark-shell 能进入 scala> 提示符
9MySQLsystemctl status mysql 为 active,中文写入不乱码
10Pythonpython3 -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 类问题分别对应前面各章可能出现的故障,命令都可以在任意一台搭好环境的机器上复算,因此不附固化在某一次的运行截图。