为MapReduce框架使用SQL类语言:使用高级声明式接口让Hadoop易于使用

简介

在过去二十年中,计算能力的稳步增强催生了铺天盖地的数据量,这反过来引起计算架构和大型数据处理机 制的范式转换。例如,天文学中的强大望远镜、物理学中的粒子加速器、生物学中的基因组测序系统都将海量数据交到了科 学家手中。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
一个
,以便于您获取更多的相关知识。

时间: 2024-10-30 09:07:19

为MapReduce框架使用SQL类语言:使用高级声明式接口让Hadoop易于使用的相关文章

为MapReduce框架使用SQL类语言

它将应用程序与运行分布式程序的细节分离开来.不过很多程序员不熟悉 MapReduce 编程风格,喜欢使用类似 SQL 的语言来执行其任务.本文概述了一些旨在应对这些问题的高级语言和系统,并在 MapReduce 框架之上添加了声明接口 (declarative interface). 在过去二十年中,计算能力的稳步增强催生了铺天盖地的数据量,这反过来引起计算架构和大型数据处理机制的范式转换.例如,天文学中的强大望远镜.物理学中的粒子加速器.生物学中的基因组测序系统都将海量数据交到了科学家手中.F

java-spring框架下jsp脚本语言confirm脚本语言删除数据库中数据怎么做?

问题描述 spring框架下jsp脚本语言confirm脚本语言删除数据库中数据怎么做? spring框架下jsp脚本语言confirm脚本语言删除数据库中数据怎么做,具体说一说怎么写confirm脚本代码?求大神解答啊 解决方案 你的意思是点删除的时候弹出个确认对话框么?再跳一个Action实现真正的删除工作.还是想用ajax的方式实现无刷新删除-- 解决方案二: $(document).ready(function(){ //为注销用户超链接绑定click事件 $(".logoutid&qu

Google宣布将MapReduce框架MapReduce for C开源

摘要: 据GigaOM消息,Google上周宣布,将自己用C++开发的MapReduce框架MapReduce for C(MR4C)开源,此举可给Hadoop社区带来福音,因为这样用户就可以在自己的Hadoop环境中运行原生的C及C++代码了. Google上周宣布,将自己用C++开发的MapReduce框架MapReduce for C(MR4C)开源,此举可给Hadoop社区带来福音,因为这样用户就可以在自己的Hadoop环境中运行原生的C及C++代码了. Hadoop是许多大数据应用的基

hql-hibernate框架 使用sql语句 select count查询不到。。

问题描述 hibernate框架 使用sql语句 select count查询不到.. 代码 String sql = "select count(servId) from "+set; sess=sessionFactory.openSession(); tx=sess.beginTransaction(); Query query = sess.createSQLQuery(sql); BigDecimal count = (BigDecimal)query.uniqueResul

Google 开源 C/C++ 版 MapReduce 框架

据GigaOM消息,Google上周宣布,将自己用C++开发的MapReduce框架MapReduce for C(MR4C)开源,此举可给Hadoop社区带来福音,因为这样用户就可以在自己的Hadoop环境中运行原生的C及C++代码了. Hadoop是许多大数据应用的基础,它是由Apache基金会所开发的分布式系统基础架构,主要由分布式文件系统HDFS和计算框架 MapReduce组成.由于原先的MapReduce是用Java编写的,与C++相比,在性能上要略逊一筹.因此,许多处理大规模数据集

Google开源C/C++版MapReduce框架

摘要: 据GigaOM消息,Google上周宣布,将自己用C++开发的MapReduce框架MapReduce for C(MR4C)开源,此举可给Hadoop社区带来福音,因为这样用户就可以在自己的Hadoop环境中运行原生的C及C++代码了. Google上周宣布,将自己用C++开发的MapReduce框架MapReduce for C(MR4C)开源,此举可给Hadoop社区带来福音,因为这样用户就可以在自己的Hadoop环境中运行原生的C及C++代码了. Hadoop是许多大数据应用的基

Hadoop新MapReduce框架Yarn详解

Hadoop MapReduceV2(Yarn) 框架简介 原 Hadoop MapReduce 框架的问题 对于业界的大数据存储及分布式 处理系统来说,Hadoop 是耳熟能详的卓越开源分布式文件存储及处理框架,对于 Hadoop 框架的介绍在此不再累述,读者 可参考 Hadoop 官方简介.使用和学习过老 Hadoop 框架(0.20.0 及之前版本)的同仁应该很熟悉如下的原 MapReduce 框 架图: 图 1.Hadoop 原 MapReduce 架构 从上图中可以清楚的看出原 Map

zf框架的db类select查询器join链表使用示例

 这篇文章主要介绍了zf框架的Db类select查询器join链表使用示例,需要的朋友可以参考下 zend框架的查询器join()链表使用示例    代码如下: <?php //引入Loader类(自动加载类) require_once("Zend/Loader.php"); //使用Loader类引入一个Db类 Zend_Loader::loadClass("Zend_Db"); //引入Zend_Db的状态器 Zend_Loader::loadClass(

CI框架中zip类应用示例

  CI框架自带的zip类简单实用,本文就来简单说一下CI框架的zip类的使用. 首先需要导入zip类: .代码如下: $this->load->('zip'); 此外,但是考虑到CI的结构,还需要设置一下自动加载类,把zip加载进去. 也可以在设置的时候,统一加载. 大家如果遇到这个问题可能就是自动加载没有加载zip类. 具体调用方法如下: .代码如下: $path = $_SERVER['DOCUMENT_ROOT'];//需要压缩的文件夹路径 $this->zip->read