在统信UOS上安装和配置Hadoop,整个过程虽然不算特别复杂,但实际执行中容易遇到几个关键难点。最核心的问题集中在四个环节:Java环境缺失、用户权限隔离、SSH无密码登录、以及Hadoop配置路径的适配。如果其中任何一个环节没有处理好,执行`hdfs namenode -format`时可能会提示“JAVA_HOME not set”,或者运行`start-dfs.sh`时因为SSH无法连接localhost而静默失败,连错误提示都没有,非常令人头疼。

下面直接提供完整的操作流程,每一步都经过实际测试,按照步骤操作基本不会出现问题。
创建专用Hadoop用户并授权
统信UOS默认没有hadoop用户,如果直接使用root用户运行Hadoop,容易出现权限越界、日志混乱等问题。因此第一步需要创建一个独立的隔离账户。
执行以下命令:
```
sudo useradd -m -s /bin/bash hadoop
```
然后设置密码:
```
sudo passwd hadoop
```
建议先使用`hadoop123`这样的简单密码进行临时验证,后续再修改为更安全的密码。接着给hadoop用户添加sudo权限:
```
sudo usermod -aG sudo hadoop
```
**关键前提:** 必须退出当前终端,重新使用hadoop用户登录。后续所有操作都需要在hadoop用户下进行,否则PATH和HOME路径会混乱,导致各种报错。
安装OpenJDK并配置JAVA_HOME
统信UOS桌面版的应用商店中安装的JDK,其路径比较特殊,Hadoop的脚本无法自动识别。必须手动提取真实路径,然后写入用户级环境变量。
方法一:图形化安装后手动配置
打开“开始菜单 → 应用商店”,搜索“OpenJDK 17”,点击安装。安装完成后,打开终端,执行:
```
dpkg -L openjdk-17-jdk | grep bin/java
```
输出类似`/opt/apps/org.bisheng.openjdk17/files/bin/java`,去掉末尾的`/bin/java`,得到JAVA_HOME路径:`/opt/apps/org.bisheng.openjdk17/files`。
然后编辑`~/.bashrc`:
```
nano ~/.bashrc
```
在文件末尾添加:
```
export JAVA_HOME=/opt/apps/org.bisheng.openjdk17/files
export PATH=$JAVA_HOME/bin:$PATH
```
保存后执行`source ~/.bashrc`,再运行`java -version`,确认输出中包含“17.0.x”字样。
方法二:APT命令行安装(路径更标准)
如果更喜欢命令行方式,直接执行:
```
sudo apt update && sudo apt install openjdk-17-jdk
```
然后获取标准路径:
```
readlink -f $(which java) | sed 's|/bin/java||'
```
输出类似`/usr/lib/jvm/java-17-openjdk-amd64`,将该路径填入`~/.bashrc`的JAVA_HOME中,同样执行`source`生效。
两种方法任选一种即可,推荐第二种,路径更干净,后续升级也方便。
配置SSH无密码登录
Hadoop伪分布式模式要求NameNode能够免密码SSH登录本机localhost。统信UOS默认没有开启sshd服务,也没有生成密钥对,需要手动进行配置。
第一步:安装并启动SSH服务
```
sudo apt install openssh-server -y
sudo systemctl enable ssh
sudo systemctl start ssh
```
第二步:切换到hadoop用户,生成密钥对
```
su - hadoop
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
```
第三步:将公钥写入authorized_keys
```
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
```
第四步:测试本地免密码登录
```
ssh localhost -o StrictHostKeyChecking=no
```
首次执行时会自动接受host key,然后直接返回shell,说明配置成功。如果提示输入密码,则需要检查前面的步骤,确认`authorized_keys`的权限和内容是否正确。
下载解压Hadoop并配置核心文件
从Apache官网下载Hadoop 3.3.6,这个版本对统信UOS的内核和glibc版本兼容性最好。不建议使用2.x老版本,因为它们不支持UOS默认的GLIBC_2.34,运行时会频繁出现段错误。
下载后解压到用户目录下:
```
tar -xzf hadoop-3.3.6.tar.gz -C ~/opt/
ln -s ~/opt/hadoop-3.3.6 ~/hadoop
```
然后进入配置目录:
```
cd ~/hadoop/etc/hadoop
```
修改`hadoop-env.sh`:找到`# export JAVA_HOME=`这一行,取消注释,填入实际的JAVA_HOME路径,例如:
```
export JAVA_HOME=/opt/apps/org.bisheng.openjdk17/files
```
配置`core-site.xml`:使用nano编辑,替换全部内容为:
```xml
fs.defaultFS
hdfs://localhost:9000
```
配置`hdfs-site.xml`:同样编辑,填入:
```xml
dfs.replication
1
```
这里将副本数设置为1,因为伪分布式只有一台机器,设置更多副本没有实际意义。
格式化HDFS并启动伪分布式集群
第一次启动前必须格式化NameNode,否则DataNode无法注册。很多人会忽略这一步,然后执行`start-dfs.sh`后没有任何输出,误以为成功,实际上进程根本没有启动。
执行:
```
~/hadoop/bin/hdfs namenode -format
```
看到“Storage directory /home/hadoop/hadoop_data/hdfs/name has been successfully formatted.”则表示格式化成功。
然后启动HDFS服务:
```
~/hadoop/sbin/start-dfs.sh
```
使用`jps`命令检查进程,应该能看到NameNode、DataNode、SecondaryNameNode三个Java进程。如果缺少某个进程,需要返回检查SSH免密码配置和权限设置。
最后验证HDFS是否可用:
```
~/hadoop/bin/hdfs dfs -mkdir /user
~/hadoop/bin/hdfs dfs -mkdir /user/hadoop
~/hadoop/bin/hdfs dfs -put ~/hadoop/etc/hadoop/core-site.xml /user/hadoop/
~/hadoop/bin/hdfs dfs -ls /user/hadoop
```
如果能看到`core-site.xml`文件,说明HDFS读写正常,整个集群搭建完成。