作为一名大数据工程师,我经常需要搭建Hadoop集群环境。今天我将分享一个从零开始的Hadoop完全分布式搭建过程,适合刚接触Hadoop的新手学习参考。这个方案基于三台虚拟机节点,使用CentOS 7系统,涵盖了从环境准备到集群启动的全流程。
提示:在开始前,请确保你的电脑至少有16GB内存和100GB可用磁盘空间,因为我们需要同时运行三台虚拟机。
搭建Hadoop集群前,我们需要准备以下环境:
首先创建一台模板虚拟机,配置如下:
bash复制# 查看网络接口配置
nmcli device show ens33
修改VMware虚拟网络编辑器:
配置主机VMnet8适配器:
配置CentOS静态IP:
bash复制vi /etc/sysconfig/network-scripts/ifcfg-ens33
# 修改以下参数
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.10.100
NETMASK=255.255.255.0
GATEWAY=192.168.10.2
DNS1=8.8.8.8
DNS2=114.114.114.114
配置完成后测试网络连通性:
bash复制ping www.baidu.com
bash复制vi /etc/hostname
# 修改为node1
bash复制vi /etc/hosts
# 添加以下内容
192.168.10.100 node1
192.168.10.101 node2
192.168.10.102 node3
bash复制useradd hduser
passwd hduser
# 设置密码为123456
# 赋予sudo权限
visudo
# 在root ALL=(ALL) ALL下添加
hduser ALL=(ALL) NOPASSWD:ALL
bash复制mkdir -p /opt/{module,software}
chown -R hduser:hduser /opt/{module,software}
bash复制rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
bash复制tar -zxvf jdk-8u202-linux-x64.tar.gz -C /opt/module/
bash复制vi /etc/profile.d/my_env.sh
# 添加以下内容
export JAVA_HOME=/opt/module/jdk1.8.0_202
export PATH=$PATH:$JAVA_HOME/bin
# 使配置生效
source /etc/profile
验证安装:
bash复制java -version
bash复制tar -zxvf hadoop-3.2.4.tar.gz -C /opt/module/
bash复制vi /etc/profile.d/my_env.sh
# 添加以下内容
export HADOOP_HOME=/opt/module/hadoop-3.2.4
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
bash复制hadoop version
node2配置:
bash复制vi /etc/sysconfig/network-scripts/ifcfg-ens33
# 修改IPADDR=192.168.10.101
vi /etc/hostname
# 修改为node2
node3配置:
bash复制vi /etc/sysconfig/network-scripts/ifcfg-ens33
# 修改IPADDR=192.168.10.102
vi /etc/hostname
# 修改为node3
bash复制ssh-keygen -t rsa
# 连续三次回车
bash复制ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
bash复制ssh node2
exit
bash复制vi ~/bin/xsync
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in node1 node2 node3
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
# 赋予执行权限
chmod +x ~/bin/xsync
bash复制xsync /opt/module/jdk1.8.0_202
xsync /opt/module/hadoop-3.2.4
xsync /etc/profile.d/my_env.sh
bash复制source /etc/profile
xml复制vi $HADOOP_HOME/etc/hadoop/core-site.xml
<configuration>
<!-- 指定NameNode地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:8020</value>
</property>
<!-- 指定Hadoop数据存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.2.4/data</value>
</property>
<!-- HDFS网页登录用户 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hduser</value>
</property>
</configuration>
xml复制vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml
<configuration>
<!-- NameNode Web UI地址 -->
<property>
<name>dfs.namenode.http-address</name>
<value>node1:9870</value>
</property>
<!-- SecondaryNameNode Web UI地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node3:9868</value>
</property>
</configuration>
xml复制vi $HADOOP_HOME/etc/hadoop/yarn-site.xml
<configuration>
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node2</value>
</property>
<!-- 环境变量继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
xml复制vi $HADOOP_HOME/etc/hadoop/mapred-site.xml
<configuration>
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
bash复制vi $HADOOP_HOME/etc/hadoop/workers
node1
node2
node3
使用xsync脚本将配置同步到所有节点:
bash复制xsync $HADOOP_HOME/etc/hadoop/
bash复制hdfs namenode -format
重要提示:格式化NameNode会生成新的集群ID,导致NameNode和DataNode的集群ID不一致。如果集群运行中需要重新格式化,必须先停止所有服务并删除data和logs目录。
bash复制start-dfs.sh
bash复制# 在node2上执行
start-yarn.sh
bash复制jps
# node1应有:
# NameNode
# DataNode
# node2应有:
# ResourceManager
# NodeManager
# DataNode
# node3应有:
# SecondaryNameNode
# NodeManager
# DataNode
bash复制hdfs dfs -mkdir /test
hdfs dfs -put $HADOOP_HOME/etc/hadoop/*.xml /test
hdfs dfs -ls /test
问题现象:节点间无法ping通或SSH连接失败
解决方案:
bash复制systemctl stop firewalld
systemctl disable firewalld
问题现象:某些服务无法启动或报错
解决方案:
bash复制cat $HADOOP_HOME/logs/*.log | grep -i error
bash复制echo $JAVA_HOME
echo $HADOOP_HOME
bash复制df -h
问题现象:DataNode无法连接到NameNode
解决方案:
bash复制cat $HADOOP_HOME/data/dfs/name/current/VERSION
cat $HADOOP_HOME/data/dfs/data/current/VERSION
bash复制rm -rf $HADOOP_HOME/data $HADOOP_HOME/logs
hdfs namenode -format
根据集群规模调整以下参数:
bash复制export HDFS_NAMENODE_OPTS="-Xmx4g"
export HDFS_DATANODE_OPTS="-Xmx2g"
xml复制<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>
根据数据重要性调整副本数:
xml复制<!-- hdfs-site.xml -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
对于测试环境,可以设置为1以减少存储开销。
bash复制hdfs dfsadmin -report
bash复制hdfs balancer -threshold 10
bash复制hdfs dfs -expunge
bash复制hdfs --daemon start datanode
yarn --daemon start nodemanager
bash复制hdfs dfsadmin -fetchImage /backup/namenode
bash复制vi /etc/ssh/sshd_config
# 添加
AllowUsers hduser
通过以上步骤,我们成功搭建了一个三节点的Hadoop完全分布式集群。在实际生产环境中,还需要考虑高可用、安全认证等更多因素。建议新手先通过这个基础集群熟悉Hadoop的运作机制,再逐步深入更复杂的配置和优化。