我正在尝试编写一个由两个流组成的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
。有什么我想念的吗?
答案 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()方法以包含表名。