2

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

1) 第一个流将urls 输出到一个 db 表,(在该表中,它们通过自动递增的 id 值自动分配 id)。此流程还将成对的 url 输出到SequenceFile字段名称为“ urlTo”、“ urlFrom”的字段中。

2) 第二个流程从这两个源读取并尝试CoGroup对“ urlTo”(来自 SequenceFile)和“ url”(来自 db 源)执行一次操作,以获取id每个“ ”的 db 记录“ urlTo”。

然后它对CoGroupurlFrom”和“ ”执行一个操作以获取每个“ ”url的数据库记录“ ”。idurlFrom

这两个流程单独工作 - 如果我在运行第二个流程之前在第一个流程上调用 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函数,CascadeConnector但我不清楚如何解决这个问题。

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

4

2 回答 2

2

似乎您的源和接收器的一些路径是相同的。

ACascade使用 Direct Graphs 的概念来构建 Cascade 本身,因此,如果您有一个流源和一个 sink 源指向同一位置,则本质上会创建一个循环,并且在有向图的概念中是不允许的,因为

不是来自:

  • Source位置 A 到Sink位置 B

但取而代之的是:

  • Source位置 A 到Sink位置 A。
于 2013-07-16T21:34:41.827 回答
1

“Tap 在设计上没有明确的名称。因此,给定的 Tap 实例可以在不同的 {@link Flow} 中重复使用,这些 {@link Flow} 可能期望具有不同逻辑名称的源或接收器,但物理上相同资源。”

“一般来说,同一个 Tap 类的两个实例必须有不同的标识符(和不同的#equals)。”

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

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

于 2013-07-17T15:33:46.270 回答