开源云计算与 Hadoop
您是否曾想过 Google、Facebook 和其他互联网巨头是如何处理其海量工作负载的?互联网上最大的参与者每天处理数十亿次请求,导致后台处理涉及 PB 级数据集。当然,他们依赖 Linux 和云计算来获得必要的扩展性和性能。Linux 的灵活性与云环境的无缝扩展性相结合,为处理海量数据集提供了完美的框架,同时消除了对昂贵的基础设施和定制专有软件的需求。如今,Hadoop 是开源云计算的最佳选择之一,它为大规模数据处理提供了平台。
简介
在本文中,我们将介绍和分析 Hadoop 项目。该项目已被许多需要处理海量数据集的商业和科学项目所采用。它为云环境中的大规模数据集处理提供了完整的平台,并且易于扩展,因为它可以在异构集群基础设施和常规硬件上部署。截至 2011 年 4 月,亚马逊、AOL、Adobe、Ebay、Google、IBM、Twitter、Yahoo 和几所大学在项目维基中被列为用户。Hadoop 由 Apache 基金会维护,包含一套完整的套件,用于对海量数据集进行无缝分布式可扩展计算。它提供了基础组件,可以在此基础上实现新的分布式计算子项目。其主要组件包括 MapReduce 框架(用于分布式数据处理)的开源实现,以及由分布式文件系统和数据仓库组成的数据存储解决方案。
MapReduce 框架
MapReduce 框架由 Google 创建并获得专利,目的是处理其自己的页面排名算法和支持其搜索引擎的其他应用程序。其背后的思想实际上是多年前由第一批函数式编程语言(如 LISP)引入的,主要包括将一个大问题划分为几个可以单独解决的“较小”的问题。分区和最终的主问题结果由两个函数计算:Map 和 Reduce。在数据处理方面,Map 函数接收一个大型数据集,并将其划分为几个较小的中间数据集,这些数据集可以由集群中不同节点并行处理。然后,reduce 函数获取每次计算的单独结果,并将它们聚合以形成最终输出。不同的应用程序可以利用 MapReduce 的强大功能对大型数据集执行排序和统计分析等操作,这些数据集可以映射到较小的分区并并行处理。
Hdaoop MapReduce
Hadoop 包含 MapReduce 框架的 Java 实现、其底层组件以及必要的大规模数据存储解决方案。虽然应用程序编程主要用 Java 完成,但它提供了 Ruby 和 Python 等不同语言的 API,允许开发人员将 Hadoop 集成到各种现有应用程序中。它的最初灵感来自 Google 对 MapReduce 和 GFS 分布式文件系统的实现,随着社区提出新的特定子项目和改进,它吸收了新功能。目前,Yahoo 是该项目的主要贡献者之一,公开了其内部开发人员进行的修改。Hadoop 及其几个子项目的基础是 Core,它为分布式 I/O 和文件系统提供组件和接口。Avro 数据序列化系统也是一个重要的构建块,提供跨语言 RPC 和持久数据存储。
在 Core 之上,是 MapReduce 及其 API 的实际实现,包括 Hadoop Streaming,它允许以任何所需的语言灵活地开发 Map 和 Reduce 函数。MapReduce 集群由一个主节点和若干工作节点云组成。此集群中的节点可以是任何启用 Java 的平台,但大型 Hadoop 安装主要在 Linux 上运行,因为它具有灵活性、可靠性和较低的总体拥有成本 (TCO)。主节点管理工作节点,接收作业并将工作负载分配到各个节点。在 Hadoop 术语中,主节点运行 JobTracker,负责处理传入的作业和分配节点以执行单独的任务。工作节点运行 TaskTracker,它提供虚拟任务槽,这些任务槽根据其对必要输入数据的访问权限和总体可用性分配给特定的 map 或 reduce 任务。Hadoop 提供了一个 Web 管理界面,管理员可以通过该界面获取有关云中作业和各个节点状态的信息。它还允许通过添加廉价的工作节点来实现快速且轻松的扩展,而不会中断常规操作。
HDFS:分布式文件系统
MapReduce 框架的主要用途是处理大量数据,在进行任何处理之前,首先需要将这些数据存储在 MapReduce 集群可访问的卷中。然而,将如此大的数据集存储在本地文件系统上是不切实际的,在集群中的工作节点之间同步数据则更加不切实际。为了解决这个问题,Hadoop 还提供了 Hadoop 分布式文件系统 (HDFS),它可以轻松地跨 MapReduce 集群中的多个节点进行扩展,利用每个节点的存储容量来提供 PB 级存储卷。它消除了对昂贵的专用存储区域网络解决方案的需求,同时提供类似的扩展性和性能。HDFS 在 Core 之上运行,并完美地集成到 Hadoop 提供的 MapReduce API 中。它还可以通过命令行实用程序和 Thrift API 访问,Thrift API 为各种编程语言(如 Perl、C++、Python 和 Ruby)提供接口。此外,可以使用 FUSE(用户空间文件系统)驱动程序将 HDFS 挂载为标准文件系统。
在典型的 HDFS+MapReduce 集群中,主节点运行 NameNode,而其余(工作)节点运行 DataNode。NameNode 管理 HDFS 卷,客户端查询 NameNode 以执行标准文件系统操作,如添加、复制、移动或删除文件。DataNode 执行实际数据存储,接收来自 NameNode 的命令并在本地存储的数据上执行操作。为了提高性能和优化网络通信,HDFS 实现了机架感知功能。此功能使分布式文件系统和 MapReduce 环境能够确定哪些工作节点连接到同一交换机(即在同一机架中),以在同一机架中的节点之间进行通信的方式分配数据和分配任务,而不会使网络核心过载。HDFS 和 MapReduce 自动管理给定文件的哪些部分存储在每个节点上,并相应地分配节点以处理这些数据。当 JobTracker 收到新作业时,它首先查询同一机架中工作节点的 DataNode,如果节点在本地存储了必要的数据,则分配一个任务槽。如果在机架中找不到可用的槽,则 JobTracker 将分配它找到的第一个空闲槽。
Hive:PB 级数据库
在 HDFS 分布式文件系统之上,Hadoop 实现了 Hive,这是一种分布式数据仓库解决方案。实际上,Hive 最初是 Facebook 的一个内部项目,现在已发展成为一个完全成熟的独立项目,由 Apache 基金会维护。它提供 ETL(提取、转换和加载)功能和 QL(一种类似于标准 SQL 的查询语言)。Hive 查询被转换为在 HDFS 卷上存储的表数据上运行的 MapReduce 作业。这使 Hive 能够处理涉及海量数据集的查询,其性能与 MapReduce 作业相当,同时提供与数据库相同的抽象级别。当对不经常更改的大型数据集运行查询时,其性能最为明显。例如,Facebook 依赖 Hive 来存储用户数据、运行统计分析、处理日志和生成报告。
结论
我们简要概述了 Hadoop 的主要特性和组件。许多大型公司利用云计算的强大功能,依靠该项目来执行其日常数据处理。这是开源软件被用于构建大规模可扩展应用程序同时保持低成本的又一个例子。但是,我们只触及了 Hadoop 背后引人入胜的基础设施及其许多可能用途的皮毛。在未来的文章中,我们将了解如何设置基本的 Hadoop 集群以及如何将其用于有趣的应用程序,例如日志解析和统计分析。
延伸阅读
如果您有兴趣了解更多关于 Hadoop 的架构、管理和应用程序开发的信息,以下是最佳入门资源
- Hadoop:权威指南,Tim White,O'Rilley/Yahoo Press,第 2 版,2010 年
- Apache Hadoop 项目主页:https://hadoop.apache.ac.cn/