硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

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

  • 2013-03-18
  • 本文字数:2454 字

    阅读完需:约 8 分钟

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 带向如 Scala Clojure 等其他 JVM 语言的项目,也有很多使用 Crunch以R 语言来创建MapReduce 流水线的工具。

关于作者

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

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

2013-03-18 17:069028
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 148.1 次阅读, 收获喜欢 35 次。

关注

评论

发布
暂无评论
发现更多内容

联想积极参与CSMM标准制定和推广,推进中国软件产业高质量发展

科技热闻

机器学习入门:多变量线性回归

华为云开发者联盟

机器学习 多变量线性回归

我不服!这开源项目居然才888个星!?

why技术

Java

相约厦门!HarmonyOS Connect伙伴峰会将于6月17日举办

科技汇

Java字符串池、常量池、intern的爱恨纠葛

叫我阿柒啊

Java 常量池 intern 字符串常量池

来自 Apache APISIX committer 的经验分享 —— 编程之夏专访

API7.ai 技术团队

后端 技术人 API 网关

为什么聪明的程序员会写出糟糕的代码

实力程序员

云小课 | 华为云KYON之私网NAT网关

华为云开发者联盟

网关 华为云 KYON企业级云网络 私网NAT网关 重叠组网

【FlinkSQL】Flink SQL Query 语法(二)

Alex🐒

flink FlinkSQL flink1.13

Java 并发编程—— Executors 分析应用

Antway

6月日更

产品策略闭环是个什么环?

万事ONES

项目管理 研发管理 ONES 产品策略

ONES CTO 冯斌 | 大型团队敏捷项目管理实践与思考

万事ONES

项目管理 研发管理 团队协作 ONES 研发工具

WorkPlus私有化「数智融合」移动平台

BeeWorks

可视化及时把控营运状况,助力管理效率提升80%

一只数据鲸鱼

数据可视化 智慧城市 智慧园区 三维可视化 智慧楼宇

Dokcer Compose部署Nebula Graph配置文件

阿呆

配置信息

【布道API】API设计应该了解的HTTP方法和特性

devpoint

RESTful HTTP协议 6月日更

【Flutter 专题】107 图解自定义 ACEPageMenu 滑动菜单 (二)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

Python——列表元素的增删改

在即

6月日更

WorkPlus Lite 企业级移动平台

BeeWorks

和12岁小同志搞创客开发:拿到一款控制器,要怎么分析?

不脱发的程序猿

DIY 创客开发 怎么分析控制器?

如何解决回归任务数据不均衡的问题?

华为云开发者联盟

深度学习 模型 标签 数据不平衡 DIR

只记得文件类型如何用EasyRecovery实现恢复?

淋雨

数据恢复 EasyRecovery 文件恢复 照片恢复

从单体系统到微服务

escray

学习 极客时间 朱赟的技术管理课 6月日更

「终!」☕️【Java技术之旅】带你进入String类的易错点和底层本质分析!

码界西柚

Java 字符串 字符串常量池 6月日更

技术实践丨体验量子神经网络在自然语言处理中的应用

华为云开发者联盟

自然语言处理 量子 量子神经网络 量子模拟

助力碳中和,EMQ与SAP共同构建绿色IoT解决方案

EMQ映云科技

开源 5G 碳中和 SAP 碳达峰

GrowingIO 增长平台产研项目管理实践

GrowingIO技术专栏

项目管理 程序员 Jira growingio

和12岁小同志搞创客开发:如何选择合适的控制器?

不脱发的程序猿

DIY 创客开发 如何选择合适的控制器?

Python接口自动化之request请求封装

行者AI

接口 测试 自动化测试 封装

技术干货 | 如何实现对动态PPT的云端录制?

ZEGO即构

音视频 WebRTC RTC 即构 动态PPT录制

项目管理100问 | 研发团队如何实现无缝协作

万事ONES

项目管理 ONES Project 研发团队

Apache Crunch:用于简化MapReduce编程的Java库_语言 & 开发_Josh Wills_InfoQ精选文章