简介
在过去二十年中,计算能力的稳步增强催生了铺天盖地的数据量,这反过来引起计算架构和大型数据处理机 制的范式转换。例如,天文学中的强大望远镜、物理学中的粒子加速器、生物学中的基因组测序系统都将海量数据交到了科 学家手中。Facebook 每天会收集 15TB 的数据到 PB 级的数据仓库中。在业界(例如,Web 数据分析、点击流分析和网络 监控日志分析)和科学界(例如,大规模模拟产生的数据的分析、传感器部署以及高吞吐量实验室设备),对大型数据挖掘 和数据分析应用的需求都在增加。尽管并行数据库系统适用于这些数据分析应用中的其中一些,但是它们太过昂贵,难以管 理,并缺乏对长期运行查询的容错性。
MapReduce 是 Google 引入的一个框架,用于编程商品计算机集群,以便在 单个传递中执行大型数据处理。该框架被设计为:一个 MapReduce 集群可以通过容错的方式扩展到上千个节点。但是 MapReduce 编程模型有其自身的限制。它的单输入、两阶段数据流过于严格,而且层次过低。例如,即使最常见的运算您都 得编写自定义代码。因此,许多程序员感觉 MapReduce 框架使用起来不自在,而更倾向于使用 SQL 作为一种高级声明式语 言。已经开发了很多项目(Apache Pig、Apache Hive 和 HadoopDB)来简化程序员的任务,并在 MapReduce 框架之上提供 高级声明式接口。
首先了解一下 MapReduce 框架,然后查看向 MapReduce 框架提供高级接口的不同系统的功能。
MapReduce 框架
MapReduce 框架方法的一个主要优势在于,它将应用程序与运行分布式程序的细节分离开来 ,比如数据分布、调度和容错问题。在该模型中,计算功能利用一组输入键/值对,并产生一组输出键/值对。MapReduce 框 架的用户使用两个函数来表达计算:Map 和 Reduce。Map 函数利用输入对,并生成一组中间键/值对。MapReduce 框架将与 同一中间键 I (shuffling) 相关的所有中间值组合起来,将它们传递给 Reduce 函数。reduce 函数收到一个中间键 I 及 其一组值,并将它们合并起来。通常,每个 reduce 调用只产生 0 或 1 个输出值。该模型的主要优势是,支持轻松并行化 和重新执行大型计算以用作主要容错机制。
Apache Hadoop 项目是一个开源 Java 软件,它通过实现 MapReduce 框 架来支持数据密集型分布式应用程序。它最初由 Yahoo! 开发,作为 Google MapReduce 基础架构的一个翻版,不过随后它 变得具有开源性。Hadoop 负责跨计算机集群运行代码。一般而言,当一个数据集增长到超出单个物理机的存储容量时,就 有必要跨大量不同的计算机对其进行分区。跨计算机集群管理存储的文件系统称为分布式文件系统。Hadoop 随附有一个名 为 HDFS (Hadoop Distributed Filesystem) 的分布式文件系统。特别地,HDFS 是跨 Hadoop 集群的所有节点存储文件的 一个分布式文件系统。它将文件分为大数据块并将它们分布到不同的计算机上,为每个数据块制作多个副本,这样一来,如 果有任何一台计算机发生故障,数据也不会丢失。
清单 1 中的 MapReduce 程序使用伪代码表达,用于计算每个单 词在文本行序列中出现的次数。在 清单 1 中,map 函数发出每个单词以及一个相关的发生标记,而 reduce 函数对特定单 词发出的所有标记进行汇总。
清单 1. MapReduce 程序
map(String key, String value): //key: line number, value: line text for each word w in value: EmitIntermediate(w, ?1?); reduce(String key, Iterator values): //key: a word, values: a list of counts int wordCount = 0; for each v in values: wordCount += ParseInt(v); Emit(AsString(wordCount));
现在采用 清单 2 中文本行的输入序列。
清单 2. 输入序列
1, This is Code Example 2, Example Color is Red 3, Car Color is Green
清单 3 显示该输入的 map 函数的输出。
清单 3. map 函数的输出
('This', 1), ('is', 1). ('Code', 1), ('Example', 1) ('Example', 1), ('Color', 1), ('is', 1), ('Red', 1) ('Car', 1), ('Color', 1), ('is', 1), ('Green', 1)
清单 4 显示 reduce 函数的输出(结果)。
清单 4. reduce 函数的输出
('Car', 1), ('Code', 1), ('Color', 2), ('Example', 2), ('Green', 1), ('Red', 1) , ('This', 1), ('is', 3)
对于程序员来说,MapReduce 框架的一个主要特性是,只有两个高级声明原语(map 和 reduce)可以使用选择的任何编程语言编写,而无需担心其并行执行的细节。另一方面,MapReduce 编程模型具有其自 身的局限:
它的单输入、两阶段数据流过于严格。要执行具有不同数据流的任务(例如,联接或 n 阶段),您必须 得想出粗略的解决方法。
即使最常见的运算(例如,projection 和 filter)都得编写自定义代码,这导致代码通 常难以重用和维护。
map 和 reduce 函数的不透明性限制了系统执行优化的能力。
而且,许多程序员不熟悉 MapReduce 框架,倾向于使用 SQL(因为他们对此更精通)作为高级声明式语言来表达其任务,同时将所有执行优化细节留 给后台引擎。此外,不可否认的是,高级语言抽象能够让底层系统更好地执行自动优化。
我们来看一下旨在应对这 些问题的语言和系统,并且在 MapReduce 框架之上添加 SQL 类语言。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索框架
, 数据
, mapreduce
, 函数
, 清单
, mapreduce多路径输出
, 高级语言程序设计
, mapreduc
, hadoop mapreduce编程
, 数据mapreduce网络
, 编程传感器c语言
, 吞吐量hadoop
, 源代码mapreduce
一个
,以便于您获取更多的相关知识。