我一直在尝试使用Cascading,但是我不能看到它在编写作业方面比经典的Map Reduce方法有任何优势。
Map Reduce作业给了我更多的自由度,而Cascading似乎设置了很多障碍。
也许对于简单的事情来说,Cascading可能会让工作更加简单,但是对于复杂的事情,我发现它们非常困难。
我错过了什么吗?Cascading相比经典方法明显有什么优势吗?
在什么场景下应该选择Cascading而不是经典方法?有人使用它并感到满意吗?
请记住,我是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和文档,用户社区始终愿意提供帮助。
我已经使用Cascading几年了,发现它非常有帮助。最终,这是关于提高生产力的。与普通的Java代码相比,在创建和维护M/R作业方面,我可以更加高效。以下是一些原因:
虽然有许多预建组件可以组合在一起,但如果处理逻辑的特定部分似乎更容易直接编写Java,则始终可以创建一个Cascading函数来包装它。这使您能够享受Cascading的好处,但可以编写直接的Java函数(实现Cascading接口)作为非常自定义的操作。
我认为,Cascading开始显示其优势的地方是当你有一堆简单函数需要在源代码中分开保留,但又可以在你的mapper或reducer中进行组合时。将它们组合在一起会使得基本的MapReduce代码难以阅读,而将它们分开则会使程序变得非常慢。尽管你将它们分开编写,但Cascading的优化器可以将它们组合在一起。Pig和在某种程度上Hive也可以实现这一点,但对于大型程序,我认为Cascading具有更好的可维护性。
在未来几个月中,Plume可能会成为一个具有表现力竞争力的工具,但如果你需要在生产环境中编写和运行真正的程序,那么Cascading可能是你最好的选择。
级联允许您使用简单的字段名称和元组来代替Hadoop提供的原始类型,这些类型“...往往处于创建复杂、高度可组合的代码以及可以在不同开发人员之间共享的错误粒度水平”(Tom White,Hadoop The Definitive Guide)。级联旨在解决这些问题。请记住,一些应用程序如Cascading、Hive、Pig等是并行开发的,有时会做相同的事情。如果您不喜欢Cascading或者觉得它很困惑,也许您最好使用其他东西?
我相信您已经拥有了这个,但这里是用户指南:http://www.cascading.org/1.1/userguide/pdf/userguide.pdf。它提供了一个典型的Cascading应用程序中数据流的不错的演示。
我在级联方面工作了几年,以下是级联中有用的事项。
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.
Cascading是Hadoop的一个包装器,提供了与Hadoop之间的Taps和Sinks。
为所有任务编写Mapper和Reducer将会很繁琐。尝试编写一个Cascading作业,然后您就可以避免编写任何Mapper和Reducer。
您还需要查看Cascading Taps和Schemes(这是您将数据输入到Cascading处理作业中的方式)。
有了这两个功能,即避免编写特定的Hadoop Mapper和Reducer以及消耗各种数据源的能力,您可以快速有效地解决大量数据处理问题。
Cascading不仅仅是Hadoop的简单包装器,我试图保持答案简单。例如,我使用Cascading JDBC Tap将包含数千兆字节数据的巨大MySQL数据库转移到日志文件中。