![自己动手做大数据系统(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/236/32375236/b_32375236.jpg)
2.3 Hadoop
Hadoop软件是大数据平台必选的基础软件,这主要缘于其具备3个核心功能。
第一个核心功能是,HDFS(Hadoop Distributed File System)实现了软件定义存储功能。通过HDFS实现了分布式统一数据存储,从而实现了大数据平台中海量数据的基于磁盘块ID的统一管理机制。通常的磁盘块ID管理是只能通过单台计算机或服务器来管理的,而HDFS却可以通过网络间的HDFS进程服务协同来实现网络内计算机的磁盘文件统一管理。这样我们就不再担心业务数据的容量了,再大的容量都可以通过在不停止服务的基础上增加服务器和磁盘来加入HDFS,以保证业务的顺利执行。
HDFS对应的架构如图2-1所示。
从图2-1中可以看出,如果有13台计算机服务器的话,可以拿出两台服务器(server1和server2)做名称节点服务器(其实就是在该服务器上启动名称节点服务);拿出3台服务器(server3、server4和server5)做ZooKeeper服务集群,以监控名称节点(NameNode)服务器的状态。如果ZooKeeper集群中的一台服务器出现故障,就进行自动故障转移。同样也可以在这3台服务器(server3、server4和server5)上做JournalNode集群,以便保证名称节点集群的元数据信息的一致性。这样通过这5台服务器就可以实现名称节点的高可用性,从而保证HDFS系统中元数据信息的高可用性。
而HDFS中具体存储的业务数据是全部存在数据节点(DataNode)服务器中的,在图2-1的架构图中对应的是两个机架(一个机架中可以存放多台服务器)8台服务器(server6至server13)来启动对应的数据节点服务,以实现数据的存储。之所以分两个机架来分别存储,是因为HDFS中的业务数据存储是按一份数据多份存储来实现数据高可用性的。这样一份业务数据默认会有3份副本来对应存储到3台数据节点服务器上,这3台服务器的默认选择顺序是先存储在客户端提交的那台数据节点服务器上,再于同机架的数据节点服务器上存储一份,第3份会存储在不在该机架的数据节点服务器上。这样就实现了“不把鸡蛋放在一个篮子里”的思想,从而保证了业务数据的高可靠性存储和读取。
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_24.jpg?sign=1738885436-eoy3CiXRb1AdHKqRRSBNfx39331tXsSp-0-e8cf83da4583057bd5bf88e02f6caa67)
图2-1 HDFS架构图
第二个核心功能是,使用YARN(Yet Another Resource Negotiator)实现了资源的统一管理调度。这也是Hadoop真正在企业落地的主要标志组件。在Hadoop 2.0版本中出现了YARN组件后,Hadoop的统一存储资源管理平台才在商业环境中真正地稳定落地。资源管理系统的核心包括资源隔离和资源调度管理。资源隔离是通过启动服务器上的NodeManager进程服务来实现的,资源调度管理是通过ResourceManager和ApplicationMaster的搭配来实现的。在实际的企业业务中,我们有海量的数据需要进行排序、聚合统计等,而这些计算任务什么时候运行、使用哪些服务器来运行的问题,在Hadoop中是通过YARN来对应实现的。具体的YARN架构的原理图如图2-2所示。
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_25.jpg?sign=1738885436-KirIa15FVdeAzgMumxb7QIiEyRsqvnH7-0-2bda02fe8755e1056d27219591d402c2)
图2-2 YARN架构的原理图
在图2-2所示的架构原理图中,ResourceManager、NodeManager、ApplicationMaster和Container这几种组件的主要功能如下。
1.ResourceManager(RM,资源管理器)
YARN分层结构的本质是ResourceManager。这个实体控制着整个集群并管理应用程序向基础计算资源的分配。ResourceManager 将各个资源部分(计算、内存、带宽等)精心安排给基础 NodeManager(YARN中每个节点上的代理)。ResourceManager 还与 ApplicationMaster 一起分配资源,与 NodeManager 一起启动和监视基础应用程序的运行。
总的来说,ResourceManager有以下作用:
• 处理客户端的请求。
• 启动或监控ApplicationMaster。
• 监控NodeManager。
• 资源的分配与调度。
2.ApplicationMaster(AM)
ApplicationMaster管理在YARN内运行的每个应用程序实例。ApplicationMaster负责协调来自ResourceManager的资源,并通过NodeManager 监视容器的执行和资源使用(包括CPU、内存等的资源分配)。请注意,尽管目前的资源比较传统(CPU核心、内存),但未来将出现基于手头任务的新资源类型(比如,图形处理单元或专用处理设备)。从YARN角度讲,ApplicationMaster为用户代码,因此其存在潜在的安全问题。YARN 假设 ApplicationMaster 存在错误或者甚至是恶意的,因此将其当作无特权的代码对待。
总的来说,ApplicationMaster有以下作用:
• 负责数据的切分。
• 为应用程序申请资源并分配给内部的任务。
• 任务的监控与容错。
3.NodeManager(NM)
NodeManager管理YARN集群中的每个节点。NodeManager 提供针对集群中每个节点的服务,从监督管理一个容器的生命周期,到监视资源和跟踪节点的健康状况。MRv1(即Hadoop1的MapReduce框架)通过插槽管理Map和Reduce任务的执行,而NodeManager管理抽象容器,这些容器代表着可供一个特定应用程序使用的针对每个节点的资源。
总的来说,NodeManager有以下作用:
• 管理单个节点上的资源。
• 处理来自ResourceManager的命令。
• 处理来自ApplicationMaster的命令。
4.Container
Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等。当ApplicationMaster(AM)向ResourceManager(RM)申请资源时,RM为AM返回的资源便是用Container表示的。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。
总的来说,Container有以下作用:
对任务运行环境进行抽象,封装CPU、内存等多维度的资源以及环境变量、启动命令等与任务运行相关的信息。
Hadoop中的核心功能,除了HDFS和YARN外,第三个就是利用MapReduce实现了分布式并行计算算法模型。
MapReduce是一个可以轻松上手的简单软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠的容错方式并行处理TB级别的数据集。其具体实现的原理图如图2-3所示。
图2-3的流程大概分为以下几步。
第1步:假设一个文件由3行英文单词或数字作为 MapReduce 的input(输入)。这里经过split(分割)过程把该文件分割为3块。分割后的3块数据就可以并行处理了。这时可将每一块数据交给一个mapper线程处理。
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_26.jpg?sign=1738885436-yWKzq0wsbiYM28BNhIDxsfPWvvOPEAbp-0-8941ae57b13e960526341e29d18e802f)
图2-3 MapReduce算法实现的原理图
第2步:在每个mapper线程中,以每个单词为key,以1作为词频数value,然后输出。
第3步:每个mapper的输出要经过shuffle(混洗),将相同的单词key放在一个桶里面,然后交给reducer处理。
第4步:reducer接受了shuffle后的数据,会将相同的单词进行合并,得到每个单词的词频数,最后将统计好的每个单词的词频数作为输出结果。
2.3.1 安装环境的确认及文件准备
Hadoop的开源软件包使用Java语言编写。如前面所述,企业服务器大部分安装的是Linux,所以企业Hadoop部署的操作系统通常为Linux。本书使用CentOS 7操作系统。
Hadoop的HDFS的文件时间戳需要时钟保持一致,所以安装Hadoop环境中的服务器的系统时钟需要保持一致。通常会设置一个时钟服务器,以使环境服务器的时间保持一致。
Hadoop中的数据文件及任务经常需要从master服务器远程调用或复制到其他节点的服务器中,所以安装Hadoop环境中的服务器需要设置。
其对应的安装文件为hadoop-2.7.1.tar.gz,用户可以在Apache网站下载。
2.3.2 配置环境变量及无密码传输
具体步骤如下。
1)在master节点进行如下设置:
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_27.jpg?sign=1738885436-GlXuePEvZrEeQq0hfdrda2xhGayqVczh-0-09e1e5f7692a9ed2f1594b8bdd8ea5b3)
使用cat命令验证添加是否成功:
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_28.jpg?sign=1738885436-e15Upnh8aVZHE7GUf8vpuKV1Yk0tpqw1-0-1578f69356a17ff8eb6b45913bde4e4d)
2)对用户的环境变量进行如下设置:
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_29.jpg?sign=1738885436-TvwOYz5yNw3CT3kW95xtlV6EVJAeZ8TR-0-a6646382c83a9846f853d9d2159b6d2b)
输入env命令,验证以上变量是否可以正常显示。
在以上设置中,JAVA_HOME表示Java的安装目录,HADOOP_HOME 表示Hadoop的安装目录,HADOOP_USER_NAME表示安装Hadoop时需要用到的用户,PATH表示把Hadoop需要引用的程序路径添加进系统启动程序内。
3)在master节点生成公钥,放到其余各节点上,实现master到各节点的无密码传输:
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_30.jpg?sign=1738885436-raM0geqQGGKcszVTaZQGrQwM8adhLpI2-0-13b7585b6d6ad32996e0a115fd8cf559)
进入目录,列出文件,验证对应的authorized_keys文件是否存在:
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_31.jpg?sign=1738885436-kz88ry6JzP6UVbMaJeW1NegOaZDcbHK9-0-99b6996da803e08e6ed72a58bbfe163a)
把master节点上的公钥文件rsa.pub内容添加进authorized_keys,然后分发到各个子节点上(因为master需要无密码启动各个子节点上的bin程序,所以master是SSH(Secure Shell)客户端,各个子节点是SSH验证服务器端)。
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_32.jpg?sign=1738885436-xjKgLhuuv8WjGeHcKOObwj4i7odlde1o-0-ff3ad972daa4f259965ce3df1914ae4e)
注意:.ssh目录、公钥、私钥的权限都有严格的要求,需要确认各节点对应的权限是否正确,如下所示。
• 用户目录的权限是755或700,不能是77*;
• .ssh目录的权限是755;
• .pub或authorized_key的权限是644;
• 私钥的权限是600。
使用ssh slave01命令验证是否可以无密码远程连接成功。
2.3.3 配置Hadoop的对应参数
将下载的Hadoop及Java文件上传到master节点上,运行以下命令解压缩文件并进行安装:
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_33.jpg?sign=1738885436-WFmnCf3TrYVot1j5ZTAhZoQ8L7dFzAVh-0-1b9b5b58133a518ba2f509a8fb26b819)
然后,可以更改hadoop目录下的配置文件参数。
提示:Hadoop的配置文件基本上都是XML文件,所有的配置都放在<configuration>标签和</configuration>标签之间。一个<configuration>标签里面可以存在多个<property>标签和</property>标签。<name>标签里面就是我们想要设定的属性名称;<value>标签里面是我们想要设定的值;<description>标签是描述属性作用的,可以不写。绝大多数配置都是在XML文件里面设置的,因为在这里做的配置对全局用户都生效,而且是永久的。Hadoop的配置文件是底层的(第一层),Hive、HBase、Spark的配置参数位于第二层,基于会话的命令行设置位于第三层。用户采用命令行方式使用Hadoop或Hive、HBase时,也可以在命令行中用参数来修改Hadoop或Hive等软件的配置,这些配置值在用户退出该软件时即失效。这种配置参数的方式叫作基于会话的配置,也叫作用户自定义配置。使用用户自定义方式配置的参数值会覆盖默认配置(第二层或第一层)。
更改core-site.xml参数(对应的参数值):
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_34.jpg?sign=1738885436-CsaWRSL2CiJQUHxtzlot2oe8hctYyh5i-0-215991b404c833f5ac402201742eb334)
更改hdfs-site.xml参数(HDFS对应的参数值):
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_35.jpg?sign=1738885436-1jG7YNrTjWx5Ibegix3MtEBvlOstED2i-0-8f6261835c4e3a7a760fed75200d0d5b)
更改mapred-site.xml参数:
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_36.jpg?sign=1738885436-Owd9vk6hrKBQOHstzMdBrKEs3cmbPWzj-0-731559df81157b87535f8d590cbdb52f)
更改yarn-site.xml参数:
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_37.jpg?sign=1738885436-3xmJvqsanRYswpZaGrHr8KCErrEjffKJ-0-b7bb3877857db68de50f08c2ffe17c4b)
更改slaves文件参数:
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_38.jpg?sign=1738885436-RrPBLoWGnsCVsvRLzwrqwjDEYhgAj9n7-0-ae8102d69532080e694253363f541ab5)
以上配置信息更改完毕后,把对应的.bashrc、/etc/hosts 及/home/hadoop/bigdata/hadoop目录都复制到slave01、slave02对应的目录下:
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_39.jpg?sign=1738885436-NZrozjISCjXxRQzLQQ3k3It6Umo8ILHM-0-fed61defb39270f47f066506b8564805)
注意:以上仅是Hadoop安装的基本参数配置。关于资源池的划分及相关性能参数,要根据具体业务进行相应的配置。
2.3.4 启动并验证Hadoop
启动对应的Hadoop程序:
![](https://epubservercos.yuewen.com/EE9D0A/17493186606224406/epubprivate/OEBPS/Images/txt003_40.jpg?sign=1738885436-O8EUHbKnV1IIMOJWc6PlHqq0vDjluQS9-0-325072583a6d37a9a62e6f63050670f9)
在master服务器上通过输入jps命令确认是否可以显示ResourceManager、NameNode服务。
在slave01服务器上通过输入jps命令确认是否可以显示NodeManager、DataNode服务。