关于Hadoop的初步介绍 — 概念和想法

内容

我已经花了几天时间学习Hadoop。在这里,我想写一些关于Hadoop项目背后的概念和想法的笔记。这篇博客不会展示任何技术细节,而是专注于初步的想法。您可以在这里下载PDF幻灯片这里

1. 背景

“大数据” — 这个词随处可见。我们生活在数据世纪。数据量呈爆炸式增长。下图预测了未来几年的数据量。从图中我们可以看出,数据增长相当迅速。

随着数据量的增长,硬盘的存储容量也大幅增加。然而,访问速度(读写数据的数据传输速率)并没有跟上,这意味着与硬盘容量相比,我们需要花费大量时间进行数据读取和写入。下图比较了硬盘的容量和数据传输性能。正如图所示,差异变得越来越显著。

Source: http://www.cs.ucla.edu/classes/winter13/cs111/scribe/10c/f

目前,如果我们在硬盘上有1TB的数据,需要超过2.5小时才能读取所有数据!因此,在大数据时代,低数据访问速度是数据存储、检索和分析的瓶颈。如何解决这个瓶颈?一些人提出了使用多个硬盘和并行计算的想法。

下图展示了多个硬盘的粗略模型。首先,我们将数据分割成多个部分。每个数据片段存储在一个独立的硬盘上。当我们要分析数据时,每个硬盘将分别读取和处理一个数据片段。然后将结果合并以得出最终结论。由于每个硬盘只需读取一个数据片段,数据访问时间可以缩短。

一个问题可能如下所示:

如果我们使用多个驱动器仅存储一个数据集,这不是在浪费硬盘空间吗?

是的,这确实是浪费空间。然而,想象一下,如果我们有多个数据集(或者这个系统的多个用户),我们可以对所有数据集执行相同的操作。那么硬盘的空间可以更有效地利用。同时,只要我们不同时分析所有数据集,每个数据集的数据访问时间都会缩短!

然后我们可能想要构建这样一种系统。但我们将面临一些问题。第一个问题是硬件故障率。尽管单个硬件的故障率相对较低,但一组硬盘的故障率会很高,因为只要其中一个硬盘故障,系统就会发生故障。第二个问题是我们如何将来自多个硬盘的数据进行组合?还有其他问题需要解决。

考虑到这些问题,Hadoop是一种用于分布式计算的系统!Hadoop项目为您提供了概念、思想和框架。它还提供了安装系统。您可以在单台计算机上或一组计算机上安装Hadoop系统。它有点像为计算机集群设计的操作系统。Hadoop还提供了库,以便您可以编写自己的应用程序与系统进行交互,并分析自己的数据集。

2. Hadoop 概述

Hadoop 是一个顶级项目。它有几个子项目。每个子项目处理分布式计算的一个方面。以下是 Hadoop 子项目的列表,但不是完整列表。

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

这是 Hadoop 子项目的图形演示。

两个重要的子项目是HDFS和MapReduce,分别用于数据存储和数据分析。这两部分为前述问题提供了系统化的解决方案。

3. Hadoop 子项目

3.1 HDFS

HDFS 是 Hadoop 分布式文件系统的缩写。正如你从名称中可以看出的那样,它管理着跨机器网络的存储。HDFS 适用于

  • 非常大的文件(GB 或 TB 大小)
  • 流式数据访问(写入一次,多次读取)
  • 大宗商品硬件(不需要昂贵或特殊的硬件)

HDFS 不适用于

  • Low-latency data access (HDFS needs some time to find the location of the file)
  • Lots of small files (i.e. billions of small files)
  • Multiple writers, arbitrary file modifications The reason lies in the mechanism of HDFS. The structure of HDFS is like this.

HDFS中的文件被分成相同大小的块(例如64MB)。块大小是系统可以读取或写入的最小数据量。来自同一文件的块是独立存储的。如前所述,硬盘组不可靠。因此,每个块在硬件损坏的情况下会被复制(例如3个副本)。

数据节点是工作节点。数据节点负责存储和检索文件块。它还会定期向名称节点报告其正在存储的块列表。我认为数据节点可以被视为网络中的一台计算机。

Namenode 是系统的核心,也是主节点。它维护文件系统树和树中所有文件和目录的元数据。树的结构如下。

一开始,有一个根目录。根目录包含几个子目录。每个目录都有几个文件,每个文件都被分成块。由于数据节点定期向名称节点报告块列表,名称节点知道块位于哪个数据节点。

这是HDFS中的数据读取过程。

Source: White, Tom. " Hadoop: The definitive guide. " 3rd Edition, Page 68, O'Reilly Media, Inc., 2012.

系统首先将参考namenode获取文件的块列表以及块位置。然后InputStream将同时从相应的datanode读取每个块。

这是HDFS的数据写入过程:

Source: White, Tom. " Hadoop: The definitive guide. " 3rd edition, page 71, O'Reilly Media, Inc., 2012.

首先,系统将参考namenode检查文件是否已存在于系统中。如果文件不存在,namenode将在文件系统树中创建文件。它还提供了文件块可以存储的datanodes列表。然后OutputStream将每个块写入datanodes。由于每个块被复制多次,它被写入datanodes的管道中。也就是说,写入第一个datanode后,它会传递到第二个datanode,然后是第三个,这可以由用户指定。

3.2 MapReduce

MapReduce 是一种用于分布式计算的并行数据处理模型。在这个模型中,我们要做的工作被分为两个阶段:映射阶段和归约阶段。每个阶段都有其输入和输出,采用 (键, 值) 格式。

这里是一个例子。我们想要在数据集中找到每年的最高记录温度。输入是一个大文件,每行包含特定日期的各种信息。在映射阶段,我们从每行中提取年份和温度。由于每行是关于一天的,一个年份在映射阶段的输出中包含多行。因此,我们合并每年的映射输出,这称为洗牌。然后我们使用减少函数来计算每年的最高温度。流程如下。

MapReduce是如何用于分布式计算的?在MapReduce中,我们要做的事情被定义为一个_job_。一个job被分成多个_tasks_,包括map tasks和reduce tasks。因此,输入数据集被分割成大小相等的片段(实际上这就是HDFS的工作原理),每个任务处理一个数据集片段。_Jobtracker_和_tasktrackers_用于协调。下图展示了并行计算的过程。

Source: White, Tom. " Hadoop: The definitive guide. " 3rd edition, page 32, O'Reilly Media, Inc., 2012.

对于输入数据集的每个拆分,我们应用一个映射函数。然后将映射输出合并作为减少函数的输入,以获得结果。请注意,映射函数可以同时执行,但减少阶段始终在映射阶段之后。如果我们有多个减少函数,流程如下:

![Source: White, Tom. " Hadoop: The definitive guide. " 3rd edition, page 33, O'Reilly Media, Inc., 2012.](./mapreduce-multiple.jpg)

Hadoop 尽其所能在存储在 HDFS 中的输入分片所在的计算机上运行映射任务,这被称为数据本地性优化。也就是说,负责在输入分片上运行映射任务的是存储输入分片的计算机。如果使用另一台计算机,输入分片必须通过网络传输到该计算机,这将占用带宽资源。因此,数据本地性减少了通过网络的数据传输。然而,减少任务并没有数据本地性的优势。所有映射函数的输出必须传输到特定节点以供减少任务使用。为了最小化数据传输,可以在映射和减少之间使用组合器函数来丢弃映射输出中的不必要信息。以最高温度为例。在洗牌后可以应用组合器函数,以计算输入数据集的每个分片中的本地最高年温度。

下图显示了一个MapReduce作业的过程。首先,为作业分配一个ID以进行规范。然后,它引用文件系统以获取作业资源,如配置信息。作业提交给作业跟踪器后,将被初始化。作业跟踪器还从文件系统中检索输入拆分,并为每个拆分设置一个映射任务。减少任务的数量由用户配置确定。任务跟踪器接收任务并定期向作业跟踪器报告任务的状态。

Source: White, Tom. " Hadoop: The definitive guide. " 3rd edition, page 191, O'Reilly Media, Inc., 2012.

有一个名为 YARN 的新系统,其功能类似于 MapReduce。由于我没有深入研究这个子项目,所以我不会在这里讨论 YARN。

MapReduce处理低级操作。只有MapReduce时,我们必须关注数据流细节。因此,我们需要一些高级工具来帮助我们专注于数据本身并处理技术细节。在下一小节中,我将介绍三个高级子项目。

3.3 其他子项目

3.3.1 猪

Pig 是用于处理大型数据集的语言和执行环境。Pig 由两部分组成:Pig Latin,用于表达数据流的语言,以及执行环境,用于运行 Pig Latin 程序。

Pig Latin程序由一系列应用于输入数据的操作或转换组成。它可以被Pig执行环境翻译成一系列MapReduce作业,以便Hadoop系统理解Pig Latin语言。以最高记录温度为例。使用Pig,我们只需要几行代码就能完成工作。

Source: White, Tom. " Hadoop: The definitive guide. "

3.3.2 HBase

HBase 是构建在 HDFS 上的分布式列式数据库。尽管它是一个数据库,但不支持 SQL。其设计理念是,如果表变得过大,它会自动水平分区为多个区域(每个区域包含来自表的多行)。类似于 HDFS 和 MapReduce,它具有主从结构。它使用主节点管理整个空间,使用 regionserver 从节点管理一个或多个区域。

3.3.3 Hive

Hive 是建立在 Hadoop 之上的数据仓库基础设施。它支持 Hive 查询语言 - 与 SQL 非常相似。因此,如果您熟悉传统数据库,您可以很快熟悉 Hive。

4. 总结

Hadoop 是一组子项目,用于在一组计算机/硬件中进行并行数据存储、检索和分析,以减轻硬盘中的数据访问瓶颈。

获取更多信息

参考资料

  • White, Tom. "Hadoop: The definitive guide." O'Reilly Media, Inc., 2012.
总结
本文总结了Hadoop项目的概念和背景。文章指出,随着数据量的爆炸性增长,硬盘存储容量大幅增加,但数据访问速度并未跟上,导致数据存储、检索和分析的瓶颈。为了解决这一问题,提出了多硬盘和并行计算的概念。Hadoop是一个分布式计算系统,提供了HDFS和MapReduce等子项目,分别用于数据存储和数据分析。HDFS管理跨机器的存储,适用于大文件和流式数据访问,但不适合低延迟数据访问和大量小文件。MapReduce是一种并行数据处理模型,将工作分为map和reduce两个阶段。文章还介绍了HDFS的结构和数据读写过程,以及MapReduce的工作原理。整体而言,Hadoop提供了分布式计算的解决方案,旨在提高数据访问速度和效率。