Hadoop环境的安装

x33g5p2x  于2020-09-02 发布在 Hadoop  
字(12.5k)|赞(0)|评价(0)|浏览(904)

1、 Hadoop初识

Hadoop基本架构:Hadoop由两部分组成,分别是分布式文件系统HDFS和分布式计算框架MapReduce。其中,分布式文件系统主要用于大规模数据的分布式存储,而MapReduce则构建在分布式文件系统之上,对存储在分布式文件系统中的数据进行分布式计算。
在Hadoop中,MapReduce底层的分布式文件系统是独立模块,用户按照约定的一套接口实现自己的分布式文件系统,然后经过简单的配置后,存储在该文件系统上的数据便可以被MapReduce处理。Hadoop默认使用的分布式文件系统是HDFS,它与MapReduce框架紧密结合。

A、什么是HDFS?

分布式文件系统(DistributedFile System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式,一个典型的网络可能包括多个供多用户访问的服务器。

下图简单描绘了HDFS文件系统(Hadoop Distributed File System)的整个架构体系。HDFS是一个主从结构,一个HDFS集群是由一个名称节点(它是一个管理文件命名空间和调节客户端访问文件的主服务器),当然还有一些数据节点(通常是一个节点一个机器,用来管理对应节点的存储)组成。

需要注意的几个知识点:

1) HDFS中保存的是数据块(block),在1.x版本上默认是64M,在2.x版本上默认是128M;
2) 当客户端上传的数据大小超过数据块128M的大小时,会被切分为多个数据块进行上传,不足128M的作为一个数据块上传,占据一个数据块大小;
3) HDFS文件系统具有非常好的扩展性,当存储容量不足时,可方便地扩增硬盘数量;
4) 为了保证分布式文件系统的数据安全性,采用数据冗余的方法,在HDFS中数据块的冗余度一般设定为3,默认也是3;
5) SecondaryNameNode第二名称节点默认就在NameNode上,这是为了提高HDFS的运行效率;
6) 数据块在进行水平复制的过程中,是通过机架感知来决定数据块保存的位置;当保存数据块的时候,HDFS会维护数据块的位置信息(即元信息),通过采用倒排索引的方法来解决查找数据块的问题。

B、什么是机架感知?

分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群。机架内的机器之间的网络速度通常都会高于跨机架机器之间的网络速度,并且机架之间机器的网络通信通常受到上层交换机间网络带宽的限制。

具体到Hadoop集群,由于hadoop的HDFS对数据文件的分布式存放是按照分块block存储,每个block会有多个副本(默认为3),并且为了数据的安全和高效,所以hadoop默认对3个副本的存放策略为:

  • 第一个block副本存放在和client所在的datanode里(如果client不在集群范围内,则这第一个datanode是随机选取的);
  • 第二个block副本放置在与第一个datanode不同的机架中的datanode中(随机选择),这是出于安全性的考虑;
  • 第三个副本放置在与第一个副本所在节点同一个机架的另一个datanode上,这是出于效率的考虑。
    如果还有更多的副本,则在遵循相应限制的前提下,随机放置在集群的datanode里。下图展现了机架感知的基本原理。

C、什么是MapReduce?

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",是它的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统之上。当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
下图非常形象地描绘了MapReduce的编程模型,可以明显地看到,Map阶段的输出是作为Reduce阶段的输入,因而要求这两个阶段的数据类型要保持一致。同时,需要注意的是,MapReduce编程中所有输入和输出的数据类型都必须是Hadoop自己定义的数据类型,这是因为Hadoop的数据类型都实现了Hadoop的序列化,从而能够作为Map和Reduce的输入和输出。


MapReduce的基本架构:MapReduce是一个分布式计算框架,主要由两部分组成:编程模型和运行时环境。其中,编程模型为用户提供了非常易用的编程接口,用户只需要像编写串行程序一样实现几个简单的函数即可实现一个分布式程序,而其他比较复杂的工作,如节点间的通信、节点失效、数据切分等,全部由MapReduce运行时环境完成,用户无须关心这些细节。
MapReduce是在总结大量应用的共同特点的基础上抽象出来的分布式计算框架,它适用的应用场景往往具有一个共同的特点:任务可被分解成相互独立的子问题。基于该特点,MapReduce编程模型给出了其分布式编程方法,共分5个步骤:

  • 迭代(iteration)。遍历输入数据,并将之解析成key/value对。
  • 将输入key/value对映射(map)成另外一些key/value对。
  • 依据key对中间数据进行分组(grouping)。
  • 以组为单位对数据进行规约(reduce)。
  • 迭代。将最终产生的key/value对保存到输出文件中。
    为了实现MapReduce的编程模型,Hadoop设计了一系列对外编程接口。用户可通过实现这些接口完成应用程序的开发。

D、什么是HBase?

HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
下图对MySQL关系型数据库表和HBase分布式数据库表结构进行了对比,可以很明显地发现这两种数据库库之间的差异。MySQL数据库存放的是结构化数据,适合对表进行修改、删除、更新的操作,而查询操作由于经常需要进行多表关联,因而效率比较低下;HBase数据库可存放非结构化的数据,适合进行查询操作,即使在数据量非常大的情况下,也拥有较高的查询效率,但它不适合修改、删除、更新这些操作,这些特性是由其数据存储结构决定的。需要注意的是,HBase中的第一列rowkey(行键)始终是固定的,它跟关系型数据库表中的主键类似,但又有所不同,主键不能为空,且不能重复;而行键可以重复,重复的行键表示同一条记录。

2、免密码登录原理

在搭建Hadoop实验环境之前,先了解下配置免密码登录的必要性。在Hadoop集群中,大量的主机进行分布式计算需要相互进行数据通信,服务器之间的连接需要通过ssh协议来进行,所以要安装ssh服务,默认情况下通过ssh登录服务器需要输入用户名和密码进行连接。如果不配置免密码登录,每次启动Hadoop都要输入密码用来访问每台机器的DataNode,而在实际生产环境中, Hadoop集群往往有上百或者上千台机器,所以一般都需要配置ssh的免密码登录。
免密码登录是基于非对称加密算法和SSH安全协议,公钥发布给其他机器用于加密数据,私钥保存于本地机器用于解密加密的数据。下图简单描绘了免密码登录的设置过程以及登录认证过程。

设置过程:
1)Computer A运行命令ssh-keygen –t rsa,在本地目录/root/.ssh/下生成公钥id_rsa.pub和私钥id_rsa;
2)Computer A运行命令ssh-copy-id –i/root/.ssh/id_rsa.pub root@hadoop222,将自己(假设自己主机名是hadoop221)的公钥id_rsa.pub发送给Computer B(假设其主机名为hadoop222);
3)Computer B接收到Computer A发送过来的公钥后,将其保存到本地/root/.ssh/authorized_keys文件中;
登录认证过程:
4)Computer A运行命令ssh hadoop222请求登录Computer B;(注意:这是第一次免密码尝试登录Computer B,需要输入Computer B的密码,登录成功后,以后再登录时,就不再需要输入密码);
5)Computer B在本地随机生成相应的明文口令字串;
6)然后,ComputerB使用Computer A的公钥进行加密得到相应的密文口令字串,将该密文口令字串发送给Computer A;
7)Computer A接收到Computer B发送来的密文口令字串,尝试使用自己的密钥进行解密,得到相应的明文口令字串,随后Computer A再将该明文口令字串发送回给Computer B;
8)Computer B对接收到的明文口令字串进行验证,若证实是自己先前生成的明文口令字串,则验证通过,允许Computer A登录系统;否则,禁止Computer A登录系统。

3、准备工作

A、关闭防火墙

为了防止后续在使用Hadoop实验环境的过程中,出现意外的状况,这里就先将防火墙永久性关闭。在命令行中依次运行如下三条命令:

systemctl status firewalld.service  ——查询防火墙当前状态
systemctl stop firewalld.service   ——关闭防火墙,如果重启系统,防火墙会重新启用
systemctl disable firewalld.service  ——永久停用防火墙

B、配置主机名

由于在使用过程中,为了方便,经常使用主机名替代IP机制,因此需要配置主机名和IP地址的对应关系。运行命令vi /etc/hosts,进行编辑配置,在文件末尾添加如下一行文字即可。
192.168.12.221 hadoop221

C、安装Hadoop

这里,默认已经安装并配置好了Java JDK,如果未正确安装好,请参考上一篇文章进行安装配置。将Hadoop安装包上传到/root/tools目录下,运行如下命令进行解压安装:
tar -zxvf hadoop-2.7.3.tar.gz -C /root/training/
然后,设置Hadoop的环境变量,运行命令:vi /root/.bash_profile,在文件末尾添加如下几行文字:
设置Hadoop的家目录

HADOOP_HOME=/root/training/hadoop-2.7.3
export HADOOP_HOME

将Hadoop的家目录添加到环境变量中

PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export PATH

保存退出后,运行命令source /root/.bash_profile,使配置的环境变量生效。

D、Hadoop的目录结构

进入到Hadoop家目录下,运行命令:tree -d -L 3,查看Hadoop的目录结构,如下图所示:

比较重要的目录有bin、etc、lib等,下面分别介绍这几个目录的作用:
bin:运行以及管理Hadoop集群相关的脚本。这里介绍几个常用的脚本
Hadoop:最基本且功能最完备的管理脚本,其他大部分脚本都会调用该脚本
start-all.sh/stop-all.sh :启动/停止所有节点的HDFS和MapReduce相关服务
start-mapred.sh/stop-mapred.sh :单独启动/停止MapReduce相关服务
start-dfs.sh/stop-dfs.sh:单独启动/停止HDFS相关服务
etc:Hadoop所有配置文件所在的目录,主要包括core-site.xml、hdfs-site.xml、mapred-site.xml等从Hadoop1.0继承而来的配置文件和yarn-site.xml等Hadoop2.0以后新增的配置文件。Hadoop的配置文件总的来说还是比较多的,其设计原则可概括为如下两点:
尽可能模块化,即每个重要模块拥有自己的配置文件,这样使得维护以及管理变得简单
动静分离,即将可动态加载的配置选项剥离出来,组成独立配置文件etc目录下最重要的配置文件有core-site.xml、hdfs-site.xml和mapred-site.xml,分别设置了基础公共库core、分布式文件系统HDFS和分布式计算框架MapReduce的配置选项。
include:对外提供的编程库头文件(具体动态库和静态库在lib目录中),这些头文件均是用C定义的,通常用于C程序访问HDFS或者编写MapReduce程序;
lib:该目录包含了Hadoop对外提供的编程动态库和静态库,与include目录中的头文件结合使用;
libexec:各个服务对应的shell配置文件所在的目录,可用于配置日志输出、启动参数(比如JVM参数)等基本信息;
sbin:Hadoop管理脚本所在的目录,主要包含HDFS和YARN中各类服务的启动/关闭脚本;
share:Hadoop各个模块编译后的jar包所在的目录。

4、Hadoop三种安装模式

A、本地模式

Hadoop本地模式的安装非常简单,它没有使用HDFS,一般用于测试MapReduce程序,使用的也都是Linux系统本地目录上的数据,仅需要使用一台机器即可。
进入到/root/training/hadoop-2.7.3/etc/hadoop目录下,运行命令vi hadoop-env.sh,将第25行处配置JAVA_HOME的路径改为如下内容即可:
export JAVA_HOME=/root/training/jdk1.8.0_144
接下来使用Hadoop提供的经典实例,测试一个MapReduce程序,验证整个环境的安装是否正确。
1)创建目录:mkdir /root/input;
2)在/root/input目录下创建data.txt文件,并输入如下几行文字:

I love Beijing
I love China
Beijing is the capital of China

3)进入到/root/training/hadoop-2.7.3/share/hadoop/mapreduce目录下,运行如下命令:

hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /root/input/data.txt /output

待正常执行完成后,进入到/root/output目录下,观察是否产生part-r-00000文件和_SUCCESS文件(标志文件,表示执行成功),并运行命令cat part-r-00000查看该文件的内容,如下图所示:

B、伪分布模式

伪分布模式是在单机上模拟一个分布式的环境,它具有Hadoop的主要功能。通常情况下,对于个人使用者进行学习实验,使用伪分布模式就够用了。在后面其他模块的学习过程中,基本都是在伪分布模式下进行操作,但也会学习和实践全分布模式环境的搭建。
搭建Hadoop的伪分布模式,总共需要配置5个文件,如下图所示:

Hadoop-env.sh在前面已经配置过,这里就不用再重新进行配置了。在这里,Hadoop环境的搭建包括HDFS和Yarn两大部分,而它们均是主从式结构,因此需要对其相关的主节点和从节点分别进行配置。如下:
HDFS结构: namenode(主节点)+datanode(从节点)+secondarynamenode(第二名称节点)
Yarn结构: resourcemanager(主节点) + nodemanager(从节点)
hdfs-site.xml文件的配置:
注意:dfs.replication参数配置的原则,一般情况下,数据块的冗余度要跟数据节点(DataNode)的个数保持一致,最大不超过3

<!--数据块的冗余度,默认为3,伪分布模式仅有一台机器,就只能设置为1-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!--是否开启HDFS的权限检查,默认为true-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>

core-site.xml文件的配置:

<!--配置NameNode的地址,9000是进行RPC通信的端口号-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop221:9000</value>
</property>
<!--HDFS数据保存在Linux的哪个目录,默认路径是Linux的tmp目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/training/hadoop-2.7.3/tmp</value>
</property>

注意:该参数一定要进行配置,Linux的tmp目录是临时目录,当系统重启后数据会丢失

mapred-site.xml文件的配置:

注意:默认情况下是没有mapred-site.xml文件的,但有mapred-site.xml.template文件,运行命令cpmapred-site.xml.template mapred-site.xml拷贝一份即可。

<!--MapReduce程序运行使用的框架-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

yarn-site.xml文件的配置:

<!--Yarn的主节点ResourceManager的位置-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop221</value>
</property>
<!--MapReduce程序的运行方式:shuffle(洗牌)-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

注意:上面几个文件都配置完成后,需要对HDFS的NameNode进行格式化,这就跟软盘买回来后需要进行格式化后才能使用是一个道理。运行如下命令对NameNode进行格式化,注意观察输出的log信息。

hdfs namenode -format
如果看到输出的log中有如下这样一行信息,则表明NameNode格式化成功,Hadoop伪分布模式环境的搭建顺利完成。
Storage dirmp/dfs/name has been successfullyformatted.
可以使用命令start-all.sh来开启Hadoop,使用stop-all.sh来关闭Hadoop。
这里注意下,在开启的过程中,总共需要输入四次登录密码,这就是没有配置免密码登录存在的弊端。在下面Hadoop全分布模式的搭建中,将首先配置免密码登录,解决这个麻烦的问题。同时,可以使用Java JDK提供的一个工具命令jps查看当前Linux系统正在运行哪些Java进程,这样便能够很直观地看到当前Hadoop的运行状态。
除此之外,还可以通过浏览器来查看Hadoop的相关信息,在浏览器中输入http://192.168.12.221:50070, 查看HDFS主节点NameNode运行的相关信息,如下图所示:

在浏览器中输入http://192.168.157.221:8088, 查看Yarn运行的相关信息,如下图所示:

经过启动Hadoop伪分布环境,想必已经尝到了多次输入密码的痛苦,现在来补上设置免密码登录。依次运行如下命令:

ssh-keygen -t rsa(运行该命令后,要求你输入啥信息,直接一直按回车键即可)
ssh-copy-id -i/root/.ssh/id_rsa.pub root@hadoop221 (需要输入主机密码root)

这样操作之后,运行命令ssh hadoop221,检查配置免密码登录是否成功,若能直接登录主机hadoop221,则表明配置成功;否则,配置失败。
下面,在伪分布式环境上试着跑下wordcount实例程序,看看它的运行效果是怎样的。
首先,依次运行命令hdfs dfs -mkdir /input,在分布式环境上创建输入目录;运行命令hdfs dfs -mkdir /output,在分布式环境上创建输出目录,并运行命令hdfs dfs -put /root/input/data.txt /input,将先前创建好的数据文件data.txt上传到分布式环境中的input目录下;
接下来,进入到/root/training/hadoop-2.7.3/share/hadoop/mapreduce目录,执行命令hadoop jarhadoop-mapreduce-examples-2.7.3.jar wordcount /input/data.txt /output/wc,待正确执行结束后,运行命令hdfs dfs -cat/output/wc/part-r-00000,查看程序的输出内容,如下图所示:

C、全分布模式

1)准备工作

在实际生产环境中,使用的都是Hadoop的全分布模式,需要做的配置工作比较繁琐,因此,事先要做好规划,然后按照规划一步一步进行操作,这样才不容易出错。
按照上一篇文章的方法,分别安装好hadoop222、hadoop223、hadoop224三台Linux操作系统和Java JDK及tree命令工具,并配置好Java环境变量;
在安装好的三台Linux操作系统上,依次运行如下两条命令,关闭这三台Linux操作系统的防火墙

systemctl stop firewalld.service
systemctl disablefirewalld.service

在三台Linux操作系统上,运行命令vi /etc/hosts,为三台Linux操作系统配置主机名和IP地址的映射(三台配置一样)

192.168.12.222 hadoop222
192.168.12.223 hadoop223
192.168.12.224 hadoop224

在三台Linux系统之间,两两配置免密码登录
在主机hadoop222上进行配置:

ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pubroot@hadoop222
ssh-copy-id -i /root/.ssh/id_rsa.pubroot@hadoop223
ssh-copy-id -i /root/.ssh/id_rsa.pubroot@hadoop224

在主机hadoop223上进行配置:

ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pubroot@hadoop222
ssh-copy-id -i /root/.ssh/id_rsa.pubroot@hadoop223
ssh-copy-id -i /root/.ssh/id_rsa.pubroot@hadoop224

在主机hadoop224上进行配置:

ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pubroot@hadoop222
ssh-copy-id -i /root/.ssh/id_rsa.pubroot@hadoop223
ssh-copy-id -i /root/.ssh/id_rsa.pubroot@hadoop224

保证三台机器的时间同步,如果不同步,可能在运行Hadoop集群的过程中,会出现问题。可以使用MTPuTTy工具提供的一个功能实现三台主机的时间同步,点击进入Tools——Send Script,在Type your script中输入date –s 20180508(注意,最后面需要加上一个回车符),并勾选上需要同步时间的三台主机,点击Send script即可。

2)在主节点上(hadoop222)安装配置hadoop

运行如下命令解压Hadoop安装包,并设置环境变量

tar -zxvf hadoop-2.7.3.tar.gz -C /root/training/

为方便起见,此处一并将三台Linux操作系统的Hadoop环境变量设置好,运行命令:vi /root/.bash_profile(在三台Linux上进行同样的操作)

HADOOP_HOME=/root/training/hadoop-2.7.3
export HADOOP_HOME
PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export PATH
3)修改配置文件

hadoop-env.sh文件的配置:

JAVA_HOME=/root/training/jdk1.8.0_144

hdfs-site.xml文件的配置:
注意:dfs.replication参数配置的原则,一般情况下,数据块的冗余度跟数据节点(DataNode)的个数保持一致,最大不超过3

<!--数据块的冗余度,默认为3,伪分布模式仅有一台机器,就只能设置为1-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--是否开启HDFS的权限检查,默认为true-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>

core-site.xml文件的配置:

<!--配置NameNode的地址,9000是进行RPC通信的端口号-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop222:9000</value>
</property>
<!--HDFS数据保存在Linux的哪个目录,默认路径是Linux的tmp目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/training/hadoop-2.7.3/tmp</value>
</property>

注意:该参数一定要进行配置,Linux的tmp目录是临时目录,当系统重启后数据会丢失

mapred-site.xml文件的配置:
注意:默认情况下是没有mapred-site.xml文件的,但有mapred-site.xml.template文件,运行命令cp mapred-site.xml.templatemapred-site.xml拷贝一份即可。

<!--MapReduce程序运行使用的框架-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

yarn-site.xml文件的配置:

<!--Yarn的主节点ResourceManager的位置-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop221</value>
</property>
<!--MapReduce程序的运行方式:shuffle(洗牌)-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

slaves文件的配置:
hadoop223
hadoop224
配置完成后,运行命令hdfs namenode –format,格式化NameNode;并运行如下命令,把主节点hadoop222上配置好的hadoop目录复制到从节点(hadoop223、hadoop224)上:

scp -r hadoop-2.7.3/ root@hadoop223:/root/training
scp -r hadoop-2.7.3/ root@hadoop224:/root/training

最后,在主节点hadoop222上运行命令start-all.sh,启动hadoop。同样地,可以在浏览器上查看HDFS NameNode的信息及Yarn的信息,并可以参考配置hadoop伪分布模式小节运行wordcount程序,看看运行效果。至此,Hadoop的全分布模式环境搭建完毕,敬请期待后续章节的更新。

参考文献:
——《百度百科》
——《CSDN博客》
——《潭州大数据课程课件》
——《Hadoop技术内幕 深入理解MapReduce架构设计与实现原理》

相关文章