Hadoop篇:Hadoop集群安装
规划
在搭建Hadoop集群前,我们肯定需要先规划一下集群的各个节点安装的组件。如果你是伪分布式或单机模式,则不需要遵循任何规则,可以随意安装各个组件。如果你是完全分布式,则必须遵循以下规则:
NameNode和SecondaryNameNode不要安装在同一台节点上
ResourceManager建议不要和NameNode、SecondaryNameNode安装在同一台节点
为什么NameNode不和SecondaryNameNode安装在同一台节点上?
先来说说NameNode,NameNode会对文件系统的改动情况追加到一个日志文件(edits)中,并保存到本地的文件系统上。当启动一个NameNode时,它首先会从一个映像文件(fsimage)中读取HDFS的状态,接着应用日志文件中的edits操作,然后将新的HDFS状态写入映像文件(fsimage)中,并使用一个空的日志文件(edits)开始正常操作。
由于NameNode只有在启动的时候才会合并映像文件(fsimage)和日志文件(edits),因此随着时间的不断增加,日志文件(edits)的大小肯定会变得很庞大,尤其是对于大型的集群。我们可以想象一下,如果日志文件(edits)很大,那么在下一次NameNode的启动花费的时间肯定也会很长了。
说完了NameNode,再来说说SecondaryNameNode。
SecondaryNameNode会定期的合并映像文件(fsimage)和日志文件(edits),将日志文件(edits)的大小控制在一个程度内。这种合并对内存的需要和NameNode基本一致,为了不影响到集群的整体性能,就肯定需要分开这两个服务了。
为什么ResourceManager与NameNode、SecondaryNameNode不安装在同一台节点上?
我们先想想Yarn-ResourceManager的作用是什么?它是负责整个集群的资源管理和调度的,跟其他两个可能会耗费内存较高的放一起,就有可能引起资源争用。
安装
以下为本次完全分布式各个节点上组件的安装情况:
HOST hadoop-85 hadoop-86 hadoop-87
HDFS NameNode/DataNode DataNode SecondaryNameNode/DataNode
YARN NodeManager ResourceManager/NodeManager NodeManager
准备
在安装之前,我们肯定需要先下载Hadoop安装包和Jar包。Hadoop在之前有三个使用较多的版本,分别是:
- Apache 由社区维护的一个最基础的版本,免费开源。
- Cloudera Cloudera公司在开源版本的基础上集成了很多的框架,能够让我们在安装和维护上非常的简单,但它是收费版本。
- Hortonworks Hortonworks公司同样在开源版本的基础上集成了很多的框架,能够让我们在安装和维护上非常的简单,同样是收费版本。
在后来,Cloudera和Hortonworks宣布合并后,目前能够使用的就只有两个版本。一个是Apache的免费开源版本,另一个是Cloudera的收费版本。
由于我只是个人学习使用,下载的肯定是Apache版本,下载地址如下:
下载地址:Hadoop官网下载(https://hadoop.apache.org/releases.html)
下载时,我们要选择二进制包,左边的那个是源码包,注意可别下错了。
开始下载后,我们可以利用下载的时间简单看下Hadoop所需要的Java版本,尽量避免因版本不匹配导致的报错。 下载地址:Hadoop需要的Java版本(https://cwiki.apache.org/confluence/display/HADOOP/Hadoop+Java+Versions) 从图中可以看到,Hadoop3.3版本需要使用Java8或者Java11,但编译时只能使用Java8,为了省去麻烦,我们直接去Oracle官网下载Java8版本即可,如果没有Oracle账号,则可以百度搜一个。 下载地址:官网下载Java8(https://www.oracle.com/java/technologies/downloads/)
耐心等待下载完成即可。
开始
准备好安装包后,我们就开始安装了。由于我这里三台服务器已经安装好了,就不再按照克隆虚拟机的方式更快的搭建了。建议如果你有虚拟机控制台权限,可以直接配置好一台模板机,然后直接克隆两台虚拟机,再配置下参数就可以了。
1、配置主机名及ip映射
在修改主机名这里,建议大家将每台服务器的主机名改的有辨识度,例如我这里是hadoop加上“-”再加上ip的最后地址,如:hadoop-85。
1.1、修改主机名
【全部节点执行】 以hadoop-85为例,其他节点就改为相应得主机名
shell [root@localhost ~]# hostnamectl set-hostname hadoop-85
1.2、修改IP映射
修改IP映射是为了让我们能够用主机名去访问另一台主机,而不是使用ip地址连接。我的理解是这样,你在访问hadoop-86时,它会先去/etc/hosts下去查找有没有对应主机名对应的ip地址,如果有,则使用这个ip地址进行通信,否则,则会报错。注意,需要跟你的实际IP和主机名去修改,我这里只是参考。如果你有四台节点,就需要写四条记录。
【全部节点执行】 三台节点都需要配置此项,让每台节点都能通过主机名进行通信。
shell [root@localhost ~]# vim /etc/hosts 192.168.3.85 hadoop-85 192.168.3.86 hadoop-86 192.168.3.87 hadoop-87
1.3、重启全部节点
【全部节点执行】
shell [root@localhost ~]# reboot
2、配置时间同步
如果你三台节点都能够访问外网,就不需要配置时间同步(可以跳过此步骤);否则,请选择一台节点作为基准服务器,让其他两台服务器每分钟同步一次它的时间。配置时间同步的目的是为了让你的集群分配任务时不会因为各个节点的时间不同,导致并行计算时没有分配到合理的资源。
2.1、检查ntp服务是否安装
首先检查全部节点上有没有安装ntp服务
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# rpm -qa | grep ntp
2.2、安装ntp
从上一步看到没有ntp服务后,我们就需要安装ntp服务了。如果你的节点上有ntp,则不需要再安装。由于服务器是内网,没有办法直接从网上下载,我们就需要找一台有网络的电脑从网上下载rpm包上传到服务器中再安装。 下载网址:rpm包下载(https://pkgs.org/)
下载包名:
- ntp
- autogen-libopts
注意,在下载时要仔细核对CPU架构和操作系统,别下载错了。例如我这里是CentOS7 x86的系统,所以我就下载以.el7.x86_64.rpm结尾的依赖包。 下载完后使用工具将其上传到还没有安装ntp的节点上安装。
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# rpm -ivh autogen-libopts-5.18-5.el7.x86_64.rpm ntp-4.2.6p5-29.el7.centos.2.x86_64.rpm
2.3、配置基准服务器
全部节点都确认有安装或安装完ntp之后,就选一台节点配置基准服务器,我这里选的是【hadoop-85】节点。
【hadoop-85】
shell [root@hadoop-85 ~]# vim /etc/ntp.conf
```shell
Hosts on local network are less restricted.
restrict 192.168.3.0 mask 255.255.255.0 nomodify notrap
Use public servers from the pool.ntp.org project.
Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
server 127.127.1.0 fudge 127.127.1.0 stratum 10 ```
说明:
这里是设置允许网段3上的所有节点允许和85进行通信,也可以理解为校准
这里注释掉是为了不使用外网的一个服务。
这里新增两条记录是为了当该节点的丢失网络连接(内网网络出现问题),也能使用本地时间作为时间服务器为集群中的其它节点提供时间同步。
shell [root@hadoop-85 ~]# vim /etc/sysconfig/ntpd SYNC_HWCLOCK=yes
说明:
- SYNC_HWCLOCK 同步主机的硬件时间
2.4、重启ntp
配置好基准服务器,我们重启一下ntp,让刚刚修改的配置生效。 【hadoop-85】
shell [root@hadoop-85 ~]# systemctl start ntpd
2.5、配置其他节点
配置好基准服务器之后,我们就需要配置其他节点上的定时任务,让它们能够定时去跟基准服务器进行时间校准。注意,在配置其他两个节点之前,如果你的其它节点上的ntp是启动的,则必须要先关闭。由于我们这里是全部重新安装的,肯定没有启动,就不需要关闭了。
【除基准服务器外的全部节点执行】 以hadoop-86节点为例
shell [root@hadoop-86 ~]# crontab -e
shell */1 * * * * /usr/sbin/ntpdate hadoop-85
说明:
此句表示每分钟同步一次【hadoop-85】服务器的时间
配置好之后,可以自己修改个服务器时间,然后等待一分钟看看是否会生效,没有生效就按上面的步骤去检查配置是否正确。
3、关闭并禁用firewalld和selinux
在大数据库Hadoop的搭建中,建议是关闭firewalld和selinux,并且禁用firewalld自启动。因为在企业中,就算是为了安全考虑,他们也不会在每台大数据节点上做firewalld限制,通常会在局域网上做规则和拦截。
3.1、关闭firewalld
【全部节点执行】 以hadoop-85节点为例
shell [root@hadoop-85 ~]# systemctl stop firewalld
3.2、禁用firewalld自启动
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# systemctl disable firewalld
3.3、禁用selinux
禁用selinux非常简单,只需要将/etc/selinux/config文件里的SELINUX参数改为disabled就可以了,不过这种修改需要重启服务器才会生效。
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# vim /etc/selinux/config SELINUX=disabled
3.4、重启服务器
这里重启服务器是为了让刚刚配置的selinux生效。
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# reboot
4、创建用户及密码
关闭firewalld和selinux后,我们就可以开始创建用户了,此用户主要是用来管理Hadoop集群。
4.1、创建用户
用户名根据自己的实际情况命名,我这里为了简单直接,就将其命名成hadoop。
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# useradd hadoop
4.2、修改密码
创建完用户,还需要给用户设置一个密码,所有节点可以一样,也可以不一样,根据自己的情况评估。
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# passwd hadoop
5、创建目录及授权
创建完用户之后,我们就需要创建一个Hadoop集群目录,方面我们后续维护和使用。注意,此目录必须要选择磁盘空间大的位置创建,并且不建议在根目录和用户目录上创建。由于,我这里是虚拟机,就还是创建在了根目录。
5.1、创建软件目录
创建软件目录是为了能够将所有的软件安装包放在这里,避免软件包乱放位置,后期查找困难。
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# mkdir -p /opt/software
5.2、授权软件目录给用户
创建好软件目录后,我们需要将目录的属主给到hadoop用户。
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# chown -R hadoop:hadoop /opt/software
5.3、创建模块目录
创建此目录是为了将所有软件都解压到这里,方便管理。
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# mkdir -p /opt/module
5.4、授权模块目录给用户
同理,此目录也需要授权给hadoop用户。
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# chown -R hadoop:hadoop /opt/module
6、卸载自带的java
CentOS操作系统默认会安装一个java版本,CentOS7的好像是1.8,虽然都是1.8版本,但我们使用不使用它自带的版本,就直接卸载了它。
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# yum remove java*
7、上传并解压hadoop和java包
卸载完自带的java后,我们使用连接工具将包上传到刚刚software目录中。上传之后,我们就将其解压到/opt/module目录下。
7.1、解压hadoop二进制包
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# tar xvf /opt/software/hadoop-3.3.1.tar.gz -C /opt/module
7.2、授权Hadoop解压目录
为了防止上传之后目录的属主不对,我们对hadoop解压的目录进行授权。
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# chown -R hadoop:hadoop /opt/module/hadoop-3.3.1
7.3、解压java二进制包
解压完hadoop的tar包,我们再解压java的tar包。
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# tar xvf /opt/software/jdk-8u311-linux-x64.tar.gz -C /opt/module
7.4、授权Java解压目录
同样,为了防止上传之后目录的属主不对,我们也需要对Java解压的目录进行授权。
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# chown -R hadoop:hadoop /opt/module/jdk1.8.0_311
8、配置Hadoop和Java环境变量
hadoop和java都解压之后,还需要配置环境变量,让我们能够在hadoop用户的任何目录都能执行hadoop和java的命令。如果你之前配置环境变量是在/etc/profile下新增,那么现在我教一个新方法。在/etc/profile文件中有一段代码,它会遍历执行/etc/profile.d目录下的所有.sh文件。因此,我们在/etc/profile.d目录下创建一个属于自己的环境变量即可。
8.1、新增Hadoop和Java环境变量
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# vim /etc/profile.d/my_env.sh
```shell
JAVA_HOME
export JAVAHOME=/opt/module/jdk1.8.0311 export PATH=$PATH:$JAVA_HOME/bin
HADOOP_HOME
export HADOOPHOME=/opt/module/hadoop-3.3.1 export PATH=$PATH:$HADOOPHOME/bin export PATH=$PATH:$HADOOP_HOME/sbin ```
8.2、生效环境变量
配置好后,我们执行命令让刚刚的配置生效。
【全部节点执行】 以hadoop-85为例
shell [root@hadoop-85 ~]# source /etc/profile
8.3、测试Hadoop
【全部节点执行】 以hadoop-85为例
shell [hadoop@hadoop-85 ~]$ hadoop
从图中可以看到hadoop执行成功了。
8.4、测试Java
【全部节点执行】 以hadoop-85为例
shell [hadoop@hadoop-85 ~]$ java
从图中可以看到java也执行成功了。
9、xysnc分发脚本
分发脚本,其实就是利用rsync命令做的一个同步脚本。因为以后我们可能还需要配置或者上传很多的文件,难道每台服务器都需要执行这种命令?有了这个脚本之后我们只需要上传到一台服务器之后,然后执行脚本就会自动分发到其他节点上了。
9.1、检测rsync是否存在
因为分发脚本需要全部节点都安装rsync,所以我们接下来就检查rsync是否有安装。
【全部节点执行】 以hadoop-85为例
shell [hadoop@hadoop-85 ~]$ rpm -qa | grep rsync
从图中看到已经安装了rsync了。如果这里没有任何输出,说明没有安装rsync,那么你必须要下载rsync安装到此节点上。
9.2、新增xsync脚本
为了能随时随地的使用分发脚本,我们需要将脚本放到/home/hadoop/bin目录下才行,但这里如果直接使用hadoop用户,可能没有权限在bin目录下创建脚本,所以直接使用root用户执行。使用分发脚本的目的就是为了同步文件方便,所以我们这里只在hadoop-85节点上创建,创建完后使用脚本将整个文件给分发到其它节点上。
【hadoop-85】 根据你的实际节点主机名去修改此脚本,修改只需要改host in 后面的主机名即可。
shell [root@hadoop-85 ~]# vim /home/hadoop/bin/xsync
```shell
!/bin/bash
if [ $# -lt 1 ] then echo Not Enough Arguement! exit; fi
for host in hadoop-85 hadoop-86 hadoop-87 do echo =========================$host================
for file in $@ do
if [ -e $file ]
then
pdir=$(cd -P $(dirname $file); pwd)
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done done ```
9.3、授权脚本可执行权限
创建完脚本后,执行授权,让所有用户都有可执行的权限。
【hadoop-85】
shell [root@hadoop-85 ~]# chmod +x /home/hadoop/bin/xsync
9.4、测试脚本并分发到其他节点
授完权限后,我们再切换到hadoop用户,执行脚本,将整个bin目录分发到其他节点上。
【hadoop-85】
shell [hadoop@hadoop-85 ~]$ xsync bin/xsync
9.5、查看其他节点的脚本
分发完成后,我们检查一下是不是真的分发了。
【hadoop-86】
shell [hadoop@hadoop-86 ~]$ ll
从图中看到hadoop-86节点上已经有bin目录了。
【hadoop-87】
shell [hadoop@hadoop-87 ~]$ ll
从图中看到hadoop-87节点上也有bin目录了。
10、配置ssh免密登录
刚刚我们测试了一下分发脚本,是不是发现分发的时候必须输入其他节点hadoop用户的密码才行,以后每次节点通信都要输入,节点少还好,当节点是几十台甚至几百台的时候,你又要输入多久。为了避免每次分发文件都需要输入密码,我们配置免密登录。
以下为免密登录的原理图:
10.1、生成公钥和私钥
使用命令会生成一个公钥文件和一个私钥文件。
【全部节点执行】 以hadoop-85为例
shell [hadoop@hadoop-85 ~]$ ssh-keygen -t rsa
从图中看到已经生成了公钥和私钥文件
10.2、拷贝公钥至全部节点上
将生成的公钥拷贝到全部节点中,注意,拷贝时也要将拷贝一份公钥到当前的服务器中。
【全部节点执行】 以hadoop-85为例
shell [hadoop@hadoop-85 ~]$ ssh-copy-id hadoop-85
shell [hadoop@hadoop-85 ~]$ ssh-copy-id hadoop-86
shell [hadoop@hadoop-85 ~]$ ssh-copy-id hadoop-87
11、集群参数配置
配置好免密登录后,我们就需要真正的开始配置hadoop参数了。
11.1、配置【hadoop-85】节点
shell [hadoop@hadoop-85 ~]$ vim /opt/module/hadoop-3.3.1/etc/hadoop/core-site.xml
```shell fs.defaultFS hdfs://192.168.3.85:8020
hadoop.tmp.dir /opt/module/hadoop-3.3.1/data
hadoop.http.staticuser.user hadoop ```
说明:
- fs.defaultFS 指定NameNode的地址
- hadoop.tmp.dir 指定集群数据的存储位置
- hadoop.http.staticuser.user 指定hdfs网页登录时使用的用户名
shell [hadoop@hadoop-85 ~]$ vim /opt/module/hadoop-3.3.1/etc/hadoop/hdfs-site.xml
```shell dfs.namenode.http-address 192.168.3.85:9870
dfs.namenode.secondary.http-address 192.168.3.87:9868 ```
说明:
- dfs.namenode.http-address 指定NameNode的网页访问地址
- dfs.namenode.secondary.http-address 指定secondarynamenode,也就是2nn的网页访问地址
shell [hadoop@hadoop-85 ~]$ vim /opt/module/hadoop-3.3.1/etc/hadoop/yarn-site.xml
```shell yarn.nodemanager.aux-services mapreduce_shuffle
yarn.resourcemanager.hostname 192.168.3.86
yarn.nodemanager.env-whitelist JAVA HOME,HADOOPCOMMON HOME,HADOOPHDFS HOME,HADOOPCONF DIR,CLASSPATHPREPEND DISTCACHE,HADOOPYARN HOME,HADOOPMAPRED_HOME
yarn.log-aggregation-enable true
yarn.log.server.url http://192.168.3.85:19888/jobhistory/logs
yarn.log-aggregation.retain-seconds 604800
```
说明:
- yarn.nodemanager.aux-services
- yarn.resourcemanager.hostname 指定ResourceName的地址
- yarn.nodemanager.env-whitelist 指定容器可能覆盖的环境变量
- yarn.log-aggregation-enable 开启日志聚集功能
- yarn.log.server.url 指定日志聚集服务器的网页访问地址
- yarn.log-aggregation.retain-seconds 指定日志保留的时间,单位秒
shell [hadoop@hadoop-85 ~]$ vim /opt/module/hadoop-3.3.1/etc/hadoop/mapred-site.xml
```shell mapreduce.framework.name yarn
mapreduce.jobhistory.address 192.168.3.85:10020
mapreduce.jobhistory.webapp.address 192.168.3.85:19888 ```
说明:
- mapreduce.framework.name 指定运行MapReduce任务的框架,可以时local、classic和yarn
- mapreduce.jobhistory.address 指定历史服务器的地址
- mapreduce.jobhistory.webapp.address 指定历史服务器的网页访问地址
shell [hadoop@hadoop-85 ~]$ vim /opt/module/hadoop-3.3.1/etc/hadoop/workers hadoop-85 hadoop-86 hadoop-87
11.2、分发到其他节点
【hadoop-85】
shell [hadoop@hadoop-85 ~]$ xsync /opt/module/hadoop-3.3.1/etc/hadoop
12、初始化集群
【hadoop-85】
shell [hadoop@hadoop-85 ~]$ hdfs namenode -format
13、启动集群
13.1、启动历史服务器
【hadoop-85】
shell [hadoop@hadoop-85 ~]$ mapred --daemon start historyserver
13.2、启动集群
【hadoop-85】
shell [hadoop@hadoop-85 ~]$ start-dfs.sh
13.3、启动yarn
【hadoop-86】
shell [hadoop@hadoop-86 ~]$ start-yarn.sh
还没有评论,来说两句吧...