2

Apex 的所有示例都表明 DAG 的第一个运算符应该是输入运算符。这个算子能否出现在 DAG 中间某处。

考虑一种情况,其中我有数据要从数据库中获取,基于刚刚由前一个运算符处理的一些数据,这意味着输入运算符将出现在 DAG 的中间某处。

根据输入运算符的定义,它是一个没有任何输入流的运算符。但如果使用连接器,它也可以完成获取数据的工作。那么,如果我在 DAG 之间的某个地方获取数据,它会起作用吗?

4

3 回答 3

3

这是一个有趣的用例。您应该能够扩展输入运算符(例如 JdbcInputOperator,因为您想从数据库中读取)并向其添加输入端口。此输入端口从您的 DAG 接收来自另一个运算符的数据(元组)并更新 JdbcInputOperator 的“where”子句,以便它根据该子句读取数据。希望这就是你要找的。

于 2017-02-28T19:10:49.883 回答
3

对的,这是可能的。您可以扩展现有的 InputOperator 并向其添加 InputPort(s)。在这种情况下,Apex 平台会将您的操作员作为通用操作员处理,而不是调用InputOperator.emitTuples(). super.emitTuples()调用或直接在输出端口上发射将是您的扩展操作员责任。

于 2017-02-28T20:13:22.687 回答
1

不,不能在 DAG 之间使用输入运算符。正如您已经指出的那样,由于没有输入流,您将无法从先前的运算符获取数据以用于此运算符。

对于您指出的示例,最好使用输入流编写自己的通用运算符,该输入流实际上具有与输入运算符类似的功能,其中它可以根据输入流中的数据从外部源读取数据。

另外,需要注意的一点:如果查询太繁重,最好有一个异步线程来查询数据库。该线程可以将数据写入队列,主线程可以从中读取记录并将它们发送到输出流上。这将确保主算子线程不会被阻塞并且算子不会失败。

于 2017-02-28T18:55:52.713 回答