2017-12-11 5 views
0

이다, 키잉 스트림이 :이 FLINK 동일 스트림의 재사용 생각재사용이 스트림의 카피 예를 들어하지

val keyedStream: KeyedStream[event, Key] = env 
    .addSource(...) 
    .keyBy(...) 

// several transformations on the same stream 
keyedStream.map(....) 
keyedStream.window(....) 
keyedStream.split(....) 
keyedStream...(....) 

, 제가 찾은 것은 내가 다시 때 스트림의 내용은 다른 변환의 영향을받지 않으므로 같은 스트림의 복사본이라고 생각합니다.

  • 하지만 맞는지 아닌지는 잘 모르겠습니다.

  • 그렇다면 복사를 유지하는 데 많은 리소스 (리소스)가 사용됩니까?

답변

0

다중 사업자가 적용되는 DataStream (또는 KeyedStream)는 모든 보내는 메시지를 복제합니다. 이 같은 프로그램이있는 경우 예를 들어, :

val keyedStream: KeyedStream[event, Key] = env 
    .addSource(...) 
    .keyBy(...) 

val stream1: DataStream = keyedStream.map(new MapFunc1) 
val stream2: DataStream = keyedStream.map(new MapFunc2) 

소스는 각 레코드를 복제하고 모두 다운 스트림 사업자 (MapFunc1MapFunc2)로 전송

  /-hash-> Map(MapFunc1) -> ... 
Source >-< 
      \-hash-> Map(MapFunc2) -> ... 

으로 프로그램이 실행됩니다. 연산자의 유형 (예제 맵에서)은 중요하지 않습니다.

이 비용으로 각 레코드가 네트워크를 통해 두 번씩 전송됩니다. 모든 수신 오퍼레이터가 동일한 병렬 처리를 갖는 경우, 각 레코드를 한 x 송신하고 수신 타스크 관리자에게 복사하여 최적화 할 수 있지만, 현재 완료되지는 않습니다.

하나의 수신 연산자 (예 : ID 맵 연산자)를 추가하고을 여러 수신자에게 포크로 추가하여 프로그램을 수동으로 최적화합니다. 모든 레코드가 이미 로컬이므로 네트워크 셔플이 발생하지 않습니다. 모든 연산자는 동일한 병렬 처리를 가져야합니다.