当前采用三节点搭建

1.hosts文件修改

# 这里有个大坑:当使用阿里云的vps搭建服务时需要将自己的ip设置为本机内网ip否则启动hdfs集群时namenode会报错Problem binding to [namenode:9000] java.net.BindException: Cannot assign req...、secondarynamenode会报错INFO org.apache.hadoop.http.HttpServer2: HttpServer.start() threw a non Bind IOException
vim /etc/hosts
ip  namenode
ip  datanodel
ip datanodeq
# ip 位置为节点ip

2.主机名修改

# 后来临时想到加上secondarynamenode到datanodel,所以这里的命名有点小问题
hostnamectl set-hostname namenode
hostnamectl set-hostname datanodel
hostnamectl set-hostname datanodeq
# 主机名需要断开当前会话重新连接才能生效

3.配置JDK(namenode执行)

# 因为在子进程中我们也有使用java的需求所以这里使用export
vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_221
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
scp /etc/profile datanodeq:/etc/profile
scp /etc/profile datanodel:/etc/profile
ssh datanodeq source /etc/profile
ssh datanodel source /etc/profile

4.ssh免密访问

# 全部节点,一路回车。会提示你使用哪种加密方式(RSA、DSA)RSA会加密、因此性能低于DSA但安全性高于DSA,我们直接回车会使用RSA。如需使用DSA则ssh-keygen -t dsa,默认的密钥生成位置/root/.ssh/id_rsa 也可以自己指定,将自己的公钥追加到目标主机的authorized_keys则可以实现无需密码登录。
ssh-keygen
# 以下namenode执行
cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
ssh datanodeq cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
ssh datanodel cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
scp /root/.ssh/authorized_keys root@datanodeq:/root/.ssh/authorized_keys
scp /root/.ssh/authorized_keys root@datanodel:/root/.ssh/authorized_keys
# 这里不要为了省事使用ssh-copy-id命令,这样会覆盖同名的公钥,而我们要做的是追加

5.hadoop环境变量

vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_221
export HADOOP_HOME=/opt/hadoop-2.6.5
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

6.hadoop配置文件修改(全部节点的JAVA_HOME变量都要手动更改成绝对路径)

# ssh 连接的情况下不会执行/etc/profile,所以其中定义的变量也取不到,因此我们在这里直接自己定义绝对路径
vim hadoop-env.sh
vim mapred-env.sh
vim yarn-env.sh
# 替换其中所有的JAVA_HOME的路径为java所在的绝对路径
vim core-site.xml
# 定义默认文件系统入口(namenode),与元数据储存位置。其中默认的临时目录在/tmp目录下,(hdfs-site.xml会使用其作为持久化目录)。这个目录在Linux系统的内存达到一定阈值后会自动清空,所以我们不能将元数据储存在这里。hadoop.tmp.dir的目录必须为空。
<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://namenode:9000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/var/hadoop/</value>
        </property>
</configuration>
vim hdfs-site.xml
# 框架默认的备份数也为3、dfs.namenode.secondary.http-address 定义secondary节点
<configuration>
        <property>
                <name>dfs.replication</name>
                <value>2</value>
        </property>
        <property>
                <name>dfs.namenode.secondary.http-address</name>
                <value>datanodel:50090</value>
        </property>
</configuration>
vim slaves
# 编辑从节点列表
datanodel
datanodeq

7.格式化hdfs目录

hadoop namenode -format
# 出现以下提示则格式化成功
INFO common.Storage: Storage directory /var/hadoop/dfs/name has been successfully formatted.
# 这时查看我们之前指定的临时目录
ls /var/hadoop/dfs/name/current/
# 可以发现各节点产生了各自的文件目录

8.启动hdfs服务

# 这里出现了一个坑,当我使用环境变量来执行该脚本时报错chdir: error retrieving current directory: getcwd: cannot access parent dire遂使用绝对路径。该问题出现的原因:
/opt/hadoop-2.6.5/sbin/start-dfs.sh
# jps 命令查看相应的服务是否启动成功。如果失败的话要先清空自定义的缓存位置。