【翻译】初步介绍Hadoop——概念和想法

原文链接

背景

“大数据”一词无处不在,我们生活在数据的世纪。数据总量爆炸性增长,下图预测了数据在未来几年的总量,从图中可知数据增长非常迅速。

image.png

随着数据的增长,硬盘的存储量也随之增大。然而存取速度(数据读写时的传输速率)却没有跟上,这意味着我们需要花费大量的时间在数据读写上。硬盘的数据传输速率和容量增长量对比如下图所示,显然二者的差距正变得越来越大。

image.png

目前,如果硬盘上有1TB数据,则需要2.5小时来读取所有数据。因此,在大数据时代,低数据读写率已经成为了数据存储、检索和分析的瓶颈。如何应对这个瓶颈?一些人提出了多硬盘和分布式计算的想法。

下图诠释了一个多硬盘的粗糙模型,首先将数据分成几个部分,每个部分的数据存储在一个单独的硬盘上,当我们想要分析这些数据时,每个硬盘将分别读取并处理自己存储的数据,然后将结果合并得到最终的结论。因此一个硬盘只需要读取一部分数据,数据读写时间被缩短了。

image.png

然而这可能会出现一个问题:如果用多个驱动器仅存储一个数据集,那是否会造成硬盘空间的浪费?

这确实会浪费空间,然而思考一下如果我们有多个数据集(或系统中存在多个用户),我们可以对所有数据集做同样的处理,这样就可以更有效得利用硬盘空间。此外,只要我们不同时分析所有数据集,数据集的读写时间同样会缩短。

然后我们可能会想搭建这样的系统,但是会面临几个问题。第一是关于硬件故障率,尽管一个独立的硬盘的故障率很低,但是一组硬盘的故障率会上升,因为只要一个硬件故障就可能导致系统故障。第二个问题是我们通过什么样的方式将来自多驱动器的数据组合?还有更多的其他问题需要解决。

带着对上述问题的思考,Hadoop计划就是这么一个提供了概念、想法和架构的解决分布式计算的系统,它就像一个为了集群计算设计的操作系统,并提供了一些库让使用者可以写自己的应用程序和系统交互,并分析自己的数据集。

Hadoop总览

Hadoop是顶级项目,其包括几个子项目,每个子项目解决分布式计算一个方面的问题,下面列出了Hadoop的一些子项目(不完全):

  • HDFS:一个分布式文件系统
  • MapReduce:一个分布式数据处理模型和执行系统
  • Pig:一个用于探索非常大数据集的数据流语言和执行环境
  • HBase:一个分布式的列导向数据集
  • ZooKeeper:一个分布式,高可用协同服务
  • Hive:一个分布式数据仓库

下图为Hadoop子项目的图形展示:

image.png

其中最重要的子项目是HDFS和MapReduce,用于数据存储和数据处理,这两部分对上述问题提供了系统性的解决方案。

Hadoop子项目

HDFS

HDFS是Hadoop Distributed FileSystem的简称,它通过机器内的网络来管理存储,主要适用于:

  • 非常大的文件(以GB和TB为规模)
  • 流数据访问(一次写多次读)
  • 商用硬件(不需要昂贵或特殊的硬件)

不适用于:

  • 低延迟数据访问(HDFS需要时间来查询文件的位置)
  • 众多小文件(数十亿个小文件)
  • 多个写入器,任意文件修改。主要原因在于HDFS的机制,HDFS的架构如下所示:

image.png

文件在HDFS中被分割成等大小的块(例如,64MB),块大小是系统中能读写的最小数据量,来自相同文件的块被独立存储,正如前面提到的,一组硬盘是不可信的,因此每一个块会被复制以防硬件损坏。

Datanode是工作机,datanode负责存储和检索文件块,并定期向Name-node报告其存储的块列表,一个datanode可以被看作是网络中的一台计算机。

Name-node是系统的核心,管理者,它维护了文件系统树和树中所有文件及目录的元数据,树的结构如下图所示:

image.png

首先,这里有一个根目录,根包含多个子目录。每个子目录包含多个文件,而每个文件又被分成多个块。因此datanode会定期向Name-node报告其块列表,而Name-node就能知道每个块位于哪个datanode。

HDFS中数据的读取过程如下图所示:

image.png

首先,系统会通过Name-node获取块列表和块位置,然后,InputStream会同时读取datanode中的每一个块。

HDFS中数据的写入过程如下所示:
image.png

首先系统会通过Name-node来检查该文件是否已经存在于系统中,如果不存在Name-node会在文件系统树中创建文件,它也会提供datanode中可被存储的块列表。然后,OutputStream会将每个块写入datanode中,因为每个块需要被复制多次,它会被写入到datanode的管道中,在被写入到第一个datanode中之后,它被传递给第二个datanode,然后是用户特别指定的第三个datanode。

MapReduce

MapReduce是用于分布式计算的并行数据处理模型,这个模型中的工作主要分为两个步骤,Map阶段和Reduce阶段,每个阶段都有输入输入,其数据格式为(key,value)(key,value)。如下所示:

image.png

这里有一个例子,我们想要找到数据集中每年的最高纪录温度,输入是一个大文件每行包括具体一天的各种信息。在Map阶段,我们从每行中提取年份和温度,由于每行是一天的数据,因此在Map阶段的输出中一年会包括很多行。因此我们要合并Map阶段的输出,这称为Shuffle。之后通过Reduce函数来计算每年的最高温度,具体过程如下所示:

image.png

所以MapReduce如何用于分布式计算呢?在MapReduce中,我们将想要做的事定义为job,一个job可以被分成多个task,包括map task和reduce task。这样输入的数据集可以被分成多个等大的部分(正如HDFS做的那样),并且每个task处理数据集中的一个部分。Jobtrack和Tasktrack用于协调工作,并行计算过程如下所示:
image.png

对于输入数据集的每个分片,我们应用map函数,然后再合并map的输入作为reduce函数的输入来获得结果。值得注意的是map函数可以同时完成,而reduce阶段永远在map阶段之后,若存在多个reduce函数,则其处理过程如下所示:
image.png

Hadoop尽其所能来运行输入分割驻留在HDFS内的计算机上的map任务,称之为数据本地化优化。意思是,输入分割所在的计算机负责运行map任务,若我们使用其他计算机,输入分割必须通过网络传输过去,而这会耗费带宽资源。因此数据本地化降低了数据传输的带宽成本。然而,reduce任务不能使用数据本地化,所有map函数的输出必须传输到特定的节点来运行reduce任务。为最小化数据传输,combiner函数被用于map和reduce之间来削减map输出中不必要的信息。继续用最高温度为例,一个combiner函数可以被用于shuffle阶段,来计算输入数据集每个分割中的本地最高年温度。

下图中展示了一个MapReduce job的工作过程,首先为该job分配一个特殊的ID,然后通过文件系统来获得job资源(如配置信息)。在job被提交到Jobtracker之后,它会被初始化,jobtracker也会从文件系统中检索输入分割然后为每个分割设置一个map task。Reduce task的数量取决于用户设置,Tracktracker收到tasks后定期向Jobtracker报告tasks的状态信息。

image.png

有一个新的系统叫YARN共享类似MapReduce的函数,因为我没有深入这个子项目因此不讨论其内容。

MapReduce处理低等级操作,仅有MapReduce的话,我们不得不关心数据流的细节,因此我们需要一个更先进的工具来帮助我们关注数据本身和处理技术细节。在下一节讨论三个高等级的子项目。

其他子项目

Pig

Pig是一个用于大数据集处理的语言和运行环境,Pig包括两个部分:Pig Lation:表示数据流的语言;和一个运行Pig Latin程序的运行环境。

Pig Latin程序由一系列应用于输入数据的操作或转换组成,它通过Pig运行环境可以被转换成一系列MapReduce任务,因此Pig Latin语言可以被Hadoop系统理解。继续用最高温度为例,通过Pig,我们只需要很少的行就能完成这个工作:
image.png

HBase

HBase是一个面向列的分布式数据库,搭建在HDFS上。尽管它是一个数据库,但是它并不支持SQL,其思想在于若表单增长过大,它可以在水平方向上被自动得切割为多个区域(每个区域包括表单中的多个行),和HDFS还有MapReduce类似,它有一个主从架构,使用管理者节点来管理所有的空间,且regionserver服从一个管理或多个regions。

Hive

Hive是一份搭建在Hadoop上的数据仓库基础架构,它支持Hive Query语言(非常近似于SQL),若熟悉数据库可以很快上手Hive。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享