鉴于Hadoop是一个数据处理框架,而在当前大多数应用中数据处理的主力是标准的关系数据库,那又是什么使得Hadoop更具优势呢?其中一个原因是,SQL(结构化查询语言)是针对结构化数据设计的,而Hadoop最初的许多应用针对的是文本这种非结构化数据。从这个角度来看,Hadoop比SQL提供了一种更为通用的模式。

  若只针对结构化数据处理,则需要做更细致的比较。原则上,SQL和Hadoop可以互补,因为SQL是一种查询语言,它可将Hadoop作为其执行引擎 。但实际上,SQL数据库往往指代一整套传统技术,有几个主要的厂商,并面向一组历史悠久的应用进行优化。许多这些现有的商业数据库无法满足Hadoop设计所面向的需求。

  考虑到这一点,让我们从特定视角将Hadoop与典型的SQL数据库做更详细的比较。

  1. 用向外扩展代替向上扩展

  扩展商用关系型数据库的代价是非常昂贵的。它们的设计更容易向上扩展。要运行一个更大的数据库,就需要买一个更大的机器。事实上,往往会看到服务器厂商在市场上将其昂贵的高端机标称为“数据库级的服务器”。不过有时可能需要处理更大的数据集,却找不到一个足够大的机器。更重要的是,高端的机器对于许多应用并不经济。例如,性能4倍于标准PC的机器,其成本将大大超过将同样的4台PC放在一个集群中。Hadoop的设计就是为了能够在商用PC集群上实现向外扩展的架构。添加更多的资源,在Hadoop集群上意味着增加更多的机器。一个Hadoop集群的标配是十至数百台计算机。事实上,如果不是为了开发目的,没有理由在单个服务器上运行Hadoop。

  2. 用键/值对代替关系表

  关系数据库的一个基本原则是让数据按某种模式存放在具有关系型数据结构的表中。虽然关系模型具有大量形式化的属性,许多当前的应用所处理的数据类型并不能很好地适合这个模型。文本、图片和XML文件是最典型的例子。此外,大型数据集往往是非结构化或半结构化的。Hadoop使用键/值对作为基本数据单元,可足够灵活地处理较少结构化的数据类型。在Hadoop中,数据的来源可以有任何形式,但最终会转化为键/值对以供处理。

  3. 用函数式编程(MapReduce)代替声明式查询(SQL)

  SQL从根本上说是一个高级声明性语言。查询数据的手段是,声明想要的查询结果并让数据库引擎判定如何获取数据。在MapReduce中,实际的数据处理步骤是你指定的,这更类似于SQL引擎的一个执行计划。SQL使用查询语句,而MapReduce则使用脚本和代码。MapReduce允许你采用比SQL查询更为一般化的数据处理方式。例如,你可以建立复杂的数据统计模型,或者改变图像数据的格式。而SQL就不能很好地适应这些任务。

  另一方面,当数据处理非常适合于关系型数据结构时,有些人可能会发现使用MapReduce并不自然。那些习惯于SQL范式的人可能会发现用MapReduce来思考是一个挑战。我希望本书中的练习和示例能帮你更轻松地掌握MapReduce编程。不过值得注意的是,这里还有很多扩展可用,它们允许人们采用更熟悉的范式来编程,同时拥有Hadoop的可扩展性优势。事实上,一些扩展会允许你使用一种类似SQL的查询语言,并自动将查询编译为可执行的MapReduce代码。我们将在第10章和第11章介绍其中的一些工具。

  4. 用离线批量处理代替在线处理

  Hadoop是专为离线处理和大规模数据分析而设计的,它并不适合那种对几个记录随机读写的在线事务处理模式。事实上,在本书写作时(以及在可预见的未来),Hadoop最适合一次写入、多次读取的数据存储需求。在这方面它就像SQL世界中的数据仓库。

  你已经从宏观上看到Hadoop与分布式系统和SQL数据库之间的关系。那么,让我们开始学习如何用它来编程。为此,我们首先需要了解Hadoop中MapReduce的范式。

摘自《Hadoop实战》