《big data glossary》之MapReduce
本文是对《big data glossary》第三章MapReduce的个人翻译,无版权
在传统的关系数据库世界中,所有的处理都发生在信息被载入存储之后,使用特定的查询语言处理高度结构化和优化的数据结构。而由Google引领,然后被许多其他网络公司所接纳的替代方式是:创建一个读写任意格式文件的流水线,在每个阶段以文件的方式交换中间结果,并且跨机器分布计算。通常基于MapReduce方法进行分布式工作的方法都需要一套全新的工具,我将在下面介绍。
最初是由Yahoo!开发的一套Google MapReduce架构的克隆系统,但随后被开源。Hadoop帮助你的代码在跨机器的集群上运行。它负责对输入的数据分块,并发送到各自对应的机器,在每个分块上运行代码,监测运行的代码,将结果发送到下一步的处理阶段或者最终存储下来,执行发生在map和reduce阶段间的排序工作并将排序后的数据发送到对应的机器上,为每一个job进程记录调试信息,等等。
从上面的需求清单上你可以猜到它是一个相当复杂的系统,但是谢天谢地它已经被大量的用户在实战环境中应用。系统底层内部运行了很多东西,但是作为一个开发者,绝大部分时间中你只需要提供运算代码和数据,系统就能够工作。由于它的流行意味着存在一个巨大的相关工具生态圈,有的帮助你编写一个单独的处理步骤,有的帮助你编写需要许多输入和步骤的复杂job。作为一个初学者,起步的最好方式是使用你青睐的脚本语言,学习编写一个streaming job,因为这样可以让你忽略真实场景下面运行的复杂细节。
作为一个成熟的项目,Hadoop的最大的一个优势就是收集调试信息和它的内置工具集。绝大部分这类信息是可以通过网页界面访问的,它可以保存所有进行中和结束的任务细节,并让你能够深入分析错误和警告日志文件。
• Running Hadoop on Ubuntu Linux
通过Hive,你可以使用SQL来编写Hadoop任务。对于来自关系数据世界的开发人员来说,这是一个伟大的接口,尽管一些底层的实现没有完全被隐藏。你依旧需要关注一些不同,比如为了优化性能需要指定最优的关联方式以及一些漏掉的语言特性。对于不适合SQL的场景,Hive并不提供自定义代码的插入,以及很多处理输入和输出的工具。要使用它,你需要先设定结构化的表来描述你的输入和输出,使用装载命令载入你的文件,然后就像在其它关系数据库做的那样,编写你的查询。一定要知道,因为Hadoop关注的是大规模数据处理,在延迟上即便是简单任务也需要花费好几分钟才能完成,所以他不能替代实时交易数据库。
Apache Pig项目是一个为Hadoop设计的过程式数据处理语言。相对于Hive的编写逻辑驱动的查询方式,你可以使用Pig完成数据上的一系列操作步骤。它更接近日常的脚本语言,却拥有一系列协助解决通用数据处理问题的特殊工具函数集。比如它能够轻易的将文本分解为多个组成单元,然后你就可以统计每一个出现次数。其它常用的比如过滤和连接操作也是支持的。Pig通常适合用于过程式处理的问题上,你需要典型的数据处理操作而不是通用计算。Pig由于常常被用来组合使用脚本语言编写的流式代码,所以它被描述为“大数据的胶带”。
绝大部分的实际Hadoop应用由一系列的处理步骤构成,Cascading让你能够定义它们间的复杂工作流顺序。你可以布局你需要的数据流水线的逻辑流程,而不是显式的指定每个Map-Reduce间的级联关系。你通过调用Java API的方式将代表你要执行的操作对象在流程图中连接。系统根据定义,完成检测和规划后,就在Hadoop集群中进行执行。它内置了很多通用操作对象比如:排序(sorting)、集合(grouping)和连接(joining),并且你可以编写自己的对象来执行特定的处理代码。
Cascalog是用Clojure语言编写的函数式数据处理接口程序。由于受到曾经的Datalog语言的影响以及构建在Cascading框架之上,它让你可以在高层抽象上编写你的处理代码,而系统帮你把它们组装成Hadoop任务。它能帮助你轻松完成任务的迁移:将执行在本地小数据集上的测试代码迁移到真实的Hadoop集群生产任务上。Cascalog从Cascading那里继承了相同的输入输出接口方法和处理操作,并且函数式编程能够以看似自然的方式指定数据流。它是cascading-clojure(Cascading最初的Clojure封装)的远亲。
Mrjob框架协助你编写数据处理的代码,并且无缝地在本地,或者Elastic MapReduce(来自Amazon)或者你自己的Hadoop集群上运行。因为它使用Python进行编码,它不能象基于Java的Cascading一样,提供同样层次的抽象或者内嵌操作。任务格式被定义为一系列的map和reduce步骤,每一个都使用Python函数实现。它是一个很棒的任务执行框架,甚至允许你将调试器连接到本地运行的程序,这样你就能够真正的知道你的代码究竟发生了什么。
Caffeine
Caffeine
虽然没有更进一步的技术细节被公布出来,我还是把Google的Caffeine项目包括了进来,根据很多推测,它替代了MapReduce模式。通过一些报告和公司的评测,Google正在使用新版本的Google文件系统,它可以支持更小的文件和分布式master。Google貌似已经废弃了批处理的方式来创建他的搜索索引,取而代之的使用动态数据库的方式来加速更新。没有迹象表明Google使用的新算法,象MapReduce一样广泛应用,因此我正在探听它新架构的更多信息。
Yahoo!最初选择开发S4系统是为了决定广告的甄选和排序,但是当公司发现它能用于处理任意流事件后将它开源。S4能够让你编写代码来处理持续的流事件,他分布式的运行在集群上,使用ZooKeeper框架来处理内部细节。你用Java语言编写数据源和处理代码,S4负责处理系统内,靠广播方式发送的数据事件,以及可用节点间的动态负载均衡。为了能够实现构建在快速变化内容上的准实时搜索引擎,它关注低延迟结果的快速返回。这让它和Hadoop以及通用的MapReduce方法有明显的不同,后两者都有流水线内的同步步骤和较高数量级上的延迟。一个需要注意的事情是S4使用UDP协议,所以它不提供流水线内数据的传输可靠性。它通常的做法是调整队列大小来避免数据丢失,但是对于应用开发者来说调整系统来达到所需的可靠性要求是个负担。
MapR是Hadoop面向企业级应用的商业版本。它包含了一个自己的文件系统来替换HDFS,以及一些对框架的其它调整,比如为了改善可靠性做的分布式name node。新的文件系统目标是提供更高的性能,以及更便捷的备份方式和更兼容NFS使得能够更容易的将数据输入和输出。编程模型依旧是标准的Hadoop方式,重点是改善核心架构周边的结构来满足企业级用户的诉求。
类似MapR,Acunu是替代传统文件系统的底层数据存储层,尽管它最初的目标是Cassandra而不是Hadoop。依靠被称为Castle的核心键值存储代码(已开源),该系统能够在很多情况下带来优秀的速度提升。除开性能的提升,它还有优秀的数据结构。Acunu也提供了某些商业软件的传统优点,比如自动的配置和其它的管理工具。
Hadoop的一个非常普遍的使用就是从大量服务器上获取网络服务器或者其它日志,然后定期的处理它们并产出分析结果。Flume项目的设计目标就是让数据收集的过程简单和可扩展,它通过运行在数据源服务器上的代理端将数据传输给收集服务器,而收集服务器将数据汇总为较大的数据块使得能够被更高效的写入HDFS。它可以通过命令行进行配置,支持一些通用操作,比如监测文件的改变,监听网络socket,并且可以通过调节可靠性保证参数的方式来让你在性能和潜在的数据丢失间平衡。
Kafka是一个相对较新的项目,目标是在生产者和消费者之间发送大量事件。最初构建是为了连接LinkedIn网站的后端系统,功能介于S4和Flume之间。不同于S4,它提供事件的持久化和比Yahoo!基于UDP协议的系统更安全的发送方式,同时它试图保持它的分布式特性和低延迟。能够以非常类似Flume的方式进行使用,保留了它的高吞吐量,但可以更灵活的创建多个客户端,以及更聚焦在并行方向上的底层架构。Kafka依赖ZooKeeper来保持对分布式处理进程的跟踪。
使用这些新的数据工具构建一个可工作的系统最诡异的部分就是整合。独立的服务需要被绑定进一系列的操作中,从而被你的商业逻辑所驱动,然而建造这种管道是惊人的耗费时间。Azkaban是来自LinkedIn的开源项目,能够让你自定义工作流中的操作,组成许多依赖的步骤,然后处理很多繁杂的管家婆的细节工作。它保持对日志输出的跟踪,错误的跟踪,当错误发生时发送邮件,并且提供了一个友好的web界面让你可以看到你的任务的运行状况。任务可以通过几条简单的命令以文本文件的方式创建,复杂程度和使用Unix命令行或者Java命令行相当。
Oozie是一个类似Azkaban的任务管理控制系统,但是只关注hadoop任务的管理。它并没有象你想的那样有大的不同,因为绝大部分的Azkaban就是用来管理Hadoop任务的,但是Oozie的确整合的更紧密一些,如果你使用Yahoo!分发的Hadoop和Oozie代码,情况尤甚。Oozie也提供了一个更复杂的语言来描述工作流,允许你在运行时精确定义下一步需要执行的步骤,所有的这些都是通过XML文件进行描述。你也可以使用它的API来构建你自己的扩展功能。相对于Azkaban,Oozie的界面更强大但是也更复杂,因此你的选择应该依赖你究竟需要使用多少Oozie的高级特性。
尽管它不是严格意义上的NoSQL数据库,Greenplum系统提供了一个有益的方向:将分布式的性能优势和SQL查询语言的灵活进行整合。它建立在Postgres开源数据库之上,添加了分布式架构让它能够运行在多机的集群中,同时保留了标准的SQL接口。它默认通过对数据表主键进行哈希,自动的在机器间切片数据,通过单机上的RAID控制器设置和跨服务器间的数据冗余来共同避免数据丢失。通常情况下,相对于通常web开发领域的廉价硬件,它部署的服务器集群需要相对更高速的处理器和更大容量的RAM。
建议继续学习:
- hbase运维 (阅读:13696)
- hbase介绍 (阅读:11097)
- 我对技术方向的一些反思 (阅读:9945)
- Key-Value小数据库tmdb发布:原理和实现 (阅读:7336)
- 基于SSD的数据库性能优化 (阅读:7487)
- TT的作者出新作品鸟:kyoto tycoon (阅读:6899)
- SQL vs NoSQL:数据库并发写入性能比拼 (阅读:6693)
- 让Redis使用TCMalloc,实现高性能NOSql服务器 (阅读:6115)
- SQL到NOSQL的思维转变 (阅读:5672)
- Using MySQL as a NoSQL (阅读:5732)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:maosen.zhang 来源: 量子数科院
- 标签: MapReduce nosql 数据库
- 发布时间:2012-02-01 18:05:05
- [69] Twitter/微博客的学习摘要
- [65] 如何拿下简短的域名
- [64] IOS安全–浅谈关于IOS加固的几种方法
- [63] android 开发入门
- [62] Go Reflect 性能
- [62] find命令的一点注意事项
- [60] 流程管理与用户研究
- [58] 图书馆的世界纪录
- [58] 读书笔记-壹百度:百度十年千倍的29条法则
- [58] Oracle MTS模式下 进程地址与会话信