博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Apache Crunch:用于简化MapReduce编程的Java库
阅读量:7183 次
发布时间:2019-06-29

本文共 3419 字,大约阅读时间需要 11 分钟。

hot3.png

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

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起步

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

源代码中有很多示例应用。下面是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
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
words = lines.parallelDo(new DoFn
() { public void process(String line, Emitter
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
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带向如和等其他JVM语言的项目,也有很多使用Crunch的工具。

转载于:https://my.oschina.net/lwhmdj0823/blog/633782

你可能感兴趣的文章
分区视图(转载)
查看>>
高性能MySql进化论(一):数据类型的优化_上
查看>>
算法起步之Kruskal算法
查看>>
昨天帮同学的学校写了首校歌
查看>>
Oracle 监听器无法启动(TNS-12555,TNS-12560,TNS-00525)
查看>>
malloc、calloc、realloc三者的差别
查看>>
百度没出新算法之前这样的最好的的优化方案
查看>>
free 一个指针时【 retval = HeapFree(_crtheap, 0, pBlock);】报错的原因
查看>>
网易微专业大数据工程师
查看>>
查看、修改oracle字符集,查看oracle版本
查看>>
JavaScript引用类型之Array数组的栈方法与队列方法
查看>>
ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入
查看>>
路由器实操 能够登陆QQ 收发信息正常 但游览器无法连接网页
查看>>
vi实战记录
查看>>
less初探
查看>>
关于SQL中的Update语句
查看>>
五、excel末尾补0和开头补0
查看>>
jquery中使用event.target的几点
查看>>
Hybird-App离线缓存系统
查看>>
探索两种优雅的表单验证——策略设计模式和ES6的Proxy代理模式
查看>>