2016-12-13 4 views
0

클라우드 PubSub 구독에서 비롯된 Google Dataflow에서 스트리밍 방식의 무제한 PCollection으로 작업합니다. 우리는이 이벤트를 FireTose로 사용하여 이벤트를 BigTable에 지속적으로 전달합니다. 배달 된 모든 것이 훌륭하게 수행됩니다.클라우드 데이터 흐름 : 워터 마크가 진행될 때의 부작용

문제는 BigTable이 전달되면 하루 동안의 데이터를 읽는 다운 스트림 배치 작업이 있다는 것입니다. 워터 마크가 일 임계 값을 초과하여 진행될 때 마커 행을 bigtable에 쓰는 부작용을 구현하기 위해 창 작업과 트리거링을 활용하여 데이터 흐름에 대부분의 이벤트가 전달되었다고 믿을만한 이유가 있음을 나타냅니다 (우리는 ' 완성도에 대한 확실한 보증이 필요하며 합리적인 보증이 필요함), 다운 스트림 처리가 시작될 수 있습니다.

우리가 시도한 것은 원시 이벤트를 파이프 라인에 싱크 한 다음 다른 싱크로 창에 넣고 the timing information in the pane을 사용하여 워터 마크가 향상되었는지 확인하는 것입니다. 이 접근법의 문제점은 원시 이벤트 자체를 다시 조작한다는 것이고 이벤트 행 작성을 반복하므로 바람직하지 않습니다. 이 쓰기를 방지 할 수 있지만 파이프 라인의 병렬 경로는 창 분할 된 이벤트 스트림에서 계속 작동합니다.

워터 마크에 콜백 (callback-of-sort)을 첨부하여 워터 마크가 진행될 때 단일 작업을 수행 할 수있는 효과적인 방법이 있습니까?

답변

1

콜백을 이벤트 시간에 타이머를 설정하고받을 수있는 일반적인 기능은 확실히 활성 개발 중입니다 BEAM-27로 신청 중요한 기능 요청입니다.

실제로는 FixedWindows.of(Duration.standardDays(1))에 윈도우 방식으로 접근하는 것이 Dataflow Java SDK 1.x의 기능 만 사용하여 목표를 달성하는 것처럼 보입니다. 파이프 라인을 포크하는 대신 트리거 AfterPane.elementCountAtLeast(1)을 추가하여 "Firehose"동작을 유지할 수 있습니다. GroupByKey의 비용이 발생하지만 중복되는 것은 아닙니다.

전체 파이프 라인은 다음과 같습니다 내가 사용 사례 몇 가지 세부 사항을 놓친 경우

pipeline 
    // Read your data from Cloud Pubsub and parse to MyValue 
    .apply(PubsubIO.Read.topic(...).withCoder(MyValueCoder.of()) 

    // You'll need some keys 
    .apply(WithKeys.<MyKey, MyValue>of(...)) 

    // Window into daily windows, but still output as fast as possible 
    .apply(Window.into(FixedWindows.of(Duration.standardDays(1))) 
       .triggering(AfterPane.elementCountAtLeast(1))) 

    // GroupByKey adds the necessary EARLY/ON_TIME/LATE labeling 
    .apply(GroupByKey.<MyKey, MyValue>create()) 

    // Convert KV<MyKey, Iterable<MyValue>> 
    // to KV<ByteString, Iterable<Mutation>> 
    // where the iterable of mutations has the "end of day" marker if 
    // it was ON_TIME 
    .apply(MapElements.via(new MessageToMutationWithEndOfWindow()) 

    // Write it! 
    .apply(BigTableIO.Write.to(...); 

내 대답에 의견을주세요.

관련 문제