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的一个子接口,其中包含了处理 键值对的额外方法。这两个核心类支持如下四个基本操作:
parallelDo:将用户定义函数应用于给定PCollection,返回一个新的PCollection作为结果。 groupByKey :将一个PTable中的元素按照键值排序并分组(等同于MapReduce作业中的shuffle阶段)
combineValues:执行一个关联操作来聚合来自groupByKey操作的值。
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的网站: http://incubator.apache.org/crunch/download.html下载最新版本的源代码或二进制文件,或者使用在Maven Central发 布的dependencies。