2017-02-28 4 views
2

Apex의 모든 예에서 DAG의 첫 번째 연산자는 입력 연산자 여야합니다. 이 연산자는 DAG의 중간에 나타날 수 있습니까?Apache Apex의 DAG 중간에 입력 연산자를 사용할 수 있습니까

이전 연산자에서 방금 처리 한 일부 데이터를 기반으로 데이터베이스에서 데이터를 가져 오는 경우를 생각해 보면 입력 연산자가 DAG의 중간에 위치한다는 것을 의미합니다.

입력 연산자의 정의에 따르면 입력 스트림이없는 입력 연산자입니다. 그러나 커넥터가 사용되면 데이터를 가져 오는 작업도 수행합니다. DAG 사이에서 데이터를 가져 오는 경우 작동합니까?

답변

3

이것은 흥미로운 사용 사례입니다. 입력 연산자 (예 : 데이터베이스에서 읽으려는 JdbcInputOperator)를 확장하고 입력 포트를 추가 할 수 있어야합니다. 이 입력 포트는 DAG에서 다른 연산자의 데이터 (튜플)를 받고 JdbcInputOperator의 "where"절을 업데이트하여이를 기반으로 데이터를 읽습니다. 그것이 당신이 찾고 있었던 것이기를 바랍니다.

+0

안녕 Sanjay, InputOperator 및 일반 연산자에 대한 처리가 다르다는 것을 고려하면 실제로 가능합니까? https://apex.apache.org/docs/apex/operator_development/#how-operator-works –

+0

방금 ​​블라드의 대답을 보았습니다. 이전 의견에 대한 내 쿼리가 명확 해졌습니다. –

1

아니요, 입력 연산자는 DAG 사이에서 사용할 수 없습니다. 이미 지적했듯이 입력 스트림이 없으므로 이전 운영자의 데이터를이 운영자와 함께 사용할 수 없습니다.

예를 들어, 입력 연산자와 비슷한 기능을하는 입력 스트림을 사용하여 자신의 제네릭 연산자를 작성하는 것이 좋습니다. 입력 연산자의 입력에 따라 외부 소스의 데이터를 읽을 수 있습니다. 흐름.

또한 유의할 점 : 쿼리가 너무 무거 우면 비동기 스레드로 데이터베이스를 쿼리하는 것이 좋습니다. 이 스레드는 주 스레드가 레코드를 읽고 출력 스트림에서 출력 할 수있는 큐에 데이터를 쓸 수 있습니다. 이렇게하면 주 운영자 스레드가 차단되지 않고 운영자가 실패하지 않습니다.

3

예, 가능합니다. 기존 InputOperator를 확장하고 InputPort를 추가 할 수 있습니다. 이 경우 Apex 플랫폼은 운영자를 일반 운영자로 처리하며 InputOperator.emitTuples()을 호출하지 않습니다. super.emitTuples()으로 전화를 걸거나 출력 포트에서 직접 방출하는 것은 사용자의 연장 된 운영자의 책임입니다.