2017-02-24 1 views
1

직장에서 프로젝트에 flink를 시도하고 있습니다. 나는 count windowing을 적용하여 스트림을 처리하는 지점에 도달했습니다. 그러나 설명 할 수없는 특이한 동작을 발견했습니다.Flink는 SingleOutputStreamOperator를 하나가 아닌 두 개의 파일에 씁니다.

스트림이 두 개의 스레드에 의해 처리되고 출력이 두 부분으로 분리 된 것처럼 보입니다.

처음에는 stream.print()을 사용하여 스트림을 표준 콘솔에 인쇄 할 때의 동작을 확인했습니다.

그런 다음 출력 파일에 실제로 출력 한 파일은 12 인 출력 폴더에 있습니다.

SingleOutputStreamOperator<Tuple3<String, String,String>> c = stream_with_no_err.countWindow(4).apply(new CountPerWindowFunction()); 
    // c.print() // this olso prints two streams in the standard console 

    c.writeAsCsv("output"); 

누군가이 문제가 왜 발생하는지 설명해주세요. 어떻게 구성 할 수 있습니까? 결과 스트림을 분할해야하는 이유는 무엇입니까?

평행도 속도 (다중 스레드)에 유용하지만 왜 결과 스트림이 분할 되는가?

일반적으로 결과 스트림을 처리 후 단일 파일 또는 TCP 스트림 등으로 만들고 싶습니다. 수동으로 두 파일을 결합하고 단일 출력을 생성하는 일반적인 워크 플로입니까?

감사합니다.

답변

1

Flink는 분산 및 병렬 스트림 프로세서입니다. 말했듯이 높은 처리량을 달성하려면 병렬 처리가 필요합니다. 응용 프로그램의 처리량은 가장 느린 연산자로 제한됩니다. 따라서 많은 경우 싱크를 병렬화해야합니다.

는 1로 싱크의 병렬 처리를 줄이기 위해 매우 간단,이 말씀을 갖는 c.writeAsCsv("output").setParallelism(1);

이제, 싱크는 단일 스레드로 실행되며, 단지 하나의 파일을 생성한다.

+0

감사합니다. 이제 모든 것이 명확 해집니다! – cmcaba