MapReduce and the Data Scientist翻译

来源:互联网 发布:ios的一个编程游戏 编辑:程序博客网 时间:2024/04/29 19:14


【说在前面的话】:这篇文章是由BI Research的Colin White所著,我觉得是对MapReduce的介绍比较好的文章,所以翻译出来帮助学习,如果有碍版权,当即使删除,仅供个人学习使用。

【正文】

大数据和分析大数据是一项重大的新闻。分析大数据的技术演进得非常快速,一些新的分析方法引起了众多的关注,例如Hadoop MapReduce和Hive以及在RDBMS上扩展MapReduce。

这篇文章分析了大数据的益处以及数据科学家在部署大数据解决方案中应该承担的角色。本文讨论了Hadoop MapReduce和Hive以及在RDBMS上扩展MapReduce各自的优点。而且给出一套场景来显示Hadoop和RDBMS如何共存来获得大数据和大数据分析对业务和数据科学家的益处。本文用MapReduce在Aster Database上的实现,并将其作为MapReduce在RDBMS上实现的案例。

一、    大数据的重要性

关于大数据的主题频繁地承上杂志封面,吸引了业务人员和IT人员的眼球。这样的结果是大数据变成一个过度包装过度使用的商业化语言。不过这里仍然要给出一个从分析层面的定义:

“是一种用于分析工作和数据管理的解决方面,能解决以前因为成本或技术限制而无法实现的需求。”

这种解决方案通过更聪明和更及时的决策而获得显著的商业效益。公司投资到这些分析处理技术和产品上将能很快获得利益。

更聪明的决策来自于分析新的数据源,并用其增强现有利用操作型系统和数据仓库中的结构化数据建立的分析和预测模型。大数据产品强调对传感器数据、网页日志数据、SNS数据、文档等多种非结构数据的分析。至今这些数据都很难利用传统的分析工具和技术来进行处理分析。

大数据方案能支撑快速的决策是因为其对大规模细节数据的快速分析能力。以前分析海量细节数据由于时间太长或者费用太高而变得困难。为了解决这个问题,企业通常不得不使用汇总数据或者抽样的细节数据来做分析,但是这样一来增加了数据的延时,二来降低了数据的价值。【一经似乎很符合这个关于“以前”的描述】

之所以能做到快速推向市场,是因为企业现在可以在EDW只之外去处理和分析数据。通常不可能将传感器产生的数据或者系统生成的日志导入到数据仓库中,那样不现实也不经济。然而很多情况下,这些数据中能生成一小撮具有很高价值的数据,然后再集成到数据仓库中。

为了从大数据中获取最大的价值,企业需要建立一个“探索性分析平台”,让业务人员(例如数据科学家)来收集、组织和分析大数据,并从中抽取有用的商业信息,这些信息通常不容易在其处于原始格式的时候被发现。

二、    数据科学家的角色

跟大数据紧密相关的角色是数据科学家。Daniel Tunkelang,LinkedIn公司的首席数据科学家说:“数据科学家从大数据中寻找价值,提供取悦用户的产品,洞察商业决策。”

数据科学家将他们的业务技能和技术技能组织在一起,深入分析大数据,找到改善当前业务分析和预测分析的模型,并发现新的商业机会。数据科学家和BI的业务人员的最大的区别就是,业务人员知识分析哪些已经存在的业务和活动,而数据科学家擅长发现新的商业机会。【这个。。。说得太好了,否则就谈不上深入分析investigate】

数据科学家需要很多技能,包括:

l  商业领域的经验和很强的分析技能

l  创造性和良好的沟通能力

l  在统计分析、机器学习和数据可视化方面的知识

l  利用建模和分析工具来开发数据分析方案的能力,比如使用MapReduce、R、SAS等

l  熟悉数据工程学,包括探索和合成大量的数据

很少有人拥有上面的所有经验,这也是为什么数据科学家如此之少的原因。在大多数的公司,与其苦苦寻找这样的专家,不如建立一个团队来融合这些技能。

数据科学家用“探索性分析平台”将为建模的数据(例如,非结构的数据)装载进来进行试验。这些数据的存储是分离,但是联系到传统数据仓库环境中的。在某些情况下,已经建模的数据还需要从数据仓库中加载到该平台上来。如下图所示。

数据分析工具被用来处理该平台上的数据,并试验各种不同的分析方案。最终的结果可能被加载到现有的BI/DW中,或者部署一个相对于现有BI/DW的工作台独立的工作前台(business area solution),采取后者可能因为技术、性能或者成本的考虑。

关于数据科学和探索型分析平台的概念并不新。例如统计分析和数据挖掘的专家很多年前就开始用预测模型进行风险分析、欺诈检测等。关于数据科学新的概念是利用大数据、分析大数据来广泛地解决业务问题,它将以前被认为是秘密和专门的技能带了进来。然而为了让数据科学变得更成功,重要的是软件提供商应该聚焦于将大数据工具变得更易被使用,以便更多的业务专家来使用他。

大数据在以下三个方面扩展了传统分析的范围:

l  新的数据,支持非结构的数据

l  新的分析技术,利用MapReduce和数据库内分析技术来式的分析非结构数据成为可能

l  完善数据管理功能和性能,提高利用非关系系统(例如Hadoop)、RDBMS和软硬一体机来处理非结构数据的性价比。

接下来的文章更详细地讨论了这些技术。

三、什么是MapReduce?

MapReduce是Google带来的一项技术,它可以在一个大的计算机集群上处理大规模的非结构数据。依靠将处理分成多个单元,让它们并行地执行在成百上千的计算节点上。在Google的论文中,MapReduce被描述为:

MapRedcue是一种编程模型,以及一个处理和生成大数据集的相关实现。程序被写成函数式,并且自动并行执行在一个大规模的通用计算机集群上。这允许没有任何并行和分布式系统编程经验的程序员轻松地利用大规模分布式系统的资源。”

从上面的话中,我们可以看到一个关键点是MapReduce是一个编程模型,而不是一种程序设计语言。他是被程序员使用的,而不是业务人员。下面这个例子说明了MapReduce是如何工作的。

【下面介绍图上操作的话就省略了】

四、为什么使用MapReduce?

MapReduce帮助企业处理和分析大规模的非结构数据。例如索引和检索、图形分析、文本分析、机器学习、数据转换【这个难道是指ETL的T?】等等。这些类型的应用以前是比较难以通过关系数据库,利用标准SQL来实现的。

MapReduce的自然特性让有相关技能的程序员很快能理解它。同样它也有利于在并行计算方面毫无经验的开发者使用,那些事情都由系统做了,对开发者透明。虽然MapReduce是为程序员设计的,但是其他人则可以使用那些已经预先编译好的MapReduce程序包或者函数库。商业和开源的MapReduce函数库可以提供许多的分析功能。例如Apache Mahout,这个开源的机器学习函数库包含了聚类、分类等用MapReduce实现的算法。

五、如何利用MapReduce进行应用开发

MapReduce的程序通常用Java编制,但是也可以被C++、Perl、Python、Ruby和R等语言编写。这些程序可以处理存储在不同的文件和数据库系统中的数据。例如在Google中,MapReduce执行在其GFS之上。

MapReduce的主要部署平台是Apache软件基金会提供的开源Hadoop并行计算框架。Hadoop支持MapReduce运行在多种文件系统之上,包括Hadoop的HFDS(模仿的GFS)。Hadoop也提供了Hive和Pig,这种高级语言可以自动生成MapReduce程序。一些软件提供商提供了开源和商业版本的Hadoop,例如Cloudera, DataStax, Hortonworks(Yahoo的子公司)和MapR。其中很多都加入了自己的扩展和对开源的Hadoop的修改。

另一个方向就是将MapReduce运行在关系数据库之上。这就是“库内分析”的实现方式,可以在SQL语句中使用。这些函数运行在数据库系统内部,可以享用DBMS的并行处理能力。Teradata Aster MapReduce平台就提供这样的能力,Aster Database提供了一系列内建的使用SQL的MapReduce函数。同时它也提供了一个交互式开发环境——Aster Developer Express,程序员通过这个环境可以创建他们自己的MapReduce程序。

使用Hadoop进行MapReduce开发

拥有大量非结构数据的企业发现利用传统RDBMS技术来处理和分析这些数据很困难。特别是对那些互联网企业,例如Google、Yahoo、Facebook和LinkedIn,他们需要处理超大规模的数据(通常上PB),而且这些数据需要及时、低成本地进行处理。为了解决这些问题,一些这样的企业就开发了他们的非关系系统。例如Google就开发了MapReduce和GFS,同时也开发了一个名为BigTable的数据库系统。

有很多不同类型的非关系系统,每种都对应了不同的数据集和处理特性。本文主要关注Hadoop和其MapReduce在分析处理方面的作用。非关系系统并不是新事物,它们存在的年底甚至要早于关系数据库系统。最近新的方式是将这样的系统部署在一个大规模、可伸缩的通用计算机集群上,并在开源社区中作为开源软件提供。

Hadoop的介绍

Apache Hadoop包含了一系列组件,有关数据库和分析处理的包括:HDFS、MapReduce、Pig、Hive、Hbase、Sqoop。【关于每个的简要介绍省略】

HDFS可以作为MapReduce的源和目标文件系统。它特别适合少量非常大的文件。HDFS中通过副本机制实现高可用,这当然增加了裸存储的数量。默认的副本数量是3。第一个副本写在一个节点上,第二个写在同机架的另一节点上,第三个写在不同机架的节点上。如果在程序运行过程中节点失效,HDFS简单地提供另一个数据存放的地方。

只要有可能,Hadoop的MapReduce框架就将Map程序就近地在HDFS数据所在的节点运行,以此来减少节点间的数据移动【似乎有一个移动计算比移动数据容易的说法】。在执行中,Map和Reduce程序将中间结果写在本地文件系统中,减少HDFS复制部分的负荷。如果某个Map和Reduce失败,那么它将被框架重新提交到其他节点。

HDFS支持多个读取器和一个写入器。写入器仅能在文件的结尾添加数据,所以它不能支持修改一个现有的文件,只能追加【这个是事实吗?需要确认】。HDFS不能提供索引机制,这意味着它最适合只读的、需要读取文件所有内容的应用(比如MapReduce)。在HDFS文件中,一个数据实际存储的位置是对应用和外部软件透明的。所以在HDFS之上构建的软件只有些许的对数据放置位置的控制权和知识,这使得他们的性能优化较难。

开发者在Hadoop上开发Map和Reduce程序的时候使用底层的编程接口。Hadoop提供了Java的API。C++程序员则需要利用Hadoop的管道机制,这种机制利用一个Socket接口跟Hadoop MapReduce和HDFS通信。其他语言写成的程序利用Hadoop Streaming,这个组件使得开发者可以利用任何语言和脚本来创建MapReduce任务。MapReduce任务运行在并行分布式集群上。Hadoop MapReduce框架处理调度、执行和恢复工作。

虽然Hadoop MapReduce提供了处理大规模数据的能力,但是利用底层语言来编写Map和Reduce程序是一项花时间而且需要技能的工作。FaceBook 的Ashish Thusoo在他2009年7月发表的文章中如此解释为什么FackBook开发了Hive这种高级语言来执行MapReduce:

Hadoop对最终用户不易用,特别是那些不熟悉Map和Reduce的人。Hadoop缺少向SQL那样能快速执行查询语言的能力,用户不得不华商几个小时(或几天)来编写典型的分析程序。对于我们来说,让整个企业更有生产力地分析数据是非常重要的,我们不得不提升Hadoop的查询能力。使数据离用户更紧的目的是促使我们开发Hive的原因。”

利用Hive来进行MapReduce开发

Hive是几种实现MapReduce应用的高级语言之一。另外两个是Pig和JAQL。Pig由Yahoo开发,现在成为一个Apache Hadoop项目。它包括了Pig Latin,这是一种高级数据流控制语言,用来生成MapReduce应用。它有程序式和交互式(就像交互式SQL一样)两种语句,在某些地方很像第四代编程语言Focus、 Nomad和SAS。而JAQL是一种为JSON(Javascript Object Notation)设计的查询语言,JSON是一种因为简单性而越来越流行的数据格式。JAQL由IBM为其BigInsights产品开发。虽然IBM将其放入了开源社区,但是除了IBM环境外,它很少得到支持。

本文聚焦Hive是因为它在业界的接受度更高,也因为它的SQL风格语言让它变得对那些熟悉SQL的非编程人员更易使用。文中很多关于Hive的结论,同样适用于Pig和JAQL以及其他类似的查询语言。

Hive的主要组件如下图所示。HiveQl语句可以通过命令行或者WEB界面输入,也可以嵌入到程序中通过HIVE提供的ODBC和JDBC来使用。Hive驱动系统将查询语言转换为一系列的MapReduce任务。

数据文件在Hive中被看作表的形式,因为列被用来代表字段,行被用来代表记录。表则根据一个或多个列进行垂直分区。每个分区中的数据存储在一个特别的HDFS文件中。数据在装入HDFS的时候并不进行分区定义的校验【没看懂,待了解】。分区还可以依照一个或多个列的数据的哈希值来分到多个桶中。每个桶被存储在一个特别的HDFS文件中,用来抽样数据或者建立Hive的索引。Hive表不支持主键和外键或其他任何约束。所有的定义都维护在Hive元数据库中,后者是一个关系数据库,例如MySQL。

Hive支持的数据类型包括整数、浮点数、字符串和逻辑类型。在Hive 0.8.0中提供了日期时间类型。Hive也支持复杂类型,比如数组(索引列表),图(键值对),结构和用户定义的类型。

外部HDFS文件可以在Hive中被定义为外部表。Hive也可以访问存储在其他文件或数据库系统(例如HBase)中的数据。通过一个存储处理模块,这些存储中的文件在Hive中表示为非原生表。HiveSQl支持对这些非原生表就像原生表一样访问,当然有一些限制。

HiveQL支持SQL SELECT语法的一个子集,包括:Join(等值连接、外连接、左连接)、Union、From中的子查询、操作符(关系、算数和逻辑)、函数(算数、字符串、日期、XPath和用户自定义函数、聚集函数和表函数)。

Hive的MAP和REDUCE操作符可以用来将自定义的MapReduce脚本嵌入到HiveQl查询中。支持INSERT语句,但只能用来装载或者覆盖一个完整的表或表分区的情况。SQL中的UPDATE和DELETE则不被支持。

当将Hadoop的Hive和RDBMS的SQL进行比较的时候,需要考虑两个问题:查询的语法和查询的性能。查询的语法是来自RDBMS的,虽然Hive提供的是SQL的子集(或一点点的超集),但是现有的SQL程序和应用可以经过很少的修改就能运行在Hive上。

也许在Hive和RDBMS上最重要的比较是性能。我们可能考虑将传统的短的和即席的SQL查询在两个平台上的运行进行比较,也可能比较Hive的MapReduce和构建在RDBMS之上的MapReduce在处理大规模非结构数据时的性能。知道Hive和RDBMS是如何处理这些查询的对我们讨论两种方式的性能是有利的。

Hive提供了一个SQL包装器在Hadoop的HDFS(或其他存储系统)之上。它无法控制或知晓HDFS文件的位置。Hive的优化器利用规则来将HiveQL查询转换为一系列可以在Hadoop集群上运行的MapReduce任务。在HiveQL中的注释可以帮助查询优化工作,例如改善JOIN的性能。

Hive产生的MapReduce任务顺序扫描存储Hive表的HDFS文件。Hive优化器知道表是如何进行分区和分桶的,所以表分区和桶可以用来降低扫描的数据量。Hive支持紧凑索引(0.7.0)和位图索引(0.8.0),它们可以帮助单值和范围查询,也可以使某些查询指靠索引来实现。因为Hive不知道HDFS文件中的数据的物理位置,所以Hive的索引中包含的是数据本身,而不是数据的指针。在表中分区数据更新后,一个表的索引需要重建。另外Hive也支持索引的分区。Hive的索引用于提高传统SQL方式的查询的性能,而不是用来提高MapReduce查询的性能,后者可以自然地顺序处理。

Hadoop Hive的最主要的用途是用来执行Hadoop的MapReduce,它可以顺序处理像WEB日志这样非常大规模的非结构数据。它不能很好地完成用户期望快速响应的即席查询的工作。在Apache Hive Wiki中,对Hive的定位做了如下恰当的描述:“Hive不是为了OLTP的负载而设计的,不能提供实时查询或者行级更新。它最适合在大规模追加模式数据(例如WEB日志)上的批处理任务。Hive的价值在于可伸缩(在Hadoop集群中动态加入新的节点)、可扩展(利用MapReduce框架以及用户自定义函数)、容错以及与输入数据格式的松耦合”

Hive的好处是其显著地提升了MapReduce开发的简单性和速度。Hive优化器使得处理相关的文件比手工编写MapReduce程序逻辑要更容易。然而Hive优化器仍然不成熟,不能完全屏蔽底层系统,这意味着对于很多复杂的查询Hive用户仍需要频繁通过注释和某种HiveQLde语言结构来帮助优化器执行。

还有许多其他的工具用来提升Hadoop的易用性,例如Informatica的Hparser用来进行数据转换,Karmasphere Studio、 Pentaho Business Analytics 、Revolution RevoConnectR 用来进行分析处理。这些工具是Hadoop MapReduce的前端,所以上述的对于Hive的许多分析同样适用于这些产品。

RDBMS上的MapReduce开发

在讨论RDBMS如何支持MapReduce之前,比较一下Hadoop Hive和一个RDBMS如何处理查询是有用的。如下图所示:

左边显示了Hadoop Hive如何处理的。Hive的规则驱动优化器对HiveQL语句进行解释,并生成一个或多个MapReduce任务。这些任务被推送给Hadoop系统,由Hadoop的Job和Task Tracker进行你个调度和执行。MapReduce任务读取和处理HDFS上的数据,然后将结果传回Hive应用。

RDBMS的SQL处理如右边所示。关系映射层提供了一个在数据逻辑模型和物理数据模型之间的接口。通常数据的逻辑和物理模型是完全分离的,这样可以提供透明性。就像之前讨论的那样,Hadoop Hive并不是这样完全透明的,这减少了数据的独立性,但是让开发者可以控制某些复杂查询的实际执行。

RDBMS的数据独立性使得提供商可以扩展和添加执行和存储引擎而不影响现有程序。一开源的MySQL为例,它提供了数种数据存储引擎。商业软件提供商也添加了新的数据存储引擎来支持XML数据,或者支持OLAP应用。Teradata Aster Database提供了一个支持MapReduce的执行引擎,还有一个可以支持行存储和列存储的数据引擎。

RDBMS执行和存储引擎的灵活性的另外一个优点是软件提供商控制从存储到应用的完整数据流。这是的RDBMS可以控制数据的放置位置,可以添加类似索引、列存储、混合存储、缓存管理和负载管理等性能特性,而不影响现有应用。许多提供商也提供管理工具和特性的扩展集来进行安全管理、备份和恢复、可用性管理(不通过副本方式)等。这跟Hadoop Hive是不一样的,因为Hive只对其存储数据的HDFS有很少的控制权,这是的性能调优比较困难。当然,由于Hive是新生事物,所以缺少管理工具。

虽然RDBMS的数据独立性让非程序员的一般用户感到轻松,但是其不利之处是有经验的开发者也没有或只有一点点控制数据如何被访问和被处理的方法。他们不得不依赖RDBMS的优化器来做出数据如何被访问的正确决定。开发者不得不用处理关系化结果到一次一条记录的程序化编程的转换。这是为什么许多高级编程人员不喜欢使用说明性语言,例如SQL,这种语言只能说明哪些数据需要被处理,而不能表明它将如何被处理。程序员偏向利用程序化编程手段来获得对数据的更多的控制。为了解决这个问题,一些RDBMS中提供了用程序设计语言(例如JAVA)编写用户自定义函数的能力,让他们可以利用MapReduce技术。

RDBMS花了许多时间和精力用来改善SQL优化器的质量。如今许多RDBMS利用复杂的,基于成本的优化器,依靠数据的统计信息来决定最合适的执行计划。它们通常动态改写用户提交的SQL以便提升性能。如果没有这些努力,那么关系数据库的SQL优化器就不会表现得那么出色。但是有一些类型的查询和一些数据类型是难以用优化器获得较好性能的。例如设计到金融时间序列信息和社交网络图分析的查询。R/20顾问Rick van der Lans在他的“Using SQL-MapReduce® for Advanced Analytical Queries.”论文中指出了更多这样的案例。

为了克服这些优化器的问题并扩展SQL的范围,一些RDBMS产品提供给开发者添加用户自定义函数或过程的能力。它们可能利用脚本语言(其中一些是私有的)或像JAVA或C++这样的编程语言写成。一些产品添加了交互式编程环境来帮助开发这些函数或过程。多数RDBMS提供了一定的预定义函数。第三方提供商,例如FuzzyLogix和Revolution Analytics,也提供了对某些RDBMS产品的分析函数库产品。

用户自定义函数和产品中的预定义函数的好处是SQL使用人员,例如那些数据科学家,仅仅需要知道这些函数如何使用就可以了。他们不需要知道如何编写这些函数。这减少了数据科学家需要的技能,也提供了快速使用的方法。

SQL语句中的用户自定义函数对于SQL优化器来说是一个黑盒。优化器所要做的所有事情只是创建一个执行计划来将数据提供给这些函数,并处理结果数据。所以,明白执行引擎如何处理这些函数是非常重要的。是DBMS还是一个外部的执行引擎在执行这些函数?函数有没有用到DBMS的并行处理能力?函数是运行在一个与DBMS独立的内存空间来隔离错误避免对DBMS性能和可用性的影响吗?

MapReduce的流行和对其与日俱增的关注是的一些RDBMS提供商来是在DBMS中支持MapReduce函数。这种能力不仅提供了上述用户自定义函数的便利,同时在RDBMS环境中增加了MapReduce的优点,例如利用SQL处理非结构的数据。同时它也将RDBMS技术的成熟带给了MapReduce处理。

Teradata Aster Database就是一个例子,在本文中用这个产品来解释MapReduce是如何被RDBMS支持的。

Teradata Aster MapReduce平台

Aster Database在RDBMS中使用MapReduce的领导者之一。SQL和MapReduce配合形成的SQL-MapReduce能力提供了一个在结构化和非结构化数据运行复杂分析的框架。同时,SQL-MapReduce保留了SQL的说明性语言和存储独立性特点。同时利用MapReduce的程序化方法扩展了SQL的分析处理能力。Aster Database的一个关键目标是让利用现成打包的MapReduce函数来实现分析功能对缺少经验的用户变得简单,不需要知道这些函数是如何被编写的。

SQL-MapReduce函数由Aster Database环境中提供的一个独立的执行引擎负责自动地在集群所有节点上并行执行。SQL-MapReduce工具包含了一个预置的分析函数库来加快分析应用的部署。这些函数包括包括路径分析、模式匹配、统计分析、图形分析、文本分析和分群算法,也有用于数据转换【ETL?】的。自定义函数可以用一系列的语言来编写,包括C、 C++、 C#、 Java、Python、Perl,、R,它们可以在批处理环境和交互式环境中使用。一个名为Aster Developer Express交互式开发环境工具【其实我觉得IDE应该是集成开发环境,可能老外搞错了】被用来减少编译和测试函数的工作量。这个工具也可以被用来将现有的Java的MapReduce程序导入进来,然后经过很少的修改用来执行在Aster Database中。

下表的SQL查询显示了Aster Database中预置的nPath函数,用来处理WEB日志的点击流数据,并确定该网站中从主页(page_id=50)直接访问某类页面(page_cat_id=90)的用户数。

原创粉丝点击