我一直在尝试Cascading,但是我看不出有什么优于经典的map reduce方法来编写工作.
Map Reduce工作给了我更多自由,Cascading似乎带来了很多障碍.
可以把简单的事情做成简单但复杂的事情......我发现它们非常难
有什么我想念的东西.Cascading是否有明显优于传统方法的优势?
在什么情况下我应该选择级联经典方法?任何人使用它并且开心吗?
请记住,我是Cascading的作者......
我的建议是使用猪或蜂巢,如果它们对你的问题有意义,特别是猪.
但是,如果您从事数据业务,而不仅仅是挖掘数据以获得洞察力,那么您会发现Cascading方法对于大多数问题比原始MapReduce更有意义.
使用原始MapReduce的第一个障碍是在MapReduce中思考.MapReduce中的琐碎问题很简单,但是如果你可以使用更容易映射到你的问题域的模型,那么开发复杂的应用程序要容易得多(过滤它,解析它们,加入其余部分等等).
接下来,您将意识到Hadoop中的正常工作单元包含多个MapReduce作业.将作业链接在一起是一个可解决的问题,但它不应泄漏到您的应用程序域级代码中,它应该是隐藏和透明的.
此外,如果必须在映射器和缩减器之间不断移动函数,您会发现重构和创建可重用代码要困难得多.或者从映射器到前一个reducer进行优化.这导致了脆弱的问题.
级联相信尽快失败.在Hadoop集群甚至参与工作之前,规划器尝试解析并满足所有这些字段名称之间的依赖关系.这意味着在等待工作的几个小时之前,将找到90%以上的所有问题,以便在执行期间找到它.
您可以通过创建Person或Document等域对象来缓解原始MapReduce代码中的这种情况,但许多应用程序不需要下游的所有字段.考虑一下你是否需要所有男性的平均年龄.当您需要的是二进制性别和数字年龄时,您不希望支付在网络中传递整个人的IO惩罚.
由于快速语义失败以及接收器和源的延迟绑定,在Cascading上构建框架变得非常容易,这些框架本身会创建级联流(这将成为许多Hadoop MapReduce作业).我目前参与的一个项目每次运行最终会有100个MapReduce作业,其中许多是根据正在处理的数据的反馈在运行中创建的.搜索Cascalog以查看基于Clojure的框架的示例,以简单地创建复杂的流程.或者Bixo是一个Web挖掘工具包和框架,它比Nutch更容易定制.
最后,Hadoop永远不会单独使用,这意味着您的数据总是从某些外部源提取并在处理后推送到另一个外部源.关于Hadoop的一个肮脏的秘密是它是一个非常有效的ETL框架(所以听到ETL供应商谈论使用他们的工具向/从Hadoop推送/拉取数据是愚蠢的).级联允许您编写独立于集成端点的操作,应用程序和单元测试,从而减轻了这种痛苦.级联在生产中用于加载系统,如Membase,Memcached,Aster Data,Elastic Search,HBase,Hypertable,Cassandra等(不幸的是并非所有适配器都已由作者发布.)
如果您愿意,请通过界面向我发送您遇到的问题列表.我一直在寻找更好的方法来改进API和文档,用户社区总是乐于助人.
我已经使用Cascading几年了.我觉得它非常有帮助.最终,这是关于生产力的提升.与普通的Java代码相比,我在创建和维护M/R作业方面更有效率.以下是几个原因:
很多用于启动工作的样板代码已经为您编写.
组合性.通常,代码在作为组件(操作)编写时被更容易阅读并且更容易重用,这些组件被拼接在一起以执行一些更复杂的处理.
我发现单元测试更容易.级联包中有一些示例演示了如何编写简单的单元测试来直接测试流的输出.
Tap(源和接收器)范例可以轻松更改作业的输入和输出,因此您可以从输出到STDOUT开始进行开发和调试,然后切换到HDFS序列文件以进行批处理作业,然后切换到用于伪实时更新的HBase tap.
编写Cascading工作的另一个巨大优势是,你真的在写一个创造就业机会的工厂.当您需要动态构建某些内容时(即一个作业的结果控制您创建和运行的后续作业),这可能是一个巨大的优势.或者,在另一种情况下,我需要为6个二进制变量的每个组合创建一个作业.这是64个非常相似的工作.这只是hadoop map reduce类的麻烦.
虽然有许多预先构建的组件可以组合在一起,但如果处理逻辑的某个特定部分看起来更容易直接用Java编写,那么您总是可以创建一个级联函数来包装它.这使您可以获得级联的好处,但非常自定义的操作可以编写为直接的java函数(实现级联接口).
我使用Cascading with Bixo为大型社交网络编写完整的反垃圾邮件链接分类管道.
级联管道导致27个MR作业,这在普通MR中很难维持.我之前编写过MR作业,但是使用像Cascading这样的东西就像从Assembler切换到Java(insert_fav_language_here).
与Hive或Pig恕我直言相比,其中一个最大的优点是Cascading是一个单独的jar,你可以将它与你的工作捆绑在一起.Pig和Hive有更多的依赖关系(例如MySQL)或者不容易嵌入.
免责声明:虽然我个人认识Chris Wensel,但我认为Cascading是一个**.考虑到它的复杂性,令人印象深刻的是我没有找到使用它的单个bug.
我为Scale Unlimited教授Hadoop Boot Camp课程,并且还广泛使用Bixo中的Cascading以及在Bixo Labs构建Web挖掘应用程序 - 所以我认为我对这两种方法都有很好的认识.
我在Cascading中看到的最大的单一优势是,它允许您根据字段上的操作来考虑您的数据处理工作流程,并且(主要)避免担心如何将这个世界视图转换到键/值模型上本质上是任何map-reduce实现的一部分.
Cascading面临的最大挑战是它是一种不同的思考数据处理工作流程的方式,并且在它开始有意义之前,你需要克服相应的概念"驼峰".另外,错误消息可以提醒lex/yacc的输出之一("shift/reduce中的冲突"):)
- 肯