可以在Apache Apex中的DAG中间使用输入运算符

时间:2017-02-28 07:40:21

标签: apache-apex bigdata

Apex的所有示例都说DAG的第一个运算符应该是输入运算符。此运算符是否可以出现在DAG的中间位置。

考虑一种情况,我根据刚刚由前一个运算符处理的一些数据从数据库中提取数据,这意味着输入操作符将位于DAG的某个中间位置。

根据输入运算符的定义,它是没有任何输入流的运算符。但是,如果使用连接器,它也会执行获取数据的工作。如果我在DAG之间的某处获取数据,它会工作吗?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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

另外,请注意: 如果查询太重,最好有一个异步线程来查询数据库。该线程可以将数据写入队列,主线程可以从该队列读取记录并在输出流上发出它们。这将确保不阻止主操作员线程,操作员不会失败。