Centos7环境 – Hadoop全分布式模式部署
正文开始@Assassin
目录:
此前搭建了hadoop的单机模式与伪分布式模式:
中间拖得有点久了,今天索性做个了结,把hadoop的全分布式模式部署的操作也简单地记录一下,算是一个系统性的学习吧。
伪分布式模式是学习阶段最常用的模式,它可以将进程都运行在同一台机器上。在此模式下,可以模拟全分布式模式下的运行状态,基本上可以完成全分布模式下的所有操作,所以说伪分布模式是全分布模式的一个特例。
在全分布模式下,会在配置文件中体现出主节点与分节点,可以指定哪些机器上运行哪些服务以达到的成本与效率的平衡。在企业中主要采用的都是全分布式模式,节点从数十个到上百个不等。在学习阶段,如果个人PC的性能足够强劲,也可以使用多台虚拟机代替,由于我的PC性能不是太好,这里估计只会开两台虚拟机来进行hadoop全分布式的部署。
1. 机器准备:
因为是部署全分布式模式,所以应该是由多台虚拟机或物理机组成的集群,我这里使用两台centos虚拟机来进行相关的操作,整体搭建步骤如下:
准备2台虚拟机 -> 完成系统安装和网络配置 -> 选择其中一台机器为主节点进行Hadoop核心配置 -> 将配置后的Hadoop软件分发到其他机器 -> 启动测试
建议把各主机名改为具有标识意义的名称,便于记忆和区分,同时建议设置静态ip,以免自动分配的ip发生变化。
!!默认安装了hadoop及jdk。
2. 修改主机名:
选择一台机器作为主节点,命名为master:
[root@centos ~]# hostname master #临时生效
[root@centos ~]# hostnamectl set-hostname master #永久生效
重新登录后:hostname
另一台机器为副节点,命名为slave:
[root@centos8 ~]# hostname slave #临时生效
[root@centos8 ~]# hostnamectl set-hostname slave #永久生效
重新登录后:hostname
3. 配置静态ip:
使用root用户或者sudoers用户修改当前启用的网卡配置文件,所在目录路径为 /etc/sysconfig/network-scripts
,centos6系统默认文件为ifcfg-eth0
,centos7系统默认文件为ifcfg-ens33
,centos8系统默认文件为ifcfg-ens160
。
[root@master ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改格式如下表所示:
# 原值为dhcp,修改为static
BOOTPROTO=static
# 添加IPADDR,对应的值要与原ip在同一网段
IPADDR=xxx.xxx.xxx.xxx
# 添加NETMASK,指定子网掩码,默认为255.255.255.0
NETMASK=255.255.255.0
# 添加GATEWAY网关,要与虚拟机网卡的网关设置一致,默认仅主机模式为1,NAT模式为2
GATEWAY=xxx.xxx.xxx.1/2
# 如果需要连入外网,则可以添加DNS1和DNS2配置,通常会将DNS1指定为网关地址
我的虚拟机是NAT模式,所以网关的最后一个字节为2,查看一下网关:
我的网卡配置文件配置如下:完成后保存退出。
master主机:
配置完成后保存退出,centos7使用systemctl restart network
命令重启网卡服务(centos6:service network restart
),并使用ifconfig
命令查看配置是否正确:
[root@master ~]# systemctl restart network
[root@master ~]# ifconfig
ip地址已经更改为192.168.254.130
,静态ip地址:
slave主机:
同理,也是修改网卡配置文件:这里将静态ip设置成了192.168.254.140
配置完成后保存退出,centos7使用systemctl restart network
命令重启网卡服务(centos6:service network restart
),并使用ifconfig
命令查看配置是否正确:
[root@slave ~]# systemctl restart network
[root@slave ~]# ifconfig
ip地址已经更改为192.168.254.140
,静态ip地址:
补充: 关于centos8的网卡配置:
centos8的网卡配置文件的操作与centos7相同,不同的是重启网卡的操作。
使用centos7的systemctl restart network
命令会提示:
Failed to restart network.service: Unit network.service not found.
新命令为:nmcli
nmcli connection reload ens160
:重启网卡ens160nmcli connection up ens160
:激活网卡ens160nmcli connection down ens160
:停用网卡ens160
一般来说,重启一个网卡就是reload + up两个操作。
4. 配置hosts映射:
由于是全分布式模式,为了方便各节点之间的交互,同样也为了尽量减少配置的修改,通常在配置文件中都会使用主机名,这就需要正确的建立主机名与ip地址的映射。目前已经有了两台配置好网络的机器(要保证在同一虚拟网络模式下,即:同为NAT、仅主机、桥接等,这样才能保证每台机器都处在同一个网段,能够正常通信)。现在有两台机器(master为主节点):
主机名称 | ip地址 |
---|---|
master | 192.168.254.130 |
slave | 192.168.254.140 |
分别在两台主机上使用root用户或者sudoers用户修改/etc/hosts
文件,修改方式为直接在文末追加以下内容:
192.168.254.130 master
192.168.254.140 slave
master:
[root@master ~]# vim /etc/hosts
添加以下内容:
slave:
[root@slave ~]# vim /etc/hosts
添加以下内容:
配置完成后可以使用ping
命令对主机名进行测试,看是否能够正确解析出ip地址,得到目标主机的replay:
master: 可以正常ping通
slave: 可以正常ping通
前置工作已经完成,下面开始对hadoop全分布式的部署。
注:以下操作均由master主机完成,之后通过scp复制到slave主机
5. hadoop配置:
对于hadoop软件,通常会新建一个单独的用户来管理,下面以普通用户hadoop为例来进行操作。
配置hadoop环境变量:
[hadoop@master ~]$ vim ~/.bash_profile
在文末添加以下信息:
HADOOP_HOME=/home/hadoop/hadoop-2.10.1 #hadoop解压路径
PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin ##拼接原有PATH,同时添加hadoop_home的bin及hadoop_home的sbin
export HADOOP_HOME #导出HADOOP_HOME,提升为全局
使其内容如下图所示:保存退出。
刷新环境变量,使其立即生效:
[hadoop@master ~]$ source ~/.bash_profile
使用hadoop version
进行测试:出现版本信息即为成功
6. jdk配置:
配置jdk环境变量:
[hadoop@master ~]$ vim ~/.bash_profile
在文末添加以下信息:
JAVA_HOME=/home/hadoop/jdk1.8.0_251 #jdk解压目录
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin #拼接原有PATH,同时添加jdk的bin及jre/bin
#执行export导出,提升为全局
export JAVA_HOME
使其内容如下图所示:保存退出。
刷新环境变量,使其立即生效:
[hadoop@master ~]$ source ~/.bash_profile
使用java -version
进行测试:出现版本信息即为成功
7. HDFS及YARN环境搭建:
全分布式模式运行hadoop需要先进行相关配置,并启动守护进程(后台运行),基本配置文件所在路径为hadoop的安装目录下的etc文件夹,也就是:
$HADOOP_HOME/etc/hadoop,在当前环境中路径为:
/home/hadoop/hadoop-2.10.1/etc/hadoop
cd进入目录,ls 查看一下文件夹中具体内容:
7.1 hadoop-env.sh:
hadoop-env.sh文件是在启动hadoop进程时,系统会自动调用的一个脚本文件;在此文件中需配置前置环境,也就是告诉OS去哪查找jdk;
[hadoop@master hadoop]$ vim hadoop-env.sh
vim 进入到 hadoop-env.sh 文件中,找到文件中的第25行JAVA_HOME,将其更改为如下所示:保存退出即可。
7.2 core-site.xml:
core-site.xml 文件是Hadoop的核心配置文件,全部配置项可参考官方文档:
我是官方文档!
在这里需指定几个配置项,其中必须指定的是访问的端口;每一个配置项都有其默认值;配置信息如下:
<configuration>
<!-- Hadoop临时文件存放路径,默认在/tmp目录下 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop-2.10.1/data</value>
</property>
<!-- NameNode结点的URI(包括协议、主机名称、端口号) -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<!-- 设置文件文件删除后,被完全清空的时间,默认为0,单位为分钟 -->
<property>
<name>fs.trash.interval</name>
<value>60</value>
</property>
</configuration>
第一个配置项:指定的是hadoop临时文件存放的路径,比如在执行格式化操作之后,会生成一些跟集群相关的信息,如果不指定路径的话,这些信息默认会保存在 /tmp 目录下:
<!-- Hadoop临时文件存放路径,默认在/tmp目录下 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop-2.10.1/data</value>
</property>
第二个配置项:是namenode的一个访问协议,也是一个比较关键的配置项,包含协议,主机号,端口号等:
<!-- NameNode结点的URI(包括协议、主机名称、端口号) -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
第三个配置项:指定的是当文件删除之后,想让其保留多长时间;也就是开启了类似回收站的机制,默认是0min,指定时间之后就能在规定时间内在对应目录中找回文件:
<!-- 设置文件文件删除后,被完全清空的时间,默认为0,单位为分钟 -->
<property>
<name>fs.trash.interval</name>
<value>60</value>
</property>
vim 编辑 core-site.xml
文件:
7.3 hdfs-site.xml:
hdfs-site.xml 是跟HDFS相关的一个核心配置文件;其全部配置项可参考官方文档:我是官方文档!
在修改基本的配置文件:
<configuration>
<!-- 冗余存储--块存储份数,默认为3 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 关闭权限校验,开发学习时可开启,默认为true -->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<!-- namenode的http访问地址和端口 -->
<property>
<name>dfs.namenode.http-address</name>
<value>master:50070</value>
</property>
</configuration>
第一个配置项:Hadoop默认的块存储份数为3,Hadoop本身是一个全分布式的软件,设置冗余存储机制的目的和作用便是保证数据不丢失:
<!-- 块存储份数,默认为3 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
第二个配置项:这里将权限校验的功能关闭掉,避免之后用API的方式去进行调用的时候,不会出现一些权限相关的问题;但是当真正在工作时的生产环境中去部署的时候就不需要去添加此配置,默认为True,也就是默认是需要有相关的权限才能进行操作;
<!-- 关闭权限校验,开发学习时可开启,默认为true -->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
第三个配置项:namenode的http访问地址和端口可以手动进行指定,这里指定端口号为50070;这里需要注意的是,通常情况下端口号前填写的应该是ip地址,这里用了master进行了替代,这里能看出建立名称和ip地址的映射的必要性:
<!-- namenode的http访问地址和端口 -->
<property>
<name>dfs.namenode.http-address</name>
<value>master:50070</value>
</property>
vim 编辑 hdfs-site.xml
文件:
7.4 mapred-site.xml:
mapred-site.xml 是Hadoop计算功能模块相关配置文件,全部配置项可参考官方文档:我是官方文档!
直接指定执行任务的方式为YARN,这样一来,在控制台也就是网页当中可以看到整个的任务信息,默认的方式为local;
<configuration>
<!-- 设置运行MapReduce任务方式为yarn,默认为local,可选项还有classic -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
这里需要注意,mapred-site.xml
原来的配置文件的名称为mapred-site.xml.template
,这里需要先将其重命名为mapred-site.xml
:
vim 编辑mapred-site.xml
文件:
7.5 yarn-site.xml:
yarn-site.xml 是Yarn资源调度相关配置文件,比如说指定在进行任务运行的时候分配多大的内存,统一地由谁来调配;全部配置项可参考官方文档:我是官方文档!
具体配置项如下:
<configuration>
<!-- resourcemanager的主机名 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<!-- 暴露给客户端的主机名及端口号 -->
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<!-- 分配给容器的物理内存量,单位是MB,设置为-1则自动分配,默认8192MB -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1536</value>
</property>
<!-- NodeManager上运行的服务列表,可以配置成mapreduce_shuffle,多个服务使用逗号隔开 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
第一个配置项:指定资源统一由谁来进行调配,这里是 resourcemanager ;还有指定所在的机器,也就是计算的主体(主节点),这里是 master;
<!-- resourcemanager的主机名 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
第二个配置项:若是想要在从节点也可提交任务,可以配置如下信息,若是单单只是在主节点上提交任务的话,该项也可不配置:
<!-- 暴露给客户端的主机名及端口号 -->
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
第三个配置项:主要是对第三个配置项进行配置,分配给容器的物理内存量一般来说需要跟虚拟机的内存成正比,我的虚拟机的内存是2G,一般最多分配虚拟机内存的 3/4,我这里自然也就是分配了 2048 * 0.75 = 1536M的空间;分配的空间太多就可能对其他进程的运行造成影响了;小伙伴们可以根据自己虚拟机的实际情况是指定一下,设置为 -1则为自动分配,不设置默认为8192M;
<!-- 分配给容器的物理内存量,单位是MB,设置为-1则自动分配,默认8192MB -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1536</value>
</property>
第四个配置项:指定NodeManager
获取数据的方式,这里设置的是mapreduce_shuffle
,如果有多个,可以在value处用逗号分隔:
<!-- NodeManager上运行的服务列表,可以配置成mapreduce_shuffle,多个服务使用逗号隔开 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
vim 编辑yarn-site.xml
文件:
7.6 slaves:
slaves 是从节点配置文件,在slaves当中要配置它的从节点是哪个;当前是配置伪分布式,也就是说主节点跟从节点都是自己,所以将 slaves 文件中的localhost直接改成slave即可;如果希望主节点本身也提供数据存储和计算服务,则可以将主节点主机名也填上,如下图所示:
vim 编辑yarn-site.xml
文件:
HDFS及YARN环境搭建到此基本完成,接下来进行ssh相关操作。
至此,Hadoop的安装配置已经全部完成,接下来只需将jdk解压后的文件夹,hadoop解压后的文件夹及环境变量配置文件同步到slave主机上就可以了,也就是说两台主机的配置文件完全一样。在centos系统中已经默认安装并启动了ssh服务,首先需要先配置免密码登录,这样可以使发送文件和hadoop的使用更加方便。
8. ssh免密登录:
在centos系统中已经默认安装并启动了ssh服务,首先需要先配置免密码登录,这样可以使发送文件和hadoop的使用更加方便。
- ① 生成密钥:
[hadoop@master ~]$ ssh-keygen -t rsa
#整个过程一直回车即可
- ② 拷贝公钥:
# @前为用户名,@后为主机名,在主节点master上执行以下命令
[hadoop@master hadoop]$ ssh-copy-id hadoop@master
[hadoop@master hadoop]$ ssh-copy-id hadoop@slave
# 输入一次hadoop用户的密码即可通过验证
配置完成后,可以从主节点master免密登录到从节点slave,如果希望各主机之间都可以互相免密登录,则可以在所有主机上都执行上述操作。
测试免密登录:
[hadoop@master hadoop]$ ssh hadoop@slave
可以看到没有输入密码,免密登录配置成功:
9. scp跨主机传输配置文件:
需要cp的文件太多,这里可以编写一个简单的shell脚本来执行:
[hadoop@master hadoop]$ vim scp.sh
编写如下shell脚本:
# 拷贝JDK
scp -rf /home/hadoop/jdk1.8.0_251 hadoop@slave:/home/hadoop
# 拷贝Hadoop
scp -rf /home/hadoop/hadoop-2.10.1 hadoop@slave:/home/hadoop
# 拷贝环境变量配置文件,同名文件会自动覆盖
scp -rf /home/hadoop/.bash_profile hadoop@slave:/home/hadoop
使用bash来执行shell脚本:
[hadoop@master hadoop]$ bash scp.sh
执行完成后在slave主机上测试java -version
及hadoop version
:
打印出版本信息即说明配置移植成功。
注:hadoop集群操作均由master主机完成。
10. hadoop集群启动:
在hadoop集群启动之前,先做一个格式化的操作,格式化主要是去生成集群自己需要的信息,比如主节点的唯一id等,主要是通过id来确认哪些主机归集群管理,也就是说是通过id来与主机进行绑定和对应的;
10.1 格式化namenode:
第一次使用hadoop时需要进行初始化,该操作只需要执行一次,完成后会根据core-site.xml中的配置,在对应的目录下自动创建相应的文件夹:
[hadoop@master ~]$ hdfs namenode -format
此操作在之前指定的目录当中创建了一些文件:
10.2 启动Hadoop进程:
由于已经配置了环境变量,可以直接执行sbin目录下的脚本:start-all.sh
,如果需要停止可以执行 stop-all.sh
:
[hadoop@master ~]$ start-all.sh
生成一些日志的保存路径,只需将结尾的out改为log即可查看日志信息。
10.3 jps指令验证:
jps
为安装配置好JDK
环境后的命令,可以查看到当前用户下的Java
进程,如果无法正常使用需检查JDK
的环境变量配置:
[hadoop@master ~]$ jps
出现如下图所示的5个进程,证明成功(不包括jps
本身)。需要注意的是,如果进程在启动一小段时间之后自动消失则证明该进程存在问题,需要根据日志信息进行排查;
出现 namenode
主节点,数据存储服务相关的datanode
,以及SecondaryNameNode
;证明dfs正确。
出现 NodeManager
(运行在单个节点上的代理),ResourceManager
(是整个Yarn
集群中最重要的组件之一,其主要的功能包括ApplicationMaster
的管理);证明yarn
正确。
到这里说明主节点master的配置成功。
ssh免密登录到slave主机,执行jps
:
出现两个与从节点相关的进程datanode
,nodemanager
说明集群配置完成。
over~