购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 大规模计算系统搭建

2.2.1 Hadoop

在开始大数据分析之前,我们除了对数据进行预处理以得到稳定可靠的数据之外,还需要完成大规模计算系统的搭建。正如我们在第1章中谈到的,大数据是以体量大、类型多、存取速度快、应用价值高为主要特征的数据集合。对于医疗行业,我们面对的是上亿的病例信息,做一次CT就可能产生数千幅原始图像,其数据量达到数百兆甚至更多。我们现在好像已经习惯了处于这样一个大数据时代,但当我们真正面对它的时候,到底应该如何计算和存储这些数据呢?

事实上,谷歌公司早在2003年就发表了一篇论文,提出了谷歌文件系统(The Google File System, GFS)。该系统是一种可拓展的分布式文件管理系统,其工作思路是,把拍字节(PB)级别的大文件切开,分成很多个小文件,再将这些小文件每个复制3份,存储在不同的机器上。这样,当系统中的一部分机器无法运行时,就可以从剩余机器中获取所需的文件,并且对故障部分进行自动恢复。

正是这篇论文开启了大数据时代的序幕。面对体量庞大的数据,我们的解决方案是:连接许多性能较低甚至常常出故障的机器,把存储和计算工作分配给它们,从而获得一个整体性能非常强大的系统。正是这个思路指导了开源社区的Apache Hadoop文件管理系统(HDFS)的设计。

如图2.5中的官网描述所示。Apache Hadoop软件库是一个框架,它允许使用简单的编程模型跨计算机集群分布式处理大型数据集。它旨在从单个服务器扩展到数千台机器,每台机器都提供本地计算和存储。该库本身不是依靠硬件来提供高可用性,而是旨在在应用层上检测和处理故障,从而在计算机集群之上提供高可用性服务,虽然集群中的每台计算机都可能容易出现故障。

图2.5 Hadoop官网截图

从Hadoop官网下载程序发行版后,解压即可。在发行版中,编辑文件etc/hadoop/hadoop-env.sh,定义一些参数如下:

输入以下命令,这将显示Hadoop脚本的使用文档。

接下来就可以用本地模式操作Hadoop。在这种情况下,Hadoop是在本地机器上运行,所以只是作为学习和环境调试使用。

如果要真正部署可用的Hadoop集群,需要在几十甚至几千台工作机器上全部完成部署。通常,集群中的一台机器被指定为NameNode,还有一台机器被指定为ResourceManager,这两台机器是管理者。其他服务(例如Web App代理服务器和MapReduce作业历史服务器)通常在专用硬件或共享基础架构上运行,具体取决于负载。集群中的其余机器同时充当数据节点(DataNode)和NodeManager,这些机器是“工人”。其中命名节点是一个用来指挥其他节点存储的节点。任何“文件系统”(FS)都需要具备根据文件路径映射到文件的功能。命名节点就是用来存储这些映射信息并提供映射服务的计算机,充当整个HDFS系统中的“管理员”,因此,一个HDFS集群中只有一个命名节点。数据节点是用于存储数据块的节点。当一个文件被命名节点识别并分成块时,它将存储在分配的数据节点中。数据节点具有存储和读写数据的功能。存储的数据块类似于硬盘中“扇区”的概念,是HDFS中存储数据的基本单位。

2.2.2 MapReduce

HDFS解决了文件如何存储的问题,不过对文件进行计算仍然是一件复杂的事情。统计一篇作文中所有汉字出现的频数显然不难,毕竟常用汉字只有几千个,而作文的篇幅一般只有800多字。可是,若要统计某个医院全年病历文本中所有词汇出现的频数呢?词汇表的规模可能达到几十万条,而文件大小更是可能达到PB级别,单台机器就无法处理了。

如上一节所说,解决大数据问题的思路是把任务拆分给许多机器去完成。那么拆分任务就需要一个规范的编程模型,以降低编码成本。在Hadoop中,这个模型就是MapReduce,图2.6所示为其官方文档页面截图。

图2.6 MapReduce官方文档

Hadoop MapReduce是一个软件框架,用于轻松编写应用程序。这些应用程序会以可靠、容错的方式在商用硬件的大型集群(数千个节点)上并行处理大量数据(TB级数据集)。MapReduce作业通常会将输入数据集拆分为独立的块,这些块由Map任务以完全并行的方式处理。该框架对映射的输出进行排序,然后将其输入到reduce任务中。通常,作业的输入和输出都存储在文件系统中。该框架负责调度任务,监控它们并重新执行失败的任务。

通常计算节点和存储节点是相同的,即MapReduce框架和Hadoop分布式文件系统(参见HDFS架构指南)运行在同一组节点上。这种配置允许框架在已经存在数据的节点上有效地调度任务,从而在整个集群中产生非常高的聚合带宽。

在MapReduce中,一个准备提交执行的应用程序称为“作业(job)”,而从一个作业划分出的运行于各个计算节点的工作单元称为“任务(task)”。此外,Hadoop提供的分布式文件系统(HDFS)主要负责各个节点的数据存储,并实现了高吞吐率的数据读写。

在分布式存储和分布式计算方面,Hadoop都是用主/从(Master/Slave)架构。在一个配置完整的集群上,想让Hadoop这头“大象”奔跑起来,需要在集群中运行一系列后台程序。不同的后台程序扮演不同的角色,这些角色由NameNode、DataNode、Secondary NameNode、JobTracker、TaskTracker组成。其中NameNode、Secondary NameNode、JobTracker运行在Master节点上,而在每个Slave节点上,部署一个DataNode和TaskTracker,以便这个Slave服务器运行的数据处理程序能尽可能直接处理本机的数据。对于Master节点,需要特别说明的是,在小集群中,Secondary NameNode可以属于某个从节点;在大型集群中,NameNode和JobTracker被分别部署在两台服务器上。

至少,应用程序通过适当接口和抽象类的实现来指定输入/输出位置并提供映射和化简函数。这些函数和其他作业参数构成作业配置。Hadoop对客户端进行作业,然后将作业(jar/可执行文件等)和配置提交给JobTracker,再然后JobTracker承担将软件/配置分发到从属、调度任务和监视它们的责任。

MapReduce框架专门对<key, value>对进行操作,也就是说,该框架将作业的输入视为一组<key, value>对,并生成一组<key, value>对作为输出,可以想象有不同的类型。

该键和值类必须由框架序列化,因此需要实现可写接口。此外,关键类必须实现WritableComparable接口以方便框架进行排序。 CJPyP6z7IwBs3nuZVoxiXz1Q0BtP7sfUu8eKnEBcXkCbgpKu6WFIlxTirmxS+7mY

点击中间区域
呼出菜单
上一章
目录
下一章
×