海量数据的存储计算和查询模型
海量数据(“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年由创建,2008年达到了web规模的数据处理容量。
Hadoop项⽬现在由Apache管理。随着不断的努⼒,和多个⼦项⽬⼀起共同构成了完整的SMAQ模型。
由于是⽤java实现的,所以Hadoop的MapReduce实现可以通过java语⾔交互。创建MapReduce job通常需要写⼀些函数⽤来实现map 和reduce阶段需要做的计算。处理数据必须能够加载到Hadoop的分布式⽂件系统中。
以wordcount为例,map函数如下(来源于Hadoop MapReduce⽂档,展⽰了其中关键的步骤)
public static class Map
extends Mapper {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = String();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.Token());
context.write(word, one);
}
}
}
对应的reduce函数如下:
public static class Reduce
greenplum数据库extends Reducer {
public void reduce(Text key, Iterable values,
Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += ();
}
context.write(key, new IntWritable(sum));
}
}
使⽤Hadoop运⾏⼀个MapReduce job包括如下⼏个步骤:
1. ⽤⼀个java程序定义MapReduce的各个阶段
2. 将数据加载进⽂件系统
3. 提交job进⾏执⾏
4. 从⽂件系统获取执⾏结果
直接通过java API,Hadoop MapReduce job写起来可能很复杂,需要程序员很多⽅⾯的参与。为了让数据加载和处理⼯作更加简单直接,围绕着Hadoop⼀个很⼤的⽣态系统已经形成。
其他实现
MapReduce已经在很多其他的程序语⾔和系统中实现,详细的列表可以参考.。尤其是⼏个NoSQL数据库已经集成了MapReduce,后⾯我们会对此进⾏描述。
Storage
从数据获取到结果存放,MapReduce都需要与存储打交道。与传统数据库不同,MapReduce的输⼊数据并不是关系型的。输⼊数据存放在不同的chunk上,能够划分给不同的节点,然后提供以key-value的形式提供给map阶段。数据不需要⼀个schema,⽽且可能是⽆结构的。但是数据必须是可分布的,能够提供给不同的处理节点。
存储层的设计和特点很重要不仅仅是因为它与MapReduce的接⼝,⽽且因为它们直接决定了数据加载和结果查询和展⽰的⽅便性。
Hadoop分布式⽂件系统
Hadoop使⽤的标准存储机制是HDFS。作为Hadoop的核⼼部分,HDFS有如下特点,详细参见.:
容错 -- 假设失败是常态允许HDFS运⾏在普通硬件上
流数据访问 – HDFS实现时考虑的是批量处理,因此着重于⾼吞吐率⽽不是数据的随机访问
⾼度可扩展性 – HDFS可以扩展到PB级的数据,⽐如Facebook就有⼀个这样的产品级使⽤
可移植性 – Hadoop是可以跨操作系统移植的
单次写 – 假设⽂件写后不会改变,HDFS简化了replication提⾼了数据吞吐率
计算本地化 – 考虑到数据量,通常将程序移到数据附近执⾏会更快,HDFS提供了这⽅⾯的⽀持
HDFS提供了⼀个类似于标准⽂件系统的接⼝。与传统数据库不同,HDFS只能进⾏数据存储和访问,⽽不能为数据建⽴索引。⽆法对数据进⾏简单的随机访问。但是⼀些更⾼级的抽象已经创建出来,⽤来提供对Hadoop的更细粒度的功能,⽐如HBase。
HBase,Hadoop数据库
⼀种使HDFS更具可⽤性的⽅法是HBase。模仿⾕歌的BigTable数据库,HBase也是⼀个设计⽤来存储海量数据的列存式数据库。它也属于NoSQL数据库范畴,类似于Cassandra and Hypertable。
HBase使⽤HDFS作为底层存储系统,因此也具有通过⼤量容错分布式节点来存储⼤量的数据的能⼒。与其他的列存储数据库类似,HBase
也提供基于REST和Thrift的访问API。
由于创建了索引,HBase可以为⼀些简单的查询提供对内容快速的随机访问。对于复杂的操作,HBase为Hadoop MapReduce提供数据源和存储⽬标。因此HBase允许系统以数据库的⽅式与MapReduce进⾏交互,⽽不是通过底层的HDFS。
Hive
数据仓库或者是使报告和分析更简单的存储⽅式是SMAQ系统的⼀个重要应⽤领域。最初在Facebook开发的Hive,是⼀个建⽴在Hadoop之上是数据仓库框架。类似于HBase,Hive提供⼀个在HDFS上的基于表的抽象,简化了结构化数据的加载。与HBase相⽐,Hive 只能运⾏MapReduce job进⾏批量数据分析。如下⾯查询那部分描述的,Hive提供了⼀个类SQL的查询语⾔来执⾏MapReduce job。
Cassandra and Hypertable
Cassandra和 Hypertable都是具有BigTable模式的类似于HBase的列存储数据库。
作为Apache的⼀个项⽬,Cassandra最初是在Facebook产⽣的。现在应⽤在很多⼤规模的web站点,包括Twitter, Facebook, Reddit and Digg。Hypertable产⽣于Zvents,现在也是⼀个开源项⽬。
这两个数据库都提供与Hadoop MapReduce交互的接⼝,允许它们作为Hadoop MapReduce job的数据源和⽬标。在更⾼层次
上,Cassandra提供与Pig查询语⾔的集成(参见查询章节),⽽Hypertable已经与Hive集成。
NoSQL数据库的MapReduce实现
⽬前为⽌我们提到的存储解决⽅案都是依赖于Hadoop进⾏MapReduce。还有⼀些NoSQL数据库为了对存储数据进⾏并⾏计算本⾝具有内建的Mapreduce⽀持。与Hadoop系统的多组件SMAQ架构不同,它们提供⼀个由storage, MapReduce and query⼀体组成的⾃包含系统。
基于Hadoop的系统通常是⾯向批量处理分析,NoSQL存储通常是⾯向实时应⽤。在这些数据库⾥,MapReduce通常只是⼀个附加功能,作为其他查询机制的⼀个补充⽽存在。⽐如,在Riak⾥,对MapReduce job通常有⼀个60秒的超时限制,⽽通常来说, Hadoop 认为⼀个job可能运⾏数分钟或者数⼩时。
下⾯的这些NoSQL数据库都具有MapReduce功能:
CouchDB,⼀个分布式数据库,提供了半结构化的⽂档存储功能。主要特点是提供很强的多副本⽀持,以及可以进⾏分布式更新。在CouchDB⾥,查询是通过使⽤javascript定义MapReduce的map和r
educe阶段实现的。
MongoDB,本⾝很类似于CouchDB,但是更注重性能,对于分布式更新,副本,版本的⽀持相对弱些。MapReduce也是通过javascript描述的。
Riak,与前⾯两个数据库也很类似。但是更关注⾼可⽤性。可以使⽤javascript或者Erlang描述MapReduce。
与关系型数据库的集成
在很多应⽤中,主要的源数据存储在关系型数据库中,⽐如Mysql或者Oracle。MapReduce通常通过两种⽅式使⽤这些数据:
使⽤关系型数据库作为源(⽐如社交⽹络中的朋友列表)
将MapReduce结果重新注⼊到关系型数据库(⽐如基于朋友的兴趣产⽣的产品推荐列表)
理解MapReduce如何与关系型数据库交互是很重要的。最简单的,通过组合使⽤SQL导出命令和HDFS操作,带分隔符的⽂本⽂件可以作为传统关系型数据库和Hadoop系统间的导⼊导出格式。更进⼀步的讲,还存在⼀些更复杂的⼯具。
Sqoop⼯具是设计⽤来将数据从关系型数据库导⼊到Hadoop系统。它是由Cloudera开发的,⼀个专注于企业级应⽤的Hadoop平台经销商。Sqoop是与具体数据库⽆关的,因为它使⽤了java的JDBC数据库API。可以将整个表导⼊,也可以使⽤查询命令限制需要导⼊的数据。
Sqoop也提供将MapReduce的结果从HDFS导回关系型数据库的功能。因为HDFS是⼀个⽂件系统,所以Sqoop需要以分隔符标识的⽂本为输⼊,需要将它们转换为相应的SQL命令才能将数据插⼊到数据库。
对于Hadoop系统来说,通过使⽤Cascading API中的和也能实现类似的功能。
与streaming数据源的集成
关系型数据库以及流式数据源(⽐如web服务器⽇志,传感器输出)组成了海量数据系统的最常见的数据来源。Cloudera的Flume项⽬就是旨在提供流式数据源与Hadoop之间集成的⽅便⼯具。Flume收集来⾃于集机器上的数据,将它们不断的注⼊到HDFS中。Facebook的Scribe服务器也提供类似的功能。
商业性的SMAQ解决⽅案
⼀些MPP数据库具有内建的MapReduce功能⽀持。MPP数据库具有⼀个由并⾏运⾏的独⽴节点组成
的分布式架构。它们的主要功能是数据仓库和分析,可以使⽤SQL。
Greenplum:基于开源的PostreSQL DBMS,运⾏在分布式硬件组成的集上。MapReduce作为SQL的补充,可以进⾏在Greenplum 上的更快速更⼤规模的数据分析,减少了⼏个数量级的查询时间。Greenplum MapReduce允许使⽤由数据库存储和外部数据源组成的混合数据。MapReduce操作可以使⽤Perl或者Python函数进⾏描述。
Aster Data 的数据仓库系统也提供MapReduce⽀持。MapReduce操作可以通过使⽤Aster Data的技术调⽤。技术可以使SQL查询和通过各种语⾔(C#, C++, Java, R or Python)的源代码定义的MapReduce job组合在⼀块。
其他的⼀些数据仓库解决⽅案选择提供与Hadoop的连接器,⽽不是在内部集成MapReduce功能。
:是⼀个提供了Hadoop连接器的列存式数据库。
:最近由IBM收购。与Cloudera合作提⾼了它与Hadoop之间的互操作性。尽管它解决了类似的问题,但是实际上它已经不在我们的SMAQ模型定义之内,因为它既不开源也不运⾏在普通硬件上。
尽管可以全部使⽤开源软件来创建⼀个基于Hadoop的系统,但是集成这样的⼀个系统仍然需要⼀些努⼒。Cloudera的⽬的就是使得Hadoop更能适应⽤企业化的应⽤,⽽且在它们的 (CDH)中已经提供⼀个
统⼀的Hadoop发⾏版。
查询
通过上⾯的java代码可以看出使⽤程序语⾔定义MapReduce job的map和reduce过程并不是那么的直观和⽅便。为了解决这个问
题,SMAQ系统引⼈了⼀个更⾼层的查询层来简化MapReduce操作和结果查询。
很多使⽤Hadoop的组织为了使操作更加⽅便,已经对Hadoop的API进⾏了内部的封装。有些已经成为开源项⽬或者商业性产品。
查询层通常并不仅仅提供⽤于描述计算过程的特性,⽽且⽀持对数据的存取以及简化在MapReduce集上的执⾏流程。
Pig
由yahoo开发,⽬前是Hadoop项⽬的⼀部分。Pig提供了⼀个称为Pig Latin的⾼级查询语⾔来描述和运⾏MapReduce job。它的⽬的是让Hadoop更容易被那些熟悉SQL的开发⼈员访问,除了⼀个Java API,它还提供⼀个交互式的接⼝。Pig⽬前已经集成在Cassandra 和HBase数据库中。下⾯是使⽤Pig写的上⾯的wordcount的例⼦,包括了数据的加载和存储过程($0代表记录的第⼀个字段)。
input = LOAD '' USING TextLoader();
words = FOREACH input GENERATE FLATTEN(TOKENIZE($0));
grouped = GROUP words BY $0;
counts = FOREACH grouped GENERATE group, COUNT(words);
ordered = ORDER counts BY $0;
STORE ordered INTO 'output/wordCount' USING PigStorage();
Pig是⾮常具有表达⼒的,它允许开发者通过UDFs()书写⼀些定制化的功能。这些UDF使⽤java语⾔书写。尽管它⽐MapReduce API更容易理解和使⽤,但是它要求⽤户去学习⼀门新的语⾔。某些程度上它与SQL有些类似,但是它⼜与SQL具有很⼤的不同,因为那些熟悉SQL的⼈们很难将它们的知识在这⾥重⽤。
Hive
正如前⾯所述,Hive是⼀个建⽴在Hadoop之上的开源的数据仓库。由Facebook创建,它提供了⼀个
⾮常类似于SQL的查询语⾔,⽽且提供⼀个⽀持简单内建查询的web接⼝。因此它很适合于那些熟悉SQL的⾮开发者⽤户。
与Pig和Cascading的需要进⾏编译相⽐,Hive的⼀个长处是提供即席查询。对于那些已经成熟的商务智能系统来说,Hive是⼀个更⾃然的起点,因为它提供了⼀个对于⾮技术⽤户更加友好的接⼝。Cloudera的Hadoop发⾏版⾥集成了Hive,⽽且通过HUE项⽬提供了⼀个更⾼级的⽤户接⼝,使得⽤户可以提交查询并且监控MapReduce job的执⾏。
Cascading, the API Approach
Cascading提供了⼀个对Hadoop的MapReduce API的包装以使它更容易被java应⽤程序使⽤。它只是⼀个为了让MapReduce集成到更⼤的系统中时更简单的⼀个包装层。Cascading包括如下⼏个特性:
旨在简化MapReduce job定义的数据处理API
⼀个控制MapReduce job在Hadoop集上运⾏的API
访问基于Jvm的脚本语⾔,⽐如Jython, Groovy, or JRuby.
与HDFS之外的数据源的集成,包括Amazon S3,web服务器
提供MapReduce过程测试的验证机制
Cascading的关键特性是它允许开发者将MapReduce job以流的形式进⾏组装,通过将选定的⼀些pipes连接起来。因此很适⽤于将Hadoop集成到⼀个更⼤的系统中。 Cascading本⾝并不提供⾼级查询语⾔,由它⽽衍⽣出的⼀个叫Cascalog的开源项⽬完成了这项⼯作。Cascalog通过使⽤ JVM语⾔实现了⼀个类似于Datalog的查询语⾔。尽管很强⼤,Cascalog仍然只是⼀个⼩范围内使⽤的语⾔,因为它既不像Hive那样提供⼀个类SQL的语⾔,也不像Pig那样是过程性的。下⾯是使⽤Cascalog完成的wordcout的例⼦:
(defmapcatop split [sentence]
(seq (.split sentence "+")))
(?<- (stdout) [?word ?count]
(sentence ?s) (split ?s :> ?word)
(c/count ?count))
使⽤Solr进⾏搜索
⼤规模数据系统的⼀个重要组件就是数据查询和摘要。数据库层⽐如HBase提供了对数据的简单访问,但是并不具备复杂的搜索能⼒。为了解决搜索问题。开源的搜索和索引平台Solr通常与NoSQL数据库组合使⽤。Solr使⽤Luence搜索技术提供⼀个⾃包含的搜索服务器产品。⽐如,考虑⼀个社交⽹络数据库,MapReduce可以使⽤⼀些合理的参数⽤来计算个⼈的影响⼒,这个数值会被写回到数据库。之后使⽤Solr进⾏索引,就允许在这个社交⽹络上进⾏⼀些操作,⽐如到最有影响⼒的⼈。
最初在CENT开发,现在作为Apache项⽬的Solr,已经从⼀个单⼀的⽂本搜索引擎演化为⽀持导航和结果聚类。此外,Solr还可以管理存储在分布式服务器上的海量数据。这使得它成为在海量数据上进⾏搜索的理想解决⽅案,以及构建商业智能系统的重要组件。
总结
MapReduce尤其是Hadoop实现提供了在普通服务器上进⾏分布式计算的强有⼒的⽅式。再加上分布式存储以及⽤户友好的查询机制,它们形成的SMAQ架构使得海量数据处理通过⼩型团队甚⾄个⼈开发也能实现。
现在对数据进⾏深⼊的分析或者创建依赖于复杂计算的数据产品已经变得很廉价。其结果已经深远的影响了数据分析和数据仓库领域的格局,降低了该领域的进⼊门槛,培养了新⼀代的产品,服务和组织⽅式。这种趋势在Mike Loukides的""报告中有更深⼊的诠释。
Linux的出现仅仅通过⼀台摆在桌⾯上的linux服务器带给那些创新的开发者们以⼒量。SMAQ拥有同样⼤的潜⼒来提⾼数据中⼼的效率,促进组织边缘的创新,开启廉价创建数据驱动业务的新时代。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论