Hadoop入门及安装

776 阅读21分钟

之前写过有关Hadoop入门及安装的相关博客,但总觉得缺点什么,这次通过这个博文,再梳理下Hadoop的相关概念及安装方式。

什么是Hadoop

我们生活在一个数据大爆炸的时代,数据飞快的增长,急需解决海量数据的存储和计算问题。
这个时候,Hadoop就应运而生了。
Hadoop是一个适合海量数据的分布式存储分布式计算的框架。
分布式存储,可以简单理解为存储数据的时候,数据不只存在一台机器上面,它会存在多台机器上面。
分布式计算简单理解,就是由很多台机器并行处理数据,咱们在写java程序的时候,写的一般都是单机的程序,只在一台机器上运行,这样程序的处理能力是有限的。
在这里先这样理解就可以,后面我们会详细分析。
Hadoop的作者是Doug Cutting,他在给这个框架起名字的时候是很偶然的,作者的孩子有一个毛绒象玩具,他孩子总是对着这个玩具叫 Hadoop、Hadoop、所以,作者就以此来命名了。

Hadoop发行版介绍

接下来看一下Hadoop的发行版,什么叫发行版呢?
举一个大家接触比较多的例子,
目前手机操作系统有两大阵营,一个是苹果的IOS,还有一个是谷歌的Android
IOS是闭源的,也就不存在多个发行版了,如果你基于IOS改造一下,弄一个新的手机系统出来,会被苹果告破产的。所以IOS是没有其它发行版的,只有官方这一个版本。
Android是开源的,所以基于这个系统,很多手机厂商都会对它进行封装改造,因为这些手机厂商会感觉原生的Android系统的界面看起来比较low,或者某一些功能不太适合中国人的使用习惯,所以他们就会进行改造,例如国内的魅族、小米、锤子这些手机厂商都基于Android打造了自己的手机操作系统,那这些就是Android系统的一些发行版。
那针对Hadoop也是一样的,目前Hadoop已经演变为大数据的代名词,形成了一套完善的大数据生态系统,并且Hadoop是Apache开源的,它的开源协议决定了任何人都可以对其进行修改,并作为开源或者商业版进行发布/销售。
所以目前Hadoop发行版非常的多,有华为发行版、Intel发行版、Cloudera发行版CDH、Hortonworks发行版HDP,这些发行版都是基于Apache Hadoop衍生出来的。
在这里我们挑几个重点的分析一下:

官方原生版本:Apache Hadoop

Apache是一个IT领域的公益组织,类似于红十字会,Apache这个组织里面的软件都是开源的,我们会学习原生的Hadoop,只要掌握了原生Hadoop使用,后期想要操作其它发行版的Hadoop也是很简单的,其它发行版都是会兼容原生Hadoop的,这一点大家不同担心。
原生Hadoop的缺点是没有技术支持,遇到问题需要自己解决,或者通过官网的社区提问,但是回复一般比较慢,也不保证能解决问题,还有一点就是原生Hadoop搭建集群的时候比较麻烦,需要修改很多配置文件,如果集群机器过多的话,针对运维人员的压力是比较大的,这块等后面我们自己在搭建集群的时候大家就可以感受到了。

Cloudera Hadoop(CDH)

注意了,CDH是一个商业版本,它对官方版本做了一些优化,提供收费技术支持,提供界面操作,方便集群运维管理。
CDH目前在企业中使用的还是比较多的,虽然CDH是收费的,但是CDH中的一些基本功能是不收费的,可以一直使用,高级功能是需要收费才能使用的,如果不想付费,也能凑合着使用。

HortonWorks(HDP)

它呢,是开源的,也提供的有界面操作,方便运维管理,一般互联网公司偏向于使用这个
注意了,再爆一个料,最新消息,目前HDP已经被CDH收购,都是属于一个公司的产品,后期HDP是否会合并到CDH中,还不得而知,具体还要看这个公司的运营策略了。
最终的建议:建议在实际工作中搭建大数据平台时选择 CDH或者HDP,方便运维管理,要不然,管理上千台机器的原生Hadoop集群,运维同学是会哭的。

Hadoop版本演变历史

目前Hadoop经历了三个大的版本 从1.x到2.x再到3.x
每一个大版本的升级都带来了一些质的提升,下面我们先从架构层面分析一下这三大版本的变更:
hadoop1.x:HDFS+MapReduce
hadoop2.x:HDFS+YARN+MapReduce
hadoop3.x:HDFS+YARN+MapReduce

Hadoop3.x的细节优化

1:最低Java版本要求从Java7变为Java8
2:在Hadoop 3中,HDFS支持纠删码,纠删码是一种比副本存储更节省存储空间的数据持久化存储方法,使用这种方法,相同容错的情况下可以比之前节省一半的存储空间
详细介绍在这里:
hadoop.apache.org/docs/r3.0.0…
3: Hadoop 2中的HDFS最多支持两个NameNode,一主一备,而Hadoop 3中的HDFS支持多个NameNode,一主多备
详细介绍在这里:
hadoop.apache.org/docs/r3.0.0…
4:MapReduce任务级本地优化,MapReduce添加了映射输出收集器的本地化实现的支持。对于密集型的洗牌操作(shuffle-intensive)jobs,可以带来30%的性能提升,
详细介绍在这里:
issues.apache.org/jira/browse…
5:修改了多重服务的默认端口,Hadoop2中一些服务的端口和Hadoop3中是不一样的
总结:
Hadoop 3和2之间的主要区别在于新版本提供了更好的优化和可用性
详细的优化点也可以参考官网内容:
hadoop.apache.org/docs/r3.0.0…

Hadoop三大核心组件介绍

Hadoop主要包含三大组件:HDFS+MapReduce+YARN
HDFS负责海量数据的分布式存储
MapReduce是一个计算模型,负责海量数据的分布式计算
YARN主要负责集群资源的管理和调度

伪分布集群安装

接下来首先看一下伪分布集群的安装,看一下这张图
这张图代表是一台Linux机器,也可以称为是一个节点,上面安装的有JDK环境
最上面的是Hadoop集群会启动的进程,其中NameNode、SecondaryNameNode、DataNode是HDFS服务的进程,ResourceManager、NodeManager是YARN服务的进程,MapRedcue在这里没有进程,因为它是一个计算框架,等Hadoop集群安装好了以后MapReduce程序可以在上面执行。
在安装集群之前需要先下载Hadoop的安装包,在这里我们使用hadoop3.2.0这个版本。
那我们来看一下,在Hadoop官网有一个download按钮,进去之后找到Apache release archive 链接,点击进去就可以找到各种版本的安装包了。

注意:如果发现这个国外的地址下载比较慢,可以使用国内的镜像地址下载,但是这些国内的镜像地址中提供的安装包版本可能不全,如果没有找到我们需要的版本,那还是要老老实实到官网下载。
这些国内的镜像地址里面不仅仅有Hadoop的安装包,里面包含了大部分Apache组织中的软件安装包
地址1:
mirror.bit.edu.cn/apache/
地址2:
mirrors.tuna.tsinghua.edu.cn/apache
安装包下载好了以后,我们就开始安装伪分布集群了。
在这里使用bigdata01这台机器

首先配置基础环境

ip、hostname、firewalld、ssh免密码登录、JDK
  • ip:设置静态ip
[root@bigdata01 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE="Ethernet" 
PROXY_METHOD="none" 
BROWSER_ONLY="no" 
BOOTPROTO="static" 
DEFROUTE="yes" 
IPV4_FAILURE_FATAL="no" 
IPV6INIT="yes" 
IPV6_AUTOCONF="yes" 
IPV6_DEFROUTE="yes" 
IPV6_FAILURE_FATAL="no" 
IPV6_ADDR_GEN_MODE="stable-privacy" 
NAME="ens33" 
UUID="9a0df9ec-a85f-40bd-9362-ebe134b7a100" 
DEVICE="ens33"
IPADDR=192.168.182.100 
GATEWAY=192.168.182.2 
DNS1=192.168.182.2
[root@bigdata01 ~]# service network restart 
Restarting network (via systemctl): [ OK ] 
[root@bigdata01 ~]# ip addr 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group def link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
inet 127.0.0.1/8 scope host lo 
valid_lft forever preferred_lft forever 
inet6 ::1/128 scope host 
valid_lft forever preferred_lft forever 
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state U 
link/ether 00:0c:29:9c:86:11 brd ff:ff:ff:ff:ff:ff 
inet 192.168.182.100/24 brd 192.168.182.255 scope global noprefixroute en 
valid_lft forever preferred_lft forever
inet6 fe80::c8a8:4edb:db7b:af53/64 scope link noprefixroute 
valid_lft forever preferred_lft forever
  • hostname:设置临时主机名和永久主机名
[root@bigdata01 ~]# hostname bigdata01 
[root@bigdata01 ~]# vi /etc/hostname 
bigdata01
  • firewalld:临时关闭防火墙+永久关闭防火墙
[root@bigdata01 ~]# systemctl stop firewalld 
[root@bigdata01 ~]# systemctl disable firewalld
  • ssh免密码登录 在这需要大致讲解一下ssh的含义,ssh 是secure shell,安全的shell,通过ssh可以远程登录到远程linux机器。
    我们下面要讲的hadoop集群就会使用到ssh,我们在启动集群的时候只需要在一台机器上启动就行,然后hadoop会通过ssh连到其它机器,把其它机器上面对应的程序也启动起来。
    但是现在有一个问题,就是我们使用ssh连接其它机器的时候会发现需要输入密码,所以现在需要实现ssh免密码登录。
    那有同学可能有疑问了,你这里说的多台机器需要配置免密码登录,但是我们现在是伪分布集群啊,只有一台机器。
    注意了,不管是几台机器的集群,启动集群中程序的步骤都是一样的,都是通过ssh远程连接去操作,就算是一台机器,它也会使用ssh自己连自己,我们现在使用ssh自己连自己也是需要密码的。

下面详细讲一下ssh免密码登录
ssh这种安全/加密的shell,使用的是非对称加密,加密有两种,对称加密和非对称加密。非对称加密的解密过程是不可逆的,所以这种加密方式比较安全。
非对称加密会产生秘钥,秘钥分为公钥和私钥,在这里公钥是对外公开的,私钥是自己持有的。
那么ssh通信的这个过程是,第一台机器会把自己的公钥给到第二台机器,
当第一台机器要给第二台机器通信的时候,
第一台机器会给第二台机器发送一个随机的字符串,第二台机器会使用公钥对这个字符串加密,
同时第一台机器会使用自己的私钥也对这个字符串进行加密,然后也传给第二台机器
这个时候,第二台机器就有了两份加密的内容,一份是自己使用公钥加密的,一份是第一台机器使用私钥加密传过来的,公钥和私钥是通过一定的算法计算出来的,这个时候,第二台机器就会对比这两份加密之后的内容是否匹配。如果匹配,第二台机器就会认为第一台机器是可信的,就允许登录。如果不相等 就认为是非法的机器。
下面就开始正式配置一下ssh免密码登录,由于我们这里要配置自己免密码登录自己,所以第一台机器和第二台机器都是同一台。
首先在bigdata01上执行 ssh-keygen -t rsa
rsa表示的是一种加密算法
注意:执行这个命令以后,需要连续按 4 次回车键回到 linux 命令行才表示这个操作执行 结束,在按回车的时候不需要输入任何内容。
执行以后会在~/.ssh目录下生产对应的公钥和秘钥文件

[root@bigdata01 ~]# ll ~/.ssh/ 
total 12 
-rw-------. 1 root root 1679 Apr 7 16:39 id_rsa 
-rw-r--r--. 1 root root 396 Apr 7 16:39 id_rsa.pub 
-rw-r--r--. 1 root root 203 Apr 7 16:21 known_hosts

下一步是把公钥拷贝到需要免密码登录的机器上面

[root@bigdata01 ~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

然后就可以通过ssh 免密码登录到bigdata01机器了

[root@bigdata01 ~]# ssh bigdata01 
Last login: Tue Apr 7 15:05:55 2020 from 192.168.182.1 
[root@bigdata01 ~]
  • JDK安装

安装Hadoop

  • 首先把hadoop的安装包上传到/home/software目录下
[root@bigdata01 software]# ll
total 527024 
-rw-r--r--. 1 root root 345625475 Jul 19 2019 hadoop-3.2.0.tar.gz 
drwxr-xr-x. 7 10 143 245 Dec 16 2018 jdk1.8 
-rw-r--r--. 1 root root 194042837 Apr 6 23:14 jdk-8u202-linux-x64.tar.gz
  • 解压hadoop安装包, 解压后移动到/usr/local/目录下。
[root@bigdata01 software]# tar -zxvf hadoop-3.2.0.tar.gz

hadoop目录下面有两个重要的目录,一个是bin目录,一个是sbin目录

我们看一下bin目录,这里面有hdfs,yarn等脚本,这些脚本后期主要是为了操作hadoop集群中的hdfs和yarn组件的
再来看一下sbin目录,这里面有很多start stop开头的脚本,这些脚本是负责启动 或者停止集群中的组件的。 因为我们会用到bin目录和sbin目录下面的一些脚本,为了方便使用,我们需要配置一下环境变量。

  • 修改Hadoop相关配置文件

    主要修改下面这几个文件:
hadoop-env.sh
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
workers

首先修改 hadoop-env.sh 文件,增加环境变量信息,添加到 hadoop-env.sh 文件末尾即可。
JAVA_HOME:指定java的安装位置
HADOOP_LOG_DIR:hadoop的日志的存放目录

export JAVA_HOME=/usr/java/jdk1.8
export HADOOP_LOG_DIR=/usr/local/hadoop_repo/logs/hadoop

修改 core-site.xml 文件
注意 fs.defaultFS 属性中的主机名需要和你配置的主机名保持一致

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://bigdata01:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/hadoop_repo</value>
    </property>
</configuration>

修改hdfs-site.xml文件,把hdfs中文件副本的数量设置为1,因为现在伪分布集群只有一个节点

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

修改mapred-site.xml,设置mapreduce使用的资源调度框架

<configuration>
   <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
   </property>
</configuration>

修改yarn-site.xml,设置yarn上支持运行的服务和环境变量白名单

<configuration>
   <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
   </property>
    <property>
     <name>yarn.nodemanager.env-whitelist</name>
    <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>
</configuration>

修改workers,设置集群中从节点的主机名信息,在这里就一台集群,所以就填写bigdata01即可

[root@bigdata01 hadoop]# vi workers 
bigdata01

配置文件到这就修改好了,但是还不能直接启动,因为Hadoop中的HDFS是一个分布式的文件系统,文件系统在使用之前是需要先格式化的,就类似我们买一块新的磁盘,在安装系统之前需要先格式化才可以使用。

  • 格式化HDFS
hdfs namenode -format

如果能看到successfully formatted这条信息就说明格式化成功了,如果提示错误,一般都是因为配置文件的问题,当然需要根据具体的报错信息去分析问题。
注意:格式化操作只能执行一次,如果格式化的时候失败了,可以修改配置文件后再执行格式化,如果格式化成功了就不能再重复执行了,否则集群就会出现问题。
如果确实需要重复执行,那么需要把/usr/local/hadoop_repo目录中的内容全部删除,再执行格式化
可以这样理解,我们买一块新磁盘回来装操作系统,第一次使用之前会格式化一下,后面你会没事就去格式化一下吗?肯定不会的,格式化之后操作系统又得重装了。

  • 启动伪分布集群 使用sbin目录下的start-all.sh脚本
[root@bigdata01 hadoop-3.2.0]# sbin/start-all.sh 
Starting namenodes on [bigdata01] 
ERROR: Attempting to operate on hdfs namenode as root ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation. Starting datanodes 
ERROR: Attempting to operate on hdfs datanode as root ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation. Starting secondary namenodes [bigdata01] 
ERROR: Attempting to operate on hdfs secondarynamenode as root ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operatioStarting resourcemanager 
ERROR: Attempting to operate on yarn resourcemanager as root ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation. Starting nodemanagers 
ERROR: Attempting to operate on yarn nodemanager as root 
ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting operation.

执行的时候发现有很多ERROR信息,提示缺少HDFS和YARN的一些用户信息。
解决方案如下:
修改sbin目录下的start-dfs.sh,stop-dfs.sh这两个脚本文件,在文件前面增加如下内容

HDFS_DATANODE_USER=root 
HDFS_DATANODE_SECURE_USER=hdfs 
HDFS_NAMENODE_USER=root 
HDFS_SECONDARYNAMENODE_USER=root

修改sbin目录下的start-yarn.sh,stop-yarn.sh这两个脚本文件,在文件前面增加如下内容

YARN_RESOURCEMANAGER_USER=root 
HADOOP_SECURE_DN_USER=yarn 
YARN_NODEMANAGER_USER=root

再启动集群成功

  • 验证集群进程信息
    执行jps命令可以查看集群的进程信息,去掉Jps这个进程之外还需要有5个进程才说明集群是正常启动的

    还可以通过webui界面来验证集群服务是否正常
    HDFS webui界面:
    http://192.168.182.100:9870
    YARN webui界面:
    http://192.168.182.100:8088
  • 停止集群
[root@bigdata01 hadoop-3.2.0]# sbin/stop-all.sh

分布式集群安装

  • 环境准备 伪分布集群搞定了以后我们来看一下真正的分布式集群是什么样的
    看一下这张图,图里面表示是三个节点,左边这一个是主节点,右边的两个是从节点,hadoop集群是支持主从架构的。
    不同节点上面启动的进程默认是不一样的。
    下面我们就根据图中的规划实现一个一主两从的hadoop集群
    环境准备:三个节点
    bigdata01 192.168.182.100
    bigdata02 192.168.182.101
    bigdata03 192.168.182.102
    注意:每个节点的基础环境都要先配置好,先把ip、hostname、firewalld、ssh免密码登录、JDK这些基础环境配置好

先把bigdata01中之前安装的hadoop删掉,删除解压的目录,修改环境变量即可。
假设我们现在已经具备三台linux机器了,里面都是全新的环境。
下面开始操作。
注意:针对这三台机器的ip、hostname、firewalld、JDK这些基础环境的配置步骤在这里就不再记录了,具体步骤参考之前的步骤。
bigdata01
bigdata02
bigdata03
这三台机器的ip、hostname、firewalld、ssh免密码登录、JDK这些基础环境已经配置ok。
这些基础环境配置好以后还没完,还有一些配置需要完善。
配置/etc/hosts
因为需要在主节点远程连接两个从节点,所以需要让主节点能够识别从节点的主机名,使用主机名远程访问,默认情况下只能使用ip远程访问,想要使用主机名远程访问的话需要在节点的/etc/hosts文件中配置对应机器的ip和主机名信息。
所以在这里我们就需要在bigdata01的/etc/hosts文件中配置下面信息,最好把当前节点信息也配置到里面,这样这个文件中的内容就通用了,可以直接拷贝到另外两个从节点

[root@bigdata01 ~]# vi /etc/hosts 
192.168.182.100 bigdata01 
192.168.182.101 bigdata02
192.168.182.102 bigdata03
[root@bigdata02 ~]# vi /etc/hosts 
192.168.182.100 bigdata01 
192.168.182.101 bigdata02
192.168.182.102 bigdata03
[root@bigdata03 ~]# vi /etc/hosts 
192.168.182.100 bigdata01 
192.168.182.101 bigdata02
192.168.182.102 bigdata03
  • 集群节点之间时间同步 集群只要涉及到多个节点的就需要对这些节点做时间同步,如果节点之间时间不同步相差太多,会应该集群的稳定性,甚至导致集群出问题。
    使用ntpdate -u ntp.sjtu.edu.cn实现时间同步,但是执行的时候提示找不到ntpdata命令
[root@bigdata01 ~]# ntpdate -u ntp.sjtu.edu.cn 
-bash: ntpdate: command not found

默认是没有ntpdate命令的,需要使用yum在线安装,执行命令 yum install -y ntpdate
然后手动执行
ntpdate -u ntp.sjtu.edu.cn
确认是否可以正常执行
建议把这个同步时间的操作添加到linux的crontab定时器中,每分钟执行一次

[root@bigdata01 ~]# vi /etc/crontab 
* * * * * root /usr/sbin/ntpdate -u ntp.sjtu.edu.cn

然后在bigdata02和bigdata03节点上配置时间同步
在bigdata02节点上操作

[root@bigdata02 ~]# yum install -y ntpdate 
[root@bigdata02 ~]# vi /etc/crontab 
* * * * * root /usr/sbin/ntpdate -u ntp.sjtu.edu.cn

在bigdata03节点上操作

[root@bigdata03 ~]# yum install -y ntpdate 
[root@bigdata03 ~]# vi /etc/crontab 
* * * * * root /usr/sbin/ntpdate -u ntp.sjtu.edu.cn
  • SSH免密码登录完善 注意:针对免密码登录,目前只实现了自己免密码登录自己,最终需要实现主机点可以免密码登录到所有节点,所以还需要完善免密码登录操作。
    首先在bigdata01机器上执行下面命令,将公钥信息拷贝到两个从节点
[root@bigdata01 ~]# scp ~/.ssh/authorized_keys bigdata02:~/ 
[root@bigdata01 ~]# scp ~/.ssh/authorized_keys bigdata03:~/ 

然后在bigdata02和bigdata03上执行

[root@bigdata02/3 ~]# cat ~/authorized_keys >> ~/.ssh/authorized_keys

验证一下效果,在bigdata01节点上使用ssh远程连接两个从节点,如果不需要输入密码就表示是成功的,此时主机点可以免密码登录到所有节点。

[root@bigdata01 ~]# ssh bigdata02 
Last login: Tue Apr 7 21:33:58 2020 from bigdata01 
[root@bigdata02 ~]# exit 
logout Connection to bigdata02 closed. 
[root@bigdata01 ~]# ssh bigdata03
Last login: Tue Apr 7 21:17:30 2020 from 192.168.182.1 
[root@bigdata03 ~]# exit logout Connection to bigdata03 closed.
[root@bigdata01 ~]#

有没有必要实现从节点之间互相免密码登录呢?
这个就没有必要了,因为在启动集群的时候只有主节点需要远程连接其它节点。

  • 安装Hadoop OK,那到这为止,集群中三个节点的基础环境就都配置完毕了,接下来就需要在这三个节点中安装Hadoop了。
    首先在bigdata01节点上安装。
    1:把hadoop-3.2.0.tar.gz安装包上传到linux机器的/home/software目录下
    2:解压hadoop安装包
    3:修改hadoop相关配置文件
    进入配置文件所在目录
[root@bigdata01 soft]# cd hadoop-3.2.0/etc/hadoop/ 
[root@bigdata01 hadoop]#

首先修改hadoop-env.sh文件,在文件末尾增加环境变量信息

[root@bigdata01 hadoop]# vi hadoop-env.sh 
export JAVA_HOME=/usr/java/jdk1.8 
export HADOOP_LOG_DIR=/data/hadoop_repo/logs/hadoop

修改core-site.xml文件,注意fs.defaultFS属性中的主机名需要和主节点的主机名保持一致

[root@bigdata01 hadoop]# vi core-site.xml
<configuration>
<property> 
  <name>fs.defaultFS</name> 
  <value>hdfs://bigdata01:9000</value> 
</property>
<property> 
  <name>hadoop.tmp.dir</name>
  <value>/usr/local/hadoop_repo</value> 
</property> 
</configuration>

修改hdfs-site.xml文件,把hdfs中文件副本的数量设置为2,最多为2,因为现在集群中有两个从节点,还有secondaryNamenode进程所在的节点信息

[root@bigdata01 hadoop]# vi hdfs-site.xml 
<configuration>
  <property> 
    <name>dfs.replication</name> 
    <value>2</value> 
  </property> 
  <property> 
    <name>dfs.namenode.secondary.http-address</name> 
    <value>bigdata01:50090</value> 
  </property>
</configuration>

修改mapred-site.xml,设置mapreduce使用的资源调度框架

[root@bigdata01 hadoop]# vi mapred-site.xml 
<configuration> 
  <property> 
      <name>mapreduce.framework.name</name> 
      <value>yarn</value>
  </property> 
</configuration>

修改yarn-site.xml,设置yarn上支持运行的服务和环境变量白名单
注意,针对分布式集群在这个配置文件中还需要设置resourcemanager的hostname,否则nodemanager找不到resourcemanager节点。

[root@bigdata01 hadoop]# vi yarn-site.xml 
<configuration> 
  <property> 
      <name>yarn.nodemanager.aux-services</name> 
      <value>mapreduce_shuffle</value> 
  </property> 
  <property> 
      <name>yarn.nodemanager.env-whitelist</name>  
      <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
  </property> 
  <property> 
      <name>yarn.resourcemanager.hostname</name> 
      <value>bigdata01</value>
  </property> 
</configuration>

修改worker配置

[root@bigdata01 hadoop]# vi workers 
bigdata02 
bigdata03

修改启动脚本
修改 start-dfs.sh , stop-dfs.sh 这两个脚本文件,在文件前面增加如下内容

HDFS_DATANODE_USER=root 
HDFS_DATANODE_SECURE_USER=hdfs 
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

修改 start-yarn.sh , stop-yarn.sh 这两个脚本文件,在文件前面增加如下内容

YARN_RESOURCEMANAGER_USER=root 
HADOOP_SECURE_DN_USER=yarn 
YARN_NODEMANAGER_USER=root
  • 把bigdata01节点上将修改好配置的安装包拷贝到其他两个从节点
[root@bigdata01 sbin]# cd /usr/local/ 
[root@bigdata01 soft]# scp -rq hadoop-3.2.0 bigdata02:/usr/local/  //注意:q指不显示进度条
[root@bigdata01 soft]# scp -rq hadoop-3.2.0 bigdata03:/usr/local/ 
  • 在bigdata01节点上格式化HDFS
[root@bigdata01 hadoop-3.2.0]# hdfs namenode -format

如果在后面的日志信息中能看到这一行,则说明namenode格式化成功。

Storage: Storage directory /usr/local/hadoop_repo/dfs/name has been successfully formatted.
  • 启动集群,在bigdata01节点上执行下面命令
[root@bigdata01 hadoop-3.2.0]# sbin/start-all.sh
  • 验证集群 分别在3台机器上执行jps命令,进程信息如下所示:
    在bigdata01节点执行
[root@bigdata01 hadoop-3.2.0]# jps 
6128 NameNode 
6621 ResourceManager 
6382 SecondaryNameNode

在bigdata02节点执行

[root@bigdata02 ~]# jps 
2385 NodeManager 
2276 DataNode

在bigdata03节点执行

[root@bigdata03 ~]# jps 
2385 NodeManager 
2276 DataNode
  • 停止集群 在bigdata01节点上执行停止命令
[root@bigdata01 hadoop-3.2.0]# sbin/stop-all.sh

至此,hadoop分布式集群安装成功!

Hadoop的客户端节点

在实际工作中不建议直接连接集群中的节点来操作集群,直接把集群中的节点暴露给普通开发人员是不安全的
建议在业务机器上安装Hadoop,只需要保证业务机器上的Hadoop的配置和集群中的配置保持一致即可,这样就可以在业务机器上操作Hadoop集群了,此机器就称为是Hadoop的客户端节点
Hadoop的客户端节点可能会有多个,理论上是我们想要在哪台机器上操作hadoop集群就可以把这台机器配置为hadoop集群的客户端节点。 注意客户端节点hadoop不要启动,仅作客户端使用。