在Ubuntu 18.04上部署Hadoop集群前,需要做好基础环境配置。我遇到过不少因为系统环境没配好导致的坑,这里把关键步骤梳理出来。
首先确保三台虚拟机(master、slave1、slave2)的网络配置正确。推荐使用NAT模式,这样既能联网又方便集群内部通信。我实测发现,如果网络配置有问题,后面Hadoop节点间通信会各种报错。具体操作:
bash复制# 查看当前网卡信息
ifconfig
记录下网卡名称(比如ens33),然后配置静态IP。Ubuntu 18.04使用netplan管理网络,创建配置文件:
bash复制sudo vi /etc/netplan/02-config.yaml
内容示例(注意yaml的严格缩进):
yaml复制network:
version: 2
renderer: networkd
ethernets:
ens33:
addresses: [192.168.33.130/24]
gateway4: 192.168.33.2
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
应用配置时有个坑:如果报错"Invalid YAML",大概率是缩进问题。建议用空格代替Tab键:
bash复制sudo netplan apply
接着配置主机名和hosts文件。这里容易踩的坑是主机名解析失败。我建议先在master节点操作:
bash复制# 永久修改主机名
sudo vi /etc/hostname # 写入master
sudo vi /etc/hosts # 添加三台机器的IP和主机名
hosts文件内容示例:
code复制192.168.33.130 master
192.168.33.131 slave1
192.168.33.132 slave2
注意:所有节点都要配置相同的hosts文件,否则后面节点间通信会出问题。我遇到过因为slave节点hosts配置不全导致DataNode启动失败的情况。
Hadoop官方推荐使用专用用户(如hadoop)运行集群。创建用户时建议:
bash复制sudo useradd -m hadoop -s /bin/bash
sudo passwd hadoop
sudo adduser hadoop sudo
SSH免密登录是分布式集群的关键。我总结出最稳定的配置流程:
bash复制sudo apt install openssh-server -y
bash复制ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
bash复制ssh-copy-id hadoop@slave1
ssh-copy-id hadoop@slave2
测试免密登录时有个细节:第一次ssh连接需要手动确认指纹。可以在master节点先ssh连接一次所有节点,输入yes确认。
踩坑提醒:如果遇到".ssh目录权限过高"的问题,执行chmod 700 ~/.ssh和chmod 600 ~/.ssh/authorized_keys
Hadoop 3.x需要JDK8或JDK11。我推荐JDK8,兼容性更好。安装步骤:
bash复制tar -zxvf jdk-8u221-linux-x64.tar.gz -C /opt
sudo vi /etc/profile
添加环境变量:
bash复制export JAVA_HOME=/opt/jdk1.8.0_221
export PATH=$JAVA_HOME/bin:$PATH
验证安装时有个常见问题:
bash复制java -version
# 如果报错"bash: java: command not found"
# 可能是环境变量没生效,执行source /etc/profile
Hadoop安装要注意版本选择。我测试过3.1.3和3.2.2版本都比较稳定:
bash复制tar -zxvf hadoop-3.1.3.tar.gz -C /opt
vi /etc/profile
添加Hadoop环境变量:
bash复制export HADOOP_HOME=/opt/hadoop-3.1.3
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
关键配置文件在$HADOOP_HOME/etc/hadoop/目录下。必须修改的有:
core-site.xml示例:
xml复制<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoopdata</value>
</property>
</configuration>
重要提示:hadoop.tmp.dir目录要有写权限,我一般会专门创建目录并chown给hadoop用户
配置完成后,把master节点的Hadoop目录复制到所有slave节点:
bash复制scp -r /opt/hadoop-3.1.3 hadoop@slave1:/opt/
scp -r /opt/hadoop-3.1.3 hadoop@slave2:/opt/
首次启动前必须格式化NameNode:
bash复制hdfs namenode -format
启动集群时建议按顺序执行:
bash复制start-dfs.sh # 启动HDFS
start-yarn.sh # 启动YARN
mr-jobhistory-daemon.sh start historyserver # 启动历史服务
验证集群状态:
常见问题解决方案:
问题1:DataNode无法启动
检查slave节点的hadoop.tmp.dir目录权限,确保hadoop用户有写权限。我遇到过因为目录权限问题导致DataNode启动失败的情况。
问题2:SecondaryNameNode报错
在hadoop-env.sh中添加:
bash复制export HDFS_SECONDARYNAMENODE_USER=hadoop
问题3:YARN资源管理页面无法访问
检查yarn-site.xml配置,确保有:
xml复制<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
集群正常运行后,还需要进行一些优化配置。根据我的经验,这几个参数对性能影响很大:
xml复制<property>
<name>dfs.blocksize</name>
<value>256m</value>
</property>
xml复制<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>
xml复制<property>
<name>mapreduce.map.memory.mb</name>
<value>2048</value>
</property>
日常维护建议:
生产环境还需要考虑安全配置:
xml复制<property>
<name>dfs.permissions.enabled</name>
<value>true</value>
</property>
xml复制<property>
<name>yarn.acl.enable</name>
<value>true</value>
</property>
限制SSH访问:只允许特定IP通过防火墙访问集群节点
定期备份NameNode元数据:
bash复制hdfs dfsadmin -saveNamespace
根据我处理过的案例,总结几个典型问题的排查方法:
案例1:节点间通信超时
现象:DataNode经常丢失连接
解决方法:
xml复制<property>
<name>ipc.client.connect.timeout</name>
<value>30000</value>
</property>
案例2:磁盘空间不足
现象:无法创建新文件块
解决方法:
xml复制<property>
<name>dfs.datanode.data.dir</name>
<value>/data1,/data2,/data3</value>
</property>
案例3:任务执行缓慢
可能原因:
排查步骤:
最后分享一些实战经验:
配置完成后,可以运行测试作业验证集群:
bash复制hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 16 1000
这个命令会计算π的近似值,既能测试计算能力,也能检查集群稳定性。