Hadoop Cascading:当cogroup管道两次时,CascadeException“级联中不允许循环”

时间:2013-07-16 14:30:10

标签: hadoop cascading

我正在尝试编写一个由两个流组成的Casacading(v1.2)casade(http://docs.cascading.org/cascading/1.2/userguide/htmlsingle/#N20844):

1)第一个流将url输出到db表,(通过自动递增的id值自动为它们分配id)。 此流还会将一对网址输出到SequenceFile,其字段名称为“urlTo”,“urlFrom”。

2)第二个流从这两个源读取并尝试对“CoGroup”(来自SequenceFile)和“urlTo”(来自db源)执行url获取每个“id”的数据库记录“urlTo”。

然后对“CoGroup”和“urlFrom”执行url以获取每个“id”的数据库记录“urlFrom”。

这两个流程单独工作 - 如果我在运行第二个流程之前在第一个上调用flow.complete()。但是,如果我将两个流放入级联对象中,我会得到错误

cascading.cascade.CascadeException: no loops allowed in cascade, flow: urlLink*url*url, source: JDBCTap{connectionUrl='jdbc:mysql://localhost:3306/mydb', driverClassName='com.mysql.jdbc.Driver', tableDesc=TableDesc{tableName='urls', columnNames=null, columnDefs=null, primaryKeys=null}}, sink: JDBCTap{connectionUrl='jdbc:mysql://localhost:3306/mydb', driverClassName='com.mysql.jdbc.Driver', tableDesc=TableDesc{tableName='url_link', columnNames=[urlLinkFrom, urlLinkTo], columnDefs=[bigint(20), bigint(20)], primaryKeys=[urlLinkFrom, urlLinkTo]}}

尝试配置级联。

我可以看到它来自addEdgeFor的{​​{1}}函数,但我不清楚如何解决这个问题。

我之前从未使用CascadeConnector / Cascade。有什么我想念的吗?

2 个答案:

答案 0 :(得分:2)

看起来你的源和汇的一些路径是一样的。

A Cascade使用Direct Graphs的概念来构建Cascade本身,所以如果你有一个流源和一个sink源指向同一个位置,实质上是创建一个循环,并且在Directed的概念中是不允许的图表

来自:

  • Source位置A到Sink位置B

但是来自:

  • Source位置A到Sink位置A.

答案 1 :(得分:1)

“Tap没有按照设计给出明确的名称。这样,给定的Tap实例可以在不同的{@link Flow}中重复使用,这些{@link Flow}可能期望源或接收器由不同的逻辑名称,但是相同的物质资源。“

“通常,同一Tap类的两个实例必须具有不同的标识符(以及不同的#equals)。”

事实证明,JDBCTaps仅从连接URL生成其标识符(并且不包括表名)。因此,当我从一个表中读取并写入同一个数据库中的另一个表时,似乎我正在读取并写入同一个Tap并导致循环。

作为解决方法,我将继承JDBCTap并覆盖getIdentifier()方法以包含表名。