参考了这篇文章,并在此基础上加以修改:
阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建在此感谢这位大佬

  • 1.准备:

两台配置CentOS 7.3的阿里云ECS服务器;
Hadoop:hadoop-2.7.3.tar.gz使用迅雷下载比较快
Java: 这里直接从云服务器上下载就好

  • 2.修改hostname:
    更改主机名:
    由于系统为CentOS 7,可以直接使用
hostnamectl set-hostname master

主节点设置为master,master是我自定义的主机名,修改完毕后重新shell登录或者重启服务器即可。
副节点设置为slave1

hostnamectl set-hostname slave1

hostname查看主机名

hostname
  • 3.设置本地域名:
    设置本地域名这一步非常关键,ip的本地域名信息配置不好,即有可能造成Hadoop启动出现问题,又有可能造成在使用Hadoop的MapReduce进行计算时报错。
    修改/etc/hosts文件,主节点需要修改,slave1节点也需要修改
    IP本机内网,其它外网: 在本机上的操作,都要设置成内网ip;其它机器上的操作,要设置成外网ip
    (1)在master节点上
vim /etc/hosts

在文件最上面添加
master节点的内网IP master
slave1节点的外网IP slave1
(2)在slave1节点上
同样的修改slave1节点的hosts文件

vim /etc/hosts

master节点的公网IP master
slave1节点的内网IP slave1

配置好后需要在各个节点上执行如下命令,测试是否相互 ping 得通,如果 ping 不通,后面就无法顺利配置成功:

ping master -c 3
ping slave1 -c 3

5台服务器搭建hadoop 云服务器搭建hadoop集群_xml

  • 4.各节点角色分配
    不用输入命令
    master: NameNode ResourceManager
    slave1: DataNode NodeManager
  • 5.免密码登录配置
    分别在 master 和 slave1 上做如下操作
ssh-keygen -t rsa
ssh-copy-id master
ssh-copy-id slave1

验证:

ssh master date
ssh slave1 date
  • 6.配置JDK
    参考:Centos7中yum安装jdk及配置环境变量 直接yum安装1.8.0版本openjdk
yum install java-1.8.0-openjdk* -y

查看版本

java -version

5台服务器搭建hadoop 云服务器搭建hadoop集群_mapreduce_02


虽然现在可以使用jdk了,但是还是需要配置jdk环境变量,否则后面配置hadoop时会出现问题

环境变量配置,jdk是默认安装的,如果不知道安装位置

可以使用命令

ls -l /etc/alternatives/java

查看java的安装目录

5台服务器搭建hadoop 云服务器搭建hadoop集群_xml_03

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin

添加后保存。
重新加载文件

source /etc/profile

同理对slave1节点也执行以上操作

接下来开始hadoop集群的配置
- 7.hadoop集群配置

移动到master节点的根目录

cd ~

使用软件xftp把之前下载的hadoop,上传到云服务器,这一步很好操作。

5台服务器搭建hadoop 云服务器搭建hadoop集群_hadoop_04


tar -zxvf hadoop-2.7.3.tar.gz -C /usr/local # 解压到/usr/local中

cd /usr/local/

mv ./hadoop-2.7.3/ ./hadoop # 将文件夹名改为hadoop

输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:

cd /usr/local/hadoop
./bin/hadoop version

添加 HADOOP_HOME 到系统环境变量

vim /etc/profile

在文件后面添加

export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

重新加载环境,并输出变量 HADOOP_HOME 验证

5台服务器搭建hadoop 云服务器搭建hadoop集群_5台服务器搭建hadoop_05


进入/usr/local/hadoop/etc/hadoop/可以看到如下配置文件,原文这里写错了,是usr不是user

5台服务器搭建hadoop 云服务器搭建hadoop集群_hadoop_06


- 8.接下来便是修改hadoop的配置文件了

进入到上面提到的文件目录,配置文件都在该目录下

hadoop-env.sh, slaves, core-default.xml, hdfs-default.xml, mapred-default.xml, yarn-default.xml

(1.)配置 hadoop-env.sh

vim hadoop-env.sh

文件中加入

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64

注:之前在配置jdk中配置的是基于系统的JAVA_HOME变量,这里需要配置基于Hadoop集群的JAVA_HOME变量。
hadoop-env.sh 是Hadoop的环境变量配置脚本。
(2)配置slave

vim slaves

删去原有的 localhost , 添加将作为 slave 节点的 slave1

如果有多个,那么将他们的主机名加在这里即可,一行一个。

5台服务器搭建hadoop 云服务器搭建hadoop集群_mapreduce_07


(3)配置 core-site.xml

vim core-site.xml

添加如下内容,在标签内添加

<property>
         <name>fs.defaultFS</name>
         <value>hdfs://master:9000</value>
         <description>The name of the default file system.</description>
     </property>
     <property>
         <name>hadoop.tmp.dir</name>
         <value>/usr/local/hadoop/tmp</value>
         <description>Abase for other temporary directories.</description>
     </property>

(4.)配置 hdfs-site.xml
vim hdfs-site.xml
添加以下内容,云文章在这里没有配置50070端口,所以他文中后面提到的那个web页面是无法访问到的。

<property>
         <name>dfs.namenode.name.dir</name>
         <value>/usr/local/hadoop/tmp/dfs/name</value>
     </property>

     <property>
         <name>dfs.datanode.data.dir</name>
         <value>/usr/local/hadoop/tmp/dfs/data</value>
     </property>

     <property>
         <name>dfs.replication</name>
         <value>1</value>
     </property>


     <property>
         <name>dfs.permissions.enabled</name>
         <value>false</value>
         <description>If "true", enable permission checking in HDFS. If "false", permission checking is turned off, but all other behavior is unchanged. Switching from one parameter value to the other does not change the mode, owner or group of files or directories.</description>
     </property>
<property>
                    <name>dfs.namenode.http.address</name>
                   <value>master:50070</value>
           </property>

(5.)配置 mapred-site.xml (这个文件没有直接提供,而是提供了模版文件,需将模版文件转换为配置文件
mv mapred-site.xml.template mapred-site.xml
vi mapred-site.xml

<property>
        <name>mapreduce.framework.name</name>
         <value>yarn</value>
         <description>The runtime framework for executing MapReduce jobs.Can be one of local, classic or yarn.</description>
     </property>
     <property>
         <name>mapreduce.jobtracker.http.address</name>
         <value>master:50030</value>
     </property>
     <property>
         <name>mapreduce.jobhisotry.address</name>
         <value>master:10020</value>
     </property>
     <property>
        <name>mapreduce.jobhistory.webapp.address</name>
         <value>master:19888</value>
     </property>
     <property>
         <name>mapreduce.jobhistory.done-dir</name>
         <value>/jobhistory/done</value>
     </property>
     <property>
         <name>mapreduce.jobhistory.intermediate-done-dir</name>
         <value>/jobhisotry/done_intermediate</value>
     </property>
     <property>
         <name>mapreduce.job.ubertask.enable</name>
         <value>true</value>
         <description>Whether to enable the small-jobs "ubertask" optimization,which runs "sufficiently small" jobs sequentially within a single JVM."Small" is defined by the following maxmaps, maxreduces, and maxbytes settings. Note that configurations for application masters also affect the "Small" definition - yarn.app.mapreduce.am.resource.mb must be larger than both mapreduce.map.memory.mb and mapreduce.reduce.memory.mb, and yarn.app.mapreduce.am.resource.cpu-vcores must be larger than both mapreduce.map.cpu.vcores and mapreduce.reduce.cpu.vcores to enable ubertask. Users may override this value.</description>
     </property>

(6)yarn-site.xml
添加如下内容

<property>
        <name>yarn.resourcemanager.hostname</name>
         <value>master</value>
 </property>

<property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
         <description>A comma separated list of services where service name should only contain a-zA-Z0-9_ and can not start with numbers</description>
     </property>

<property>
         <name>yarn.resourcemanager.address</name>
         <value>master:18040</value>
     </property>



<property>
         <name>yarn.resourcemanager.scheduler.address</name>
         <value>master:18030</value>
     </property>


 <property>
         <name>yarn.resourcemanager.resource-tracker.address</name>
         <value>master:18025</value>
     </property>


<property>
         <name>yarn.resourcemanager.admin.address</name>
         <value>master:18141</value>
     </property>


    <property>
         <name>yarn.resourcemanager.webapp.address</name>
         <value>master:18088</value>
     </property>


 <property>
         <name>yarn.log-aggregation-enable</name>
         <value>true</value>
     </property>


   <property>
         <name>yarn.log-aggregation.retain-seconds</name>
         <value>86400</value>
     </property>


  <property>
         <name>yarn.log-aggregation.retain-check-interval-seconds</name>
         <value>86400</value>
     </property>


<property>
         <name>yarn.nodemanager.remote-app-log-dir</name>
         <value>/tmp/logs</value>
     </property>

 <property>
         <name>yarn.nodemanager.remote-app-log-dir-suffix</name>
         <value>logs</value>
     </property>

到这里 master 就已经配置好了,下面将该服务器的配置分发到 slave1 上去(建议压缩后再分发),在此使用压缩后分发的方法,不要再从slave节点上下载hadoop了
在 master 节点上执行

cd /usr/local
tar -zcvf ~/hadoop.master.tar.gz ./hadoop   
cd ~
scp ./hadoop.master.tar.gz slave1:/root/
scp /etc/profile slave1:/etc/

在 slave1 节点上执行

tar -zxvf ~/hadoop.master.tar.gz -C /usr/local

在 slave1 上重新加载环境并检查验证

source /etc/profile
echo $HADOOP_HOME

HDFS NameNode 格式化(只要在 master 上执行即可)

$HADOOP_HOME/bin/hdfs namenode -format

看到下面的输出,表明hdfs格式化成功
INFO common.Storage: Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted.

启动前检查防火墙状态

service  iptables status

需要将防火墙关闭,这里我的slave1节点也关闭防火墙了
Linux关闭防火墙命令

启动 Hadoop 集群

$HADOOP_HOME/sbin/start-all.sh

5台服务器搭建hadoop 云服务器搭建hadoop集群_hadoop_08


启动 job history server

在 master 上执行

$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver

5台服务器搭建hadoop 云服务器搭建hadoop集群_hadoop_09


成功后在两个节点上验证,在 master 上 执行

jps

5台服务器搭建hadoop 云服务器搭建hadoop集群_hadoop_10


可以看到 ResourceManager、SecondaryNameNode、NameNode、JobHistoryServer 四个进程全部启动

在 slave1 上执行

jps

5台服务器搭建hadoop 云服务器搭建hadoop集群_hadoop_11


可以看到 NodeManager、DataNode 两个进程全部启动

缺少任一进程都表示出错。另外还需要在 Master 节点上通过命令 hdfs dfsadmin -report 查看 DataNode 是否正常启动,如果 Live datanodes 不为 0 ,则说明集群启动成功。例如我这边一共有 1 个 Datanodes:

5台服务器搭建hadoop 云服务器搭建hadoop集群_xml_12


全部配置完成之后查看 web 页面

访问页面的地址也不是原文中所说的这个 http://master:50070/

而是http://公网ip:50070

5台服务器搭建hadoop 云服务器搭建hadoop集群_xml_13

由于是部署完之后第二天写的,有些注意的点记不太清了。
这是云计算老师安排的一个作业,希望对大家有所帮助吧。