19

我一直在尝试级联,但我看不出比经典的 map reduce 写作业有任何优势。

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

可能会使简单的事情变得简单,但复杂的事情会做得很好。我发现它们非常困难

有什么我想念的吗。与经典方法相比,Cascading 有明显的优势吗?

在什么情况下我应该选择级联而不是经典方法?有人用过并且开心吗?

4

8 回答 8

51

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

如果它们对您的问题有意义,我的建议是使用 Pig 或 Hive,尤其是 Pig。

但是,如果您从事数据业务,而不仅仅是在数据中寻找见解,您会发现级联方法比原始 MapReduce 更适合大多数问题。

您使用原始 MapReduce 的第一个障碍将是在 MapReduce 中的思考。MapReduce 中的小问题很简单,但如果您可以使用更容易映射到您的问题域的模型(过滤这个、解析那个、排序这些、加入其余部分等),则开发复杂的应用程序会容易得多。

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

此外,如果您必须在映射器和化简器之间不断移动函数,您会发现重构和创建可重用代码要困难得多。或从映射器到前一个减速器以获得优化。这导致了脆性的问题。

Cascading 相信尽可能快地失败。计划器尝试在 Hadoop 集群甚至参与工作之前解决并满足所有这些字段名称之间的依赖关系。这意味着 90% 以上的问题将在等待数小时以等待您的工作在执行期间找到它之前找到。

您可以在原始 MapReduce 代码中通过创建域对象(如 Person 或 Document)来缓解这种情况,但许多应用程序并不需要下游的所有字段。考虑是否需要所有男性的平均年龄。当您只需要二进制性别和数字年龄时,您不想支付在网络上传递整个 Person 的 IO 惩罚。

借助快速失败的语义和接收器和源的惰性绑定,在级联上构建框架变得非常容易,这些框架本身创建级联流(这成为许多 Hadoop MapReduce 作业)。我目前参与的一个项目最终每次运行都会有 100 个 MapReduce 作业,其中许多是根据正在处理的数据的反馈在运行中期创建的。搜索Cascalog以查看基于 Clojure 的框架示例,用于简单地创建复杂流程。或者Bixo用于 Web 挖掘工具包和框架,它比 Nutch 更容易定制。

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

如果您愿意,请向我发送您在使用界面时遇到的问题的列表。我一直在寻找更好的方法来改进 API 和文档,用户社区总是在帮助。

于 2010-09-11T04:03:25.823 回答
25

我已经使用 Cascading 几年了。我觉得它非常有帮助。归根结底,它是关于生产力的提高。与纯 Java 代码相比,我可以更高效地创建和维护 M/R 作业。这里有几个原因:

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

虽然有很多预构建的组件可以组合在一起,但如果处理逻辑的特定部分看起来直接用 Java 编写会更容易,你总是可以创建一个级联函数来包装它。这使您可以享受 Cascading 的好处,但是可以将非常自定义的操作编写为直接的 java 函数(实现 Cascading 接口)。

于 2010-09-11T21:17:08.230 回答
6

我使用 Cascading 和 Bixo 为大型社交网络编写了完整的反垃圾邮件链接分类管道。

Cascading 管道产生了 27 个 MR 作业,这在普通 MR 中很难维护。我以前写过 MR 作业,但是使用 Cascading 之类的东西感觉就像从 Assembler 切换到 Java (insert_fav_language_here)。

恕我直言,与 Hive 或 Pig 相比的一大优势是 Cascading 是一个单独的 jar,您可以将其与您的工作捆绑在一起。Pig 和 Hive 有更多的依赖项(例如 MySQL)或者不那么容易嵌入。

免责声明:虽然我个人认识 Chris Wensel,但我真的认为 Cascading 非常棒。考虑到它的复杂性,令人印象深刻的是,我没有发现一个使用它的错误。

于 2010-09-11T06:01:18.737 回答
6

我为 Scale Unlimited 教授 Hadoop Boot Camp 课程,并在 Bixo 中广泛使用 Cascading 并在 Bixo Labs 构建 Web 挖掘应用程序 - 所以我认为我对这两种方法都有很好的理解。

我在 Cascading 中看到的最大单一优势是它允许您根据字段操作来考虑数据处理工作流程,并且(大部分)避免担心如何将这种世界观转换为键/值模型本质上是任何 map-reduce 实现的一部分。

Cascading 的最大挑战在于它是一种不同的数据处理工作流程的思考方式,并且在一切开始变得有意义之前,您需要克服相应的概念“驼峰”。另外,错误消息可以提醒 lex/yacc 的输出之一(“移位/减少冲突”):)

——肯

于 2010-09-12T19:01:45.810 回答
2

我认为 Cascading 的优势开始体现的地方是你有一堆简单的函数,这些函数应该在源代码中保持独立,但都可以在你的 mapper 或 reducer 中收集到一个组合中。将它们放在一起会使您的基本 map-reduce 代码难以阅读,将它们分开会使程序变得非常慢。即使您单独编写它们,Cascading 的优化器也可以将它们放在一起。Pig 和某种程度上 Hive 也可以做到这一点,但是对于大型程序,我认为 Cascading 具有可维护性优势。

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

于 2010-09-12T08:27:25.887 回答
1

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

我确定你已经有了这个,但这里是用户指南: http: //www.cascading.org/1.1/userguide/pdf/userguide.pdf。它提供了典型级联应用程序中数据流的良好演练。

于 2010-09-10T00:38:10.490 回答
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.

我建议人们在大多数情况下使用级联。

于 2014-12-13T09:12:17.710 回答
0

Cascading 是一个围绕 Hadoop 的包装器,它为 Hadoop 提供 Taps 和 Sink。

为所有任务编写 Mappers 和 Reducers 将是乏味的。尝试编写一个 Cascading 作业,然后您就可以避免编写任何映射器和化简器。

您还想查看级联 Taps 和 Schemes(这是您将数据输入级联处理作业的方式)。

有了这两个,即避免使用Reducers 编写ad-hoc Hadoop Mappers 的能力和使用各种数据源的能力,您可以非常快速有效地解决很多数据处理问题。

级联不仅仅是对 hadoop 的简单包装,我试图让答案保持简单。例如,我使用级联 jdbc tap 将包含 TB 数据的巨大 mysql 数据库移植到日志文件

于 2015-05-05T04:41:31.740 回答