Ubuntu环境下搭建HDFS集群的经验分享
在开始搭建前,需先规划集群规模(如1个NameNode+2-3个DataNode的入门配置),确保所有节点处于同一局域网且能互相通信(可通过ping命令测试)。基础环境准备是关键,需完成以下步骤:
sudo apt update && sudo apt install openjdk-8-jdk -y安装,验证java -version显示版本信息即为成功。ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa),将公钥复制到所有从节点(ssh-copy-id user@datanode-ip),测试ssh user@datanode-ip无需密码登录。从Apache官网下载稳定版本(如3.3.6),解压至/usr/local/目录(便于系统管理):
wget https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
tar -xzvf hadoop-3.3.6.tar.gz -C /usr/local/
sudo mv /usr/local/hadoop-3.3.6 /usr/local/hadoop # 软链接简化路径
创建专用用户(如hadoop)并修改目录权限,避免权限问题:
sudo useradd -m hadoop
sudo chown -R hadoop:hadoop /usr/local/hadoop
编辑~/.bashrc(或/etc/profile),添加Hadoop路径:
echo 'export HADOOP_HOME=/usr/local/hadoop' >> ~/.bashrc
echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> ~/.bashrc
source ~/.bashrc # 立即生效
验证hadoop version能正确显示版本信息。
进入$HADOOP_HOME/etc/hadoop目录,修改以下关键文件:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://namenode-ip:9000</value> <!-- 集群模式下用主机名或IP -->
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value> <!-- 临时目录,需提前创建 -->
</property>
</configuration>
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value> <!-- 副本数,根据节点数量调整 -->
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/data/namenode</value> <!-- NameNode元数据目录 -->
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/data/datanode</value> <!-- DataNode数据目录 -->
</property>
</configuration>
cp mapred-site.xml.template mapred-site.xml):指定MapReduce运行框架为YARN:<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>resourcemanager-ip</value> <!-- ResourceManager节点IP -->
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>
注意:所有节点的配置文件必须保持一致,建议用rsync同步配置。
首次启动前,必须格式化NameNode(会清空HDFS所有数据,仅第一次需要):
hdfs namenode -format
格式化后会创建dfs.name.dir指定的目录,存储元数据(如命名空间信息)。
start-dfs.sh,启动NameNode、DataNode和SecondaryNameNode(可选,用于元数据备份)。start-yarn.sh,启动ResourceManager和NodeManager。jps命令查看进程:主节点应有NameNode、SecondaryNameNode、ResourceManager;从节点应有DataNode、NodeManager。hdfs dfsadmin -report查看DataNode列表及存储信息;yarn node -list查看NodeManager状态。http://namenode-ip:9870(HDFS Web界面),http://resourcemanager-ip:8088(YARN资源管理界面),确认集群状态正常。~/.ssh目录权限(应为700),公钥文件权限(应为600),确保authorized_keys包含所有从节点的公钥。$HADOOP_HOME/logs/hadoop-*-namenode-*.log日志,常见原因包括端口被占用(9000)、dfs.name.dir目录权限不足或格式化不彻底(需删除dfs.name.dir目录重新格式化)。telnet namenode-ip 9000测试端口连通性;确保core-site.xml中的fs.defaultFS地址与NameNode实际IP一致。dfs.datanode.data.dir目录是否存在且有写入权限,查看DataNode日志($HADOOP_HOME/logs/hadoop-*-datanode-*.log)是否有错误信息(如磁盘空间不足)。sudo ufw disable),生产环境需放行Hadoop所需端口(如9000、50070、8088)。dfsadmin、yarn node命令,或第三方工具(如Ambari、Cloudera Manager)监控集群状态,及时发现资源瓶颈。