颤抖吧Hadoop 、干碎大数据之Hadoop完全分布式平台搭建

2021-04-29 18:12:13 浏览数 (1)

Hadoop完全分布式平台搭建

【讲在前面】 Hadoop完全分布式集群的搭建需要多台虚拟机,每台虚拟机单独安装配置比较麻烦,因此我们可以在VMware中创建一个虚拟机后完成公共的基础配置然后直接创建完整克隆,这样效率比较高。 Hadoop完全分布式集群的搭建是典型的主从架构,即一台master节点多台slave节点,这里我采用三台虚拟机,一台作为master节点,另外两台作为slave1节点和slave2节点。

所需安装包:jdk安装包、Hadoop安装包(资源里面有我用的版本) 如果没有特殊说明本操作都是在Xshell中完成的。

安装建议:我这里安装统一在根目录下创建一个export文件夹,然后在export文件夹中创建两个文件夹servers(安装软件的文件夹),softwares(存放安装包的目录) or 在/usr/local/下安装。

代码语言:javascript复制
mkdir -p /export/servers
mkdir -p /export/softwares

1. 静态IP的配置

centos7安装完成后网卡默认是不启动的首先 ifconfigip a查看网卡名称。然后修改相关的配置文件。

代码语言:javascript复制
vi /etc/sysconfig/network-scripts/ifcfg-ens33
将BOOTPROTO修改为static
BOOTPROTO=static
最后一行ONBOOT改为yes
ONBOOT=yes
添加如下内容:
IPADDR=填IP地址
NETMASK=子网掩码
GATEWAY=网关IP
DNS1=8.8.8.8
DNS2=8.8.4.4

重启网络服务:

代码语言:javascript复制
systemctl restart network

如果能ping同外网说明静态IP配置成功

代码语言:javascript复制
ping www.qq.com

2. jdk的安装

将jdk安装包上传至softwares文件夹中,并解压缩至servers文件夹中。

代码语言:javascript复制
  cd /export/softwares/
  rz

选中jdk压缩包,上传至当前目录下

代码语言:javascript复制
  mv jdk-8u161-linux-x64.tar.gz jdk
  tar -zxvf jdk -C ../servers/ 

如果rz命令报错,则执行如下安装后再执行

代码语言:javascript复制
  yum -y install lrzsz

配置jdk的环境变量

在/etc/profile文件的末尾添加如下环境变量:

代码语言:javascript复制
export JAVA_HOME=/export/servers/jdk
export PATH=$PAHT:$JAVA_HOME/bin

保存后退出。

重新加载配置文件使刚才配置的环境变量生效。

代码语言:javascript复制
  source /etc/profile

查看是否配置成功:

输入java -version出现jdk的版本信息即为安装配置成功。

上面的静态IP配置和jdk的安装在每台机器上都需要配置,所以在一台机器上配置成功后直接克隆该虚拟机(注意要创建完整克隆),注意,克隆完成后IP地址三台都相同,需要你把克隆的两台虚拟机在配置文件中把IP修改一下,修改完成后,重启网络服务,看看相互间能不能ping通,如果能ping通则说明IP修改成功。

重启网路服务:

代码语言:javascript复制
systemctl restart network

————————————————

3. 修改虚拟机的主机名,并添加映射

修改/etc/hostname文件,将默认的第一行删掉,然后改为master,重启虚拟机,主机名修改生效。

同样的做法修改其他的两台虚拟机的主机名分别为:slave1、slave2,并重启虚拟机。

编辑/etc/hosts文件,追加如下内容(注意IP地址要改成自己的IP地址):

代码语言:javascript复制
  192.168.200.200 maste
  192.168.200.201 slave1
  192.168.200.202 slave2

在其他两台机器上也追加同样的内容。

验证是否更改成功就看相互间能不能ping通。例如在任意一台机器上执行如下命令:

代码语言:javascript复制
ping master
ping slave1
ping slave2

4. 配置SSH免密登录

检查SSH是否已经安装(centos7默认是安装了的)

rpm -qa | grep ssh

出现如下结果即为已经安装:

代码语言:javascript复制
  openssh-7.4p1-21.el7.x86_64
  libssh2-1.8.0-3.el7.x86_64
  openssh-clients-7.4p1-21.el7.x86_64
  openssh-server-7.4p1-21.el7.x86_64

如果没有安装的话则需手动安装:

代码语言:javascript复制
  yum -y install openssh-serve
  yum -y install openssh-clients

提示:如果没有安装openssh-clients的话,当执行ssh和scp命令的时候会报错,提示找不到该命令。

测试SSH是否可用(该IP地址为要登录目标机器的IP地址:也就是子节点的IP地址)

代码语言:javascript复制
  ssh 192.168.200.201

按照提示输入目标机器的登录密码,登陆成功后说明ssh可用,然后执行如下命令返回最初的主机

代码语言:javascript复制
  exit

生成密钥

代码语言:javascript复制
  ssk-keygen

该过程需要反复确认,之间按回车就可以,注意:有时候需要回答yes或者no!!!

在master节点上对所有节点进行免密登录操作,包括master节点:

代码语言:javascript复制
  ssh-copy-id maste
  ssh-copy-id slave1
  ssh-copy-id slave2

由于master需要启动slave节点上的服务,所以需要master登录slave,因此把在master节点上执行上面的命令。

5. 配置时间同步服务

检查是否安装ntp服务

代码语言:javascript复制
 rpm -qa | grep ntp

没有安装的话安装ntp服务

代码语言:javascript复制
 yum -y install ntp

设置master节点为NTP时间同步服务的主节点(即以master节点的时间为准)

编辑/etc/ntp.conf文件,注释掉以server开头的行,并添加如下代码:

代码语言:javascript复制
 restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap
 server 127.127.1.0
 fudge 127.127.1.0 stratum 10

配置节点时间同步(从master节点上获取时间)

在slave1、slave2节点中同样修改/etc/ntp.conf文件,注释掉以server开头的行,添加如下代码:

代码语言:javascript复制
 server maste

设置子节点每10分钟和master(时间服务器)同步一次时间

代码语言:javascript复制
 crontab -e

编写定时任务:

代码语言:javascript复制
 */10 * * * * /usr/sbin/ntpdate maste

启动NTP服务

在master节点上启动ntp服务并加入开机自启

代码语言:javascript复制
 service ntpd start & chkconfig ntpd on

在从节点上(slave1、slave2)上手动同步一次时间

代码语言:javascript复制
 ntpdate maste

在从节点上(slave1、slave2)上启动ntp服务并加入开机自启

代码语言:javascript复制
 service ntpd start & chkconfig ntpd on

查看ntp服务器有无和上层ntp连通

代码语言:javascript复制
 ntpstat

这个命令可能会看到 unsynchronised 这是正常情况,因为配置完成后,需要等待一会儿才能和/etc/ntp.conf中配置的标准时间进行同步。

查看ntp服务器和上层ntp的状态

代码语言:javascript复制
 ntpq -p

代码语言:javascript复制
 参数说明:
 when:     多少秒前进行过时间同步
 poll:    下次更新在多少秒后
 reach:    已经向上层ntp服务器要求更新的次数
 delay:    网络延迟
 offser:    时间补偿值
 jitter:    系统时间与BIOS时间差

测试是否配置成功

在任意节点上修改时间:

代码语言:javascript复制
 date -s "2011-11-11 11:11:11" 

等待十分钟后查看时间是否同步(实验时可以把10分钟调整为1分钟,节省时间)

代码语言:javascript复制
 date

扩展:如果需要和外网时间保持时钟同步的话就需要设置定时任务(其实虚拟机时间已经和网络上的时间同步了),我这里使用阿里云服务器的时间。----在master上操作

启动定时任务:

代码语言:javascript复制
    crontab -e

添加如下代码:分别代表 分 时 日 月 周

代码语言:javascript复制
    */1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com

6. Hadoop安装(master上操作)

注:有关更多详细的配置信息,可以去Hadoop官网查看,打开后滑到页面的最下方,左下角Configuration下就有各个配置文件详细信息的链接。

解压Hadoop安装包

进入到softwares目录

代码语言:javascript复制
 tar -zxvf hadoop-2.7.2.tar.gz -C ../servers/
 cd ../servers/
 mv hadoop-2.7.2.tar.gz hadoop

配置环境变量

在/etc/profile文件中添加如下内容:

代码语言:javascript复制
 export HADOOP_HOME=/export/servers/hadoop
 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

保存后记得source /etc/profile

修改配置文件

所有的配置文件都在如下路径中:

代码语言:javascript复制
 hadoop/etc/hadoop/
1

slaves

该配置文件保存slave节点的信息即节点的机器名称,删掉localhost修改为如下内容:

代码语言:javascript复制
 slave1
 slave2

代码语言:javascript复制
core-site.xml

Hadoop的核心配置文件

代码语言:javascript复制
在<configuration></configuration>之间添加如下内容:
 <property>
     <name>fs.defaultFS</name>
     <value>hdfs://master:9000</value>
 </property>
 <property>
     <name>hadoop.tmp.dir</name>
     <value>file:/export/servers/hadoop/tmp</value>
 </property>

fs.defaultFS属性是指定默认文件系统,他的值为hdfs以及master节点端口。

hadoop.tmp.dir属性是指定hdfs临时数据保存在哪个目录,默认值是Linux的tmp目录。

hdfs-site.xml

HDFS相关的配置文件

代码语言:javascript复制
在<configuration></configuration>之间添加如下内容:
 <property>
        <name>dfs.replication</name>
        <value>1</value>
 </property>
 <property>
       <name>dfs.namenode.name.dir</name>
       <value>file:/export/servers/hadoop/tmp/dfs/name</value>
 </property>
 <property>
         <name>dfs.datanode.data.dir</name>
         <value>file:/export/servers/hadoop/tmp/dfs/data</value>
 </property>

dfs.replication属性表示数据块副本的数量,它的值默认为3,这里我们为了方便测试将它设置为1。

dfs.namenode.name.dir属性表示NameNode的临时数据存放目录。

dfs.namenode.data.dir属性表示DataNode的临时数据存放目录。

mapred-site.xml

MapReduce的相关配置

对文件mapred-site.xml重命名,默认文件名为mapred-site.xml.template,并更改mapred-site.xml配置:

代码语言:javascript复制
 mv mapred-site.xml.template mapred-site.xml

在<configuration></configuration>之间添加如下内容:

代码语言:javascript复制
 <property>
     <name>mapreduce.framework.name</name>
     <value>yarn</value>
 </property>

mapreduce.framework.name属性表示MapReduce程序的运行框架,默认值为local,也就是本地运行,这里我们设置为yarn,让MapReduce程序运行在YARN框架上。

代码语言:javascript复制
yarn-site.xml

YARN框架的配置

代码语言:javascript复制
在<configuration></configuration>之间添加如下内容:

 <property>
         <name>yarn.resourcemanager.hostname</name>
         <value>master</value>
 </property>
 <property>
     <name>yarn.nodemanager.aux-services</name>
     <value>mapreduce_shuffle</value>
 </property>

yarn.resourcemanager.hostname属性指定ResourceManager运行在哪个节点上。

yarn.nodemanager.aux-services属性指定YARN的默认混洗方式,设置为MapReduce的默认混洗算法。

hadoop-env.sh

代码语言:javascript复制
Hadoop运行基本环境配置,自动化脚本启动的时候要用。
 export JAVA_HOME=/export/servers/jdk

在文件的第25行位置,把前面的注释去掉,然后把后面的路径改为你JAVA_HOME的路径。

自此Hadoop就算配置完成了,这只是设置了正常启动所必须的设置项!!

7. Hadoop文件夹的分发

在master节点上配置好所有的配置文件后,将Hadoop文件夹分发给另外的两台子节点

代码语言:javascript复制
scp -r /export/servers/hadoop slave1:/export/servers/
scp -r /export/servers/hadoop slave2:/export/servers/

8. 集群启动

启动集群前一定要关闭防火墙,注意,每台机器的防火墙都要关闭!!!

代码语言:javascript复制
查看防火墙状态:
systemctl status firewalld
关闭防火墙:
systemctl stop firewalld

设置防火墙开机不启动(永久关闭防火墙,如果后面需要还可以手动打开):
systemctl disable firewalld

打开防火墙:
systemctl start firewalld

第一次启动前要格式化NameNode(后面启动的时候就不需要格式化了)

代码语言:javascript复制
  hdfs namenode -format

如果忘记格式化启动后,需要关掉所有namenode和datanode进程,然后删掉data和log数据,然后重新格式化。

集群启动方式分为两种,一种是手动启动,一种是自动化脚本启动

手动启动

代码语言:javascript复制
 1. 启动HDFS :

 启动NameNode(master节点):
 hadoop-daemon.sh start namenode
 启动DataNode(在Slave节点):
 hadoop-daemon.sh start datanode
 启动SecondaryNameNode(在任意节点):
 hadoop-daemon.sh start secondarynamenode

 2. 启动YARN :
 启动ResourceManager(在Master节点):
 yarn-daemon.sh start resourcemanage

 启动NodeManager(在Slave节点):
 yarn-daemon.sh start nodemanage

 3. 启动历史任务服务:
 mr-jobhistory-daemon.sh start historyserve
自动化脚本启动(master节点上执行)

1. 启动HDFS :

代码语言:javascript复制
 
 start-dfs.sh

 2. 启动YARN :

 start-yarn.sh

3. 启动历史任务服务:

代码语言:javascript复制
 mr-jobhistory-daemon.sh start historyserve

注:还有一个脚本是:start-all.sh,但是一般不建议使用,容易出错。

14

查看进程

jps

在master上看到如下进程即为启动成功:

代码语言:javascript复制
  [root@master ~]# jps
  2016 ResourceManage
  2353 Jps
  1636 NameNode
  1845 SecondaryNameNode
  2310 JobHistoryServe
  [root@master ~]# 

在slave上看到如下进程即为启动成功:

代码语言:javascript复制

  [root@slave1 ~]# jps
  1554 DataNode
  1830 Jps
  1671 NodeManage
  [root@slave1 ~]# 

说明:

NameNode、SecondaryNameNode是HDFS在master上的进程,DataNode是HDFS在slave上的进程,这三个进程存在,说明HDFS启动成功。

ResourceManager是YARN在master上的进程,NodeManager是YARN在slave上的进程,这两个进程存在,说明YARN启动成功。

JobHistoryServer是历史服务的进程。

查看网页

集群启动后可以在浏览器中输入IP地址加端口号,访问它的UI页面,查看集群的详细信息。

代码语言:javascript复制
  查看HDFS集群详细信息:
  192.168.200.200:50070
  查看YARN集群详细信息:
  192.168.200.200:8088
  查看historyserver历史服务详细信息:
  192.168.200.200:19888

关闭进程

把开启服务命令中的start改为stop即可。

0 人点赞