文章: Apache Crunch:用于简化MapReduce编程的Java库

标签: 文章 apache crunch | 发表时间:2013-03-18 22:06 | 作者:
出处:http://pipes.yahoo.com/pipes/pipe.info?_id=10560380f804c7341f042a2b8a03e117

Apache Crunch(孵化器项目)是基于Google的 FlumeJava库编写的Java库,用于创建MapReduce流水线。与其他用来创建MapReduce作业的高层工具(如Apache Hive、Apache Pig和Cascading等)类似,Crunch提供了用于实现如连接数据、执行聚合和排序记录等常见任务的模式库。而与其他工具不同的是,Crunch并不强制所有输入遵循同一数据类型。相反,Crunch使用了一种定制的类型系统,非常灵活,能够直接处理复杂数据类型,如时间序列、HDF5文件、Apache HBase表和序列化对象(像protocol buffer或 Avro记录)等。

Crunch并不想阻止开发者以MapReduce方式思考,而是尝试使之简化。尽管MapReduce有诸多优点,但对很多问题而言,并非正确的抽象级别:大部分有意思的计算都是由多个MapReduce作业组成的,情况往往是这样——出于性能考虑,我们需要将逻辑上独立的操作(如数据过滤、数据投影和数据变换)组合为一个物理上的MapReduce作业。

本质上,Crunch设计为MapReduce之上的一个薄层,希望在不牺牲MapReduce力量(或者说不影响开发者使用MapReduce API)的前提下,更容易在正确的抽象级别解决手头问题。

尽管Crunch会让人想起历史悠久的Cascading API,但是它们各自的数据模型有很大不同:按照常识简单总结一下,可以认为把问题看做数据流的人会偏爱Crunch和Pig,而考虑SQL风格连接的人会偏爱Cascading和Hive。

Crunch的理念

PCollection 和PTable<K, V>是Crunch的核心抽象,前者代表一个分布式、不可变的对象集合,后者是Pcollection的一个子接口,其中包含了处理键值对的额外方法。这两个核心类支持如下四个基本操作:

  1. parallelDo:将用户定义函数应用于给定PCollection,返回一个新的PCollection作为结果。
  2. groupByKey:将一个PTable中的元素按照键值排序并分组(等同于MapReduce作业中的shuffle阶段)
  3. combineValues:执行一个关联操作来聚合来自groupByKey操作的值。
  4. union:将两个或多个Pcollection看做一个虚拟的PCollection。

Crunch的所有高阶操作(joins、cogroups和set operations等)都是通过这些基本原语实现的。Crunch的作业计划器(job planner)接收流水线开发者定义的操作图,将操作分解为一系列相关的MapReduce作业,然后在Hadoop集群上执行。Crunch也支持内存执行引擎,可用于本地数据上流水线的测试与调试。

有些问题可以从能够操作定制数据类型的大量用户定义函数受益,而Crunch就是为这种问题设计的。Crunch中的用户定义函数设计为轻量级的,为满足应用程序的需要,仍然提供了完整的访问底层MapReduce API的功能。Crunch开发者也可以使用Crunch原语来定义API,为客户提供涉及一系列复杂MapReduce作业的高级ETL、机器学习和科学计算功能。

Crunch起步

可以从 Crunch的网站下载最新版本的源代码或二进制文件,或者使用在Maven Central发布的 dependencies

源代码中有很多示例应用。下面是Crunch中WordCount应用的源代码:

import org.apache.crunch.DoFn;
import org.apache.crunch.Emitter;
import org.apache.crunch.PCollection;
import org.apache.crunch.PTable;
import org.apache.crunch.Pair;
import org.apache.crunch.Pipeline;
import org.apache.crunch.impl.mr.MRPipeline;
import org.apache.crunch.type.writable.Writables;

public class WordCount {
  public static void main(String[] args) throws Exception {
    // Create an object to coordinate pipeline creation and execution.
    Pipeline pipeline = new MRPipeline(WordCount.class);
    // Reference a given text file as a collection of Strings.
    PCollection<String> lines = pipeline.readTextFile(args[0]);

    // Define a function that splits each line in a PCollection of Strings into a
    // PCollection made up of the individual words in the file.
    PCollection<String> words = lines.parallelDo(new DoFn<String, String>() {
      public void process(String line, Emitter<String> emitter) {
	for (String word : line.split("\\s+")) {
	  emitter.emit(word);
	}
      }
    }, Writables.strings()); // Indicates the serialization format

    // The count method applies a series of Crunch primitives and returns
    // a map of the top 20 unique words in the input PCollection to their counts.
    // We then read the results of the MapReduce jobs that performed the
    // computations into the client and write them to stdout.
     for (Pair<String, Long> wordCount : words.count().top(20).materialize()) {
      System.out.println(wordCount);
     }
   }
}

Crunch优化方案

Crunch优化器的目标是尽可能减少运行的MapReduce作业数。大多数MapReduce作业都是 IO密集型的,因此访问数据的次数越少越好。公平地说,每种优化器(Hive、Pig、Cascading和Crunch)的工作方式本质上是相同的。但与其他框架不同的是,Crunch把优化器原语暴露给了客户开发人员,对于像构造ETL流水线或构建并评估一组随机森林模型这样的任务而言,构造可复用的高阶操作更容易。

结论

Crunch目前仍处于Apache的孵化器阶段,我们非常欢迎社区贡献( 参见项目主页)让这个库更好。特别的是,我们正在寻求更高效的MapReduce编译思想(包括基于成本考虑的优化)、新的MapReduce设计模式,还希望支持更多的数据源和目标,如HCatalog、Solr和ElasticSearch等。还有很多把Crunch带向如 ScalaClojure等其他JVM语言的项目,也有很多使用Crunch 以R语言来创建MapReduce流水线的工具。

关于作者

Josh Wills是Cloudera的数据科学主管,主要负责与客户和工程师一起基于Hadoop为不同行业开发解决方案。他从杜克大学获得数学专业学士学位,又从得克萨斯大学奥斯汀分校获得运筹学专业硕士学位。

查看英文原文: Apache Crunch: A Java Library for Easier MapReduce Programming

您可能也会喜欢

相关 [文章 apache crunch] 推荐:

文章: Apache Crunch:用于简化MapReduce编程的Java库

- - InfoQ cn
Apache Crunch(孵化器项目)是基于Google的 FlumeJava库编写的Java库,用于创建MapReduce流水线. 与其他用来创建MapReduce作业的高层工具(如Apache Hive、Apache Pig和Cascading等)类似,Crunch提供了用于实现如连接数据、执行聚合和排序记录等常见任务的模式库.

文章: Arun Murthy谈Apache YARN

- - InfoQ cn
Apache Hadoop YARN是一种新的Hadoop资源管理器,前不久被提升为高层次的Hadoop子项目. InfoQ有幸在Hortonworks与YARN的创始人和架构师Arun Murthy进行了讨论. 黑客马拉松•杭州 12月15-16日-Hacking Different,名额有限,请速报名.

Apache Shiro 介绍

- - CSDN博客推荐文章
什么是Apache Shiro?. Apache shiro 是一个强大而灵活的开源安全框架,可清晰地处理身份认证、授权、会话(session)和加密. Apache Shiro最主要的初衷是为了易用和易理解,处理安全问题可能非常复杂甚至非常痛苦,但并非一定要如此. 一个框架应该尽可能地将复杂的问题隐藏起来,提供清晰直观的API使开发者可以很轻松地开发自己的程序安全代码.

Apache防止攻击

- - 小彰
为了防止恶意用户对Apache进行攻击,我们需要安装mod_security这个安全模块. mod_security 1.9.x模块的下载与安装. 下载地址: http://www.modsecurity.org/download/index.html. 建议使用1.9.x,因为2.x的配置指令与1.x完全不同,解压后进入解压目录,执行:.

Apache OpenOffice 3.4发布

- - Solidot
Apache OpenOffice的第一个版本v3.4正式发布. 主要新特性包括:改进ODF支持,包括ODF 1.2加密选项和新电子表格功能;改进Calc组件的数据透视表(Pivot Table)支持;原生支持SVG,增强图形如线帽和剪切变形;简体和繁体中文等原生语言支持;改进性能等. 在甲骨文将OpenOffice.org捐给Apache软件基金会后,OOo的命运曾存在许多争议.

Apache PDFBox 1.8.0 发布

- - 开源中国社区最新新闻
Apache PDFBox 1.8.0 发布了,该版本除了修复大量 bug 之外,还包含如下新特性:. PDFBox是Java实现的PDF文档协作类库,提供PDF文档的创建、处理以及文档内容提取功能,也包含了一些命令行实用工具. PDF 文档加密与解密. 与 Lucene搜索引擎的集成. 填充PDF/XFDF表单数据.

Apache Log4j 2.0介绍

- - CSDN博客推荐文章
Apache Log4j 2.0介绍. 作者:chszs,转载需注明. 作者博客主页:http://blog.csdn.net/chszs. Apache Log4j是著名的Java日志框架之一,在早些年应用最广. 但近两年来,随着SLF4J和LogBack的兴起,很多流行的开源框架在日志模块方面逐步转移到SLF4J+LogBack上,Log4j日渐衰落.

Apache 的 MaxClients 與 MaxRequestsPerChild

- - SSORC.tw
對於 Apache 架設的伺服器,在遇到連線數問題上,以下參數是會考慮微調的. 不過遇到多個 VirtualHost 與連線變多時,需要適時調整. ServerLimit 與 MaxClients 是針對同時間最大連線數為多少,也等於是 Apache 程序數量,ps 一下就會有多少個 /usr/sbin/httpd 等.

apache 工作模式

- - 互联网 - ITeye博客
如果httpd -l列出prefork.c. 则表示是 prefork 工作方式. 这表明当前apache2的工作方式是 prefork. prefork的工作原理是,控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止.

Apache投票接受OpenOffice.org

- 灰灰 - Solidot
甲骨文已宣布将开源办公软件项目OpenOffice.org捐赠给Apache基金会. 6月13日,Apache基金会进行了投票表决,以压倒性多数同意接受OpenOffice.org成为Apache的一个孵化器项目. OpenOffice.org将转交给Apache基金会管理,它可能需要数个月时间才能变成Apache的新顶级项目.