大数据和Hadoop的关系分析

Henry和我正在进行一项检查大数据以及其真正意义的工作。大数据是一个流行语。和许多流行语一样,大数据这个词用得有些滥了,但是它包含了一些真正的有用性和技术。我们决定在这个主题上对大数据进行一番分析,努力挖掘其中的真实性以及它们对存储解决方案的意义。

Henry用一个很好的介绍开始了这个系列。他对大数据的定义是我所见过的最好的定义。因此,我将重复这个定义:

大数据是将数据变为信息然后变为知识的过程。

这个定义很恰当,因为形容词“大”可以表达很多种意思。一些人将“大”想象成他们所专注的领域中的意思,而我们则专注于你可以在这个数据上做什么以及为什么。

Henry和我决定用两个部分来进行这个讨论。Henry从最基本的硬件本身开始,然后向上讨论堆栈。更准确的是,他想知道的是硬件的哪些方面对大数据而言很重要,以及哪些技术是重要的。我则从大数据堆栈的顶端开始,也就是应用程序,然后向下讨论堆栈。我们将在中间某处会合,然后将我们的想法和评论归纳到最终的一篇文章中。

从顶端开始并不容易,我原来的文章变得很长。因此,我们一起决定将它分成三个部分。第一个部分从讨论堆栈顶端的一些基本问题开始,包括将数据引入到存储系统以供使用的重要性(这个部分比大部分人所认识到的还要重要)。它还讨论了大数据最常见的工具——NoSQL数据库。第二个部分分析了8个使用于大数据并影响存储的NoSQL数据库类型。最后一个关于堆栈顶端的部分则将讨论Hadoop在大数据中的角色以及所有这些东西是如何联系到R这样的分析工具。

与Hadoop的联系

在以前的文章中所提到过的所有的数据库都需要一个地方来存储它们的数据,同时性能也是它们的一个重要组成部分。我们所提到过的一些工具与将Hadoop作为存储平台有联系。Hadoop实际上不是一个文件系统,实际上,它是一个软件框架,支持数据密集型分布式应用程序,比如这里所讨论的一些以及以前的文章所讨论过的一些应用程序。在与MapReduce在一起协同工作的时候,Hadoop可以成为一个针对数据密集型应用程序的非常有效的解决方案。

Hadoop File System(HDFS:Hadoop文件系统)是一个发端于谷歌文件系统(GFS:Google File System)的开源文件系统。但是,GFS是谷歌专用的。Hadoop是用Java编写的,是一个分布式文件系统,是真正的元文件系统——换句话说,是一个可以作用于底层文件系统顶端的文件系统。它的设计旨在成为一个容错的文件系统,让数据的副本可以存储在文件系统内不同的地点上,因此从错误的数据副本或宕机的服务器中恢复数据就变得相当容易。不过,这些副本也可以用于改善性能。

Hadoop的基本构建块就是所谓的“datanode”(数据节点)。这是一个一台服务器与一些存储和网络的组合。存储通常是服务器内部的或直接 连接到服务器的存储(DAS)。每个datanode使用专门的面向HDFS的块协议来在网络(以太网)上提供数据。一定数量的datanode分布在多 个机架上,而每个datanode可以通过它所在机架被部分识别。Hadoop还有元数据服务器,即所谓的“Namenode”(命名节点)。 Namenode同时也是HDFS的管理节点。此外,HDFS还有二级Namenode,不过它不是故障复原元数据服务器,而是用于其他文件系统任务,比 如快照主Namenode的目录信息以帮助减少宕机时间——如果一个Namenode发生故障的话。由于只有一个Namenode,它可能会成为一个潜在 的瓶颈或HDFS的单故障点。

HDFS的一个重要特点就是数据复制到多个datanode上以帮助提高弹性。HDFS缺省情况下会将三个数据副本存储在不同的datanode 上。两个副本是在同一个机架上,另一个在不同的机架上(因此,即使一个机架坏了,你还可以访问你的数据)。你可以在那些拥有所需数据的datanode上 ——缺省情况下拥有数据副本的三个datanode之一——运行制定好的任务(注意,这些datanode在存储数据和提供数据的同时也可以运行任务)。

这就是许多人所指的:“将任务移到数据上,而不是将数据移到任务上”。这样做可以减少数据迁移,减少网络负担,因为数据不用迁移来迁移去以运行任 务。一旦任务开始运行,所有的数据访问都是本地进行的,因此不需要datanode条带化或使用多个数据服务器来满足并行数据访问。Hadoop的并行性 体现在应用程序的性能上,同一个应用程序的多个副本可以被同时运行并访问不同的数据集。此外,由于你有三个数据副本,你可以在同一时间运行三个人物来访问 同一个文件,因此性能也得到了改善。

在后端,datanode可以和其他datanode通信,使用RPC(远程过程调用)来执行一系列任务:

在遵守数据复制规定的前提下,实现datanode之间的容量均衡;

互相之间比较文件,以便用正确的副本覆盖损坏的文件副本;

检查数据副本的数量,如果必要,增加额外副本;

需要注意的是HDFS不是一个POSIX(可移植操作系统接口)兼容文件系统,这主要是因为性能可以提高。

如果你使用Java API(应用程序编程接口)、Thrift API、命令行界面或在HTTP上通过HDFS-UI界面浏览,在HDFS中访问数据还是相当简单的。除了这个,在操作系统上直接载入HDFS是不行的。唯一的解决方案是使用Linux FUSE客户端来加载文件系统。

记住,Hadoop是基于谷歌文件系统(GFS)的,后者是用来支持谷歌的BigTable,而BigTable是面向列的数据库。因此,Hadoop更可能支持前文所提到的那些Column Store工具。在此前提到的工具中,许多工具已经开发了面向Hadoop的界面,因此它们可以利用Hadoop来存储数据。