有人认为Hadoop Map Reduce中的Cascading很有用吗?

19

我一直在尝试使用Cascading,但是我不能看到它在编写作业方面比经典的Map Reduce方法有任何优势。

Map Reduce作业给了我更多的自由度,而Cascading似乎设置了很多障碍。

也许对于简单的事情来说,Cascading可能会让工作更加简单,但是对于复杂的事情,我发现它们非常困难。

我错过了什么吗?Cascading相比经典方法明显有什么优势吗?

在什么场景下应该选择Cascading而不是经典方法?有人使用它并感到满意吗?

8个回答

51

请记住,我是Cascading的作者...

如果你的问题可以使用Pig或Hive解决,我建议你使用它们之中的一个,尤其是Pig。

但是,如果你从事数据行业而不仅仅是在数据中寻找见解,你会发现对于大多数问题,Cascading方法比原始的MapReduce更有意义。

使用原始的MapReduce时,你首先要面对的障碍是思考MapReduce。在MapReduce中,微不足道的问题很简单,但如果你能使用更容易映射到问题域的模型来开发复杂的应用程序(如过滤这些、解析那些、排序这些、连接其他部分等),就会更容易。

接下来,你会意识到,在Hadoop中,正常的工作单元由多个MapReduce作业组成。将作业链接在一起是一个可以解决的问题,但它不应该泄漏到你的应用程序领域级别的代码中,它应该是隐藏和透明的。

此外,你会发现如果你必须不断地将函数从mapper移动到reducer,或者从mapper移到前一个reducer以进行优化,那么重构和创建可重用代码会更加困难。这也带来了脆弱性问题。

Cascading认为尽可能快速地失败是有益的。规划器试图在Hadoop集群开始工作之前解决和满足所有这些字段名称之间的依赖关系。这意味着90%以上的问题将在执行期间等待几个小时之前被找到。

你可以通过创建诸如Person或Document之类的域对象来缓解这个问题,但许多应用程序不需要下游的所有字段。考虑一下如果你需要所有男性的平均年龄。当你只需要一个二进制性别和数字年龄时,你不想支付传递整个人员信息的IO代价。

通过快速失败的语义和对数据源和数据汇的惰性绑定,可以非常容易地在Cascading上构建框架,这些框架本身创建Cascading流(变成许多Hadoop MapReduce作业)。我目前参与的一个项目,在每次运行时会产生数百个MapReduce作业,许多是根据正在处理的数据的反馈在运行中即时创建的。搜索Cascalog,看看基于Clojure的框架简单创建复杂进程的例子,或者看看Bixo,这是一个比Nutch更容易自定义的网络挖掘工具包和框架。

最后,Hadoop永远不会单独使用,这意味着您的数据总是从某个外部源拉取并在处理后推送到另一个源。有关Hadoop的肮脏秘密是它是一个非常有效的ETL框架(因此听到ETL供应商谈论使用他们的工具将数据推入/拉出Hadoop很愚蠢)。 Cascading减轻了这种痛苦,允许您独立于集成端点编写操作、应用程序和单元测试。Cascading用于生产中的加载系统,例如Membase、Memcached、Aster Data、Elastic Search、HBase、Hypertable、Cassandra等(不幸的是,并非所有适配器都已由其作者发布)。

如果可以,请给我发送您在接口上遇到的问题列表。我一直在寻找更好的方法来改进API和文档,用户社区始终愿意提供帮助。


谢谢,Chris,你的回答很好。我特别喜欢关于Hadoop作为ETL框架的观点... - Alex Dean
请问您能否提供一些关于何时使用纯Cascading以及何时使用Cascalog或Scalding的想法?Cascalog或Scalding相对于纯Cascading是否有任何优势? - Shekhar

25

我已经使用Cascading几年了,发现它非常有帮助。最终,这是关于提高生产力的。与普通的Java代码相比,在创建和维护M/R作业方面,我可以更加高效。以下是一些原因:

  • 很多启动作业所需的样板代码已经为您编写好了。
  • 可组合性。通常情况下,当代码被编写成组件(操作)并将它们拼接在一起执行某些较复杂的处理时,代码更易于阅读和重用。
  • 我发现单元测试更容易。在cascading包中有许多示例,演示如何编写简单的单元测试以直接测试流的输出。
  • Tap(源和汇)范式使更改作业的输入和输出变得容易,因此您可以例如从STDOUT开始输出进行开发和调试,然后切换到HDFS序列文件进行批量作业,然后切换到HBase Tap进行伪实时更新。
  • 编写Cascading作业的另一个巨大优势是您实际上正在编写更多的工厂来创建作业。当您需要动态构建某些内容时(即一个作业的结果控制您创建和运行的后续作业),这可能是一个巨大的优势。或者,在另一种情况下,我需要为6个二进制变量的每个组合创建一个作业。这是64个非常相似的作业。如果只使用hadoop map reduce类,这将是一个麻烦。

虽然有许多预建组件可以组合在一起,但如果处理逻辑的特定部分似乎更容易直接编写Java,则始终可以创建一个Cascading函数来包装它。这使您能够享受Cascading的好处,但可以编写直接的Java函数(实现Cascading接口)作为非常自定义的操作。


除了《使用Cascading进行企业工作流程》之外,还有其他学习Cascading的书籍吗?目前我正在阅读这本书,但是书中的代码似乎有些过时。看起来自从这本书出版以来,Cascading发生了很多变化。 - Shekhar
你好马克,你能否提供一个使用级联的解决方案来回答这个问题:http://stackoverflow.com/questions/27506306/piping-data-into-jobs-in-hadoop-mr-pig - Aviral Kumar

6
我使用Bixo和Cascading为一个大型社交网络编写了完整的反垃圾邮件链接分类管道。
Cascading管道产生了27个MR作业,如果使用普通的MR,这将非常难以维护。我之前写过MR作业,但是使用像Cascading这样的东西感觉就像从汇编语言转换到Java(插入你最喜欢的语言)。
在我看来,与Hive或Pig相比,其中一个巨大的优势是Cascading是单个jar文件,您可以将其与您的作业捆绑在一起。Pig和Hive有更多的依赖项(例如MySQL),或者不容易嵌入。
免责声明:虽然我个人认识Chris Wensel,但我真的认为Cascading非常出色。考虑到它的复杂性,令人印象深刻的是我没有发现任何错误。

6
我在Scale Unlimited教授Hadoop Boot Camp课程,并且在Bixo和Bixo Labs构建Web挖掘应用程序时广泛使用Cascading,因此我认为我对这两种方法都有很好的了解。
我认为Cascading的最大优势在于它允许您从字段操作的角度考虑数据处理工作流,并且(大多数情况下)避免担心如何将这种世界观转化为任何map-reduce实现固有的键/值模型。
Cascading的最大挑战在于它是一种不同的数据处理工作流思考方式,并且需要克服相应的概念“隆起”才能使其开始变得清晰易懂。此外,错误消息可能会让人想起lex / yacc的输出(“shift / reduce冲突”):)
- Ken

2

我认为,Cascading开始显示其优势的地方是当你有一堆简单函数需要在源代码中分开保留,但又可以在你的mapper或reducer中进行组合时。将它们组合在一起会使得基本的MapReduce代码难以阅读,而将它们分开则会使程序变得非常慢。尽管你将它们分开编写,但Cascading的优化器可以将它们组合在一起。Pig和在某种程度上Hive也可以实现这一点,但对于大型程序,我认为Cascading具有更好的可维护性。

在未来几个月中,Plume可能会成为一个具有表现力竞争力的工具,但如果你需要在生产环境中编写和运行真正的程序,那么Cascading可能是你最好的选择。


1

级联允许您使用简单的字段名称和元组来代替Hadoop提供的原始类型,这些类型“...往往处于创建复杂、高度可组合的代码以及可以在不同开发人员之间共享的错误粒度水平”(Tom WhiteHadoop The Definitive Guide)。级联旨在解决这些问题。请记住,一些应用程序如Cascading、Hive、Pig等是并行开发的,有时会做相同的事情。如果您不喜欢Cascading或者觉得它很困惑,也许您最好使用其他东西?

我相信您已经拥有了这个,但这里是用户指南:http://www.cascading.org/1.1/userguide/pdf/userguide.pdf。它提供了一个典型的Cascading应用程序中数据流的不错的演示。


回答你标题中的问题:http://sharethis.com/使用Cascading,所以他们一定觉得它很有用。 - sholsapp

1

我在级联方面工作了几年,以下是级联中有用的事项

1. code testability
2. easy integration with other tools
3. easily extensibile
4. you will focus only on business logic not on keys and values
5. proven in production and used by even twitter.

我建议大多数时候使用级联样式表(CSS)。

0

Cascading是Hadoop的一个包装器,提供了与Hadoop之间的Taps和Sinks。

为所有任务编写Mapper和Reducer将会很繁琐。尝试编写一个Cascading作业,然后您就可以避免编写任何Mapper和Reducer。

您还需要查看Cascading Taps和Schemes(这是您将数据输入到Cascading处理作业中的方式)。

有了这两个功能,即避免编写特定的Hadoop Mapper和Reducer以及消耗各种数据源的能力,您可以快速有效地解决大量数据处理问题。

Cascading不仅仅是Hadoop的简单包装器,我试图保持答案简单。例如,我使用Cascading JDBC Tap将包含数千兆字节数据的巨大MySQL数据库转移到日志文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接