【SQL开源代码栏目提醒】:本文主要为网学会员提供“SMAQ:海量数据的存储计算和查询模型(译) - 期刊论文”,希望对需要SMAQ:海量数据的存储计算和查询模型(译) - 期刊论文网友有所帮助,学习一下!
SMAQ海量数据的存储计算和查询模型译 海量数据―Big Data‖是指那些足够大的数据以至于无法再使用传统的方法进行处理。
在过去一直是Web搜索引擎的创建者们首当其冲的面对这个问题。
而今天各种社交网络移动应用以及各种传感器和科学领域每天创建着上PB的数据。
为了应对这种大规模数据处理的挑战google创造了MapReduce。
Google的工作以及yahoo创建的Hadoop孵化出一个完整的海量数据处理工具的生态系统。
随着MapReduce的流行一个由数据存储层MapReduce和查询简称SMAQ组成的海量数据处理的栈式模型也逐渐展现出来。
SMAQ系统通常是开源的分布式的运行在普通硬件上。
就像由Linux Apache MySQL and PHP 组成的LAMP改变了互联网应用开发领域一样SMAQ将会把海量数据处理带入一个更广阔的天地。
正如LAMP成为Web2.0的关键推动者一样SMAQ系统将支撑起一个创新的以数据为驱动的产品和服务的新时代。
尽管基于Hadoop的架构占据了主导地位但是SMAQ模型也包含大量的其他系统包括主流的NoSQL数据库。
这篇文章描述了SMAQ栈式模型以及今天那些可以包括在这个模型下的海量数据处理工具。
MapReduce MapReduce是google为创建web网页索引而创建的。
MapReduce框架已成为今天大多数海量数据处理的厂房。
MapReduce的关键在于将在数据集合上的一个查询进行划分然后在多个节点上并行执行。
这种分布式模式解决了数据太大以至于无法存放在单独一台机器上的难题。
为了理解MapReduce是如何工作的我们首先看它名字所体现出的两个过程。
首先在map阶段输入数据被一项一项的处理转换成一个中间结果集然后在reduce阶段这些中间结果又被规约产生一个我们所期望得到的归纳结果。
说到MapReduce通常要举的一个例子就是查找一篇文档中不同单词的出现个数。
在map阶段单词被抽出来然后给个count值1在reduce节点将相同的单词的count值累加起来。
看起来是不是将一个很简单的工作搞地很复杂了这就是MapReduce。
为了让MapReduce完成这项任务map和reduce阶段必须遵守一定的限制来使得
工作可以并行化。
将查询请求转换为一个或者多个MapReduce并不是一个直观的过程为了解决这个问题一些更高级的抽象被提出来我们将在下面关于查询的那节里进行讨论。
使用MapReduce解决问题通常需要三个操作 数据加载—用数据仓库的叫法这个过程叫做抽取extract转换transform加载load简称ETL更合适些。
为了利用MapReduce进行处理数据必须从源数据里抽取出来进行必要的结构化加载到MapReduce可以访问的存储层。
MapReduce—从存储层访问数据进行处理再将结果返回给存储层 结果抽取—一旦处理完毕为了让结果对于人来说是可用的还需要能够将存储层的结果数据进行查询和展示。
很多SMAQ系统都具有自身的一些属性主要就是围绕上述三个过程的简化。
Hadoop MapReduce Hadoop是主要的开源MapReduce实现。
由yahoo资助2006年由Doug Cutting创建2008年达到了web规模的数据处理容量。
Hadoop项目现在由Apache管理。
随着不断的努力和多个子项目一起共同构成了完整的SMAQ模型。
由于是用java实现的所以Hadoop的MapReduce实现可以通过java语言交互。
创建MapReduce job通常需要写一些函数用来实现map和reduce阶段需要做的计算。
处理数据必须能够加载到Hadoop的分布式文件系统中。
以wordcount为例map函数如下来源于Hadoop MapReduce
文档展示了其中关键的步骤 public static class Map extends MapperltLongWritable Text Text IntWritablegt private final static IntWritable one new IntWritable1 private Text word new Text public void mapLongWritable key Text value Context context throws IOException InterruptedException String line value.toString StringTokenizer tokenizer new StringTokenizerline while tokenizer.hasMoreTokens word.settokenizer.nextToken context.writeword one