2017-03-13 1 views
2

Apache Beam은 최근 Apache Flink 및 Google Cloud Dataflow에서 부분적으로 지원되는 state cells, StateSpec@StateId annotation을 도입했습니다.Beam with GlobalWindow의 상태 가비지 수집

GlobalWindow과 함께 사용하면 발생하는 문제에 대한 문서를 찾을 수 없습니다. 특히, 일부 구성에 따라 잠시 동안 볼 수 없었던 키의 상태를 없애기위한 "상태 가비지 수집"메커니즘을 사용하는 방법이 있지만, 키에 대한 단일 시간 상태를 유지하는 것은 볼 수 있습니다 자주 들리는가?

또는이 경우에 사용되는 상태의 양이 다른 상태가되어 잠시 동안 보지 못한 키에 해당하는 상태를 다시 사용할 수는 없습니까?

Apache Flink 또는 Google Cloud Dataflow에서 잠재적 인 솔루션이 지원되는지 여부에 관심이 있습니다.

플린 크와 다이렉트 러너는 "상태 GC"에 대한 코드가있는 것 같지만 실제로 무엇이 있는지, 그리고 글로벌 윈도우를 사용할 때 관련이 있는지 여부는 확실하지 않습니다.

답변

2

상태 윈도우가 만료 된 후 어느 시점에서 빔 러너 의해 수집 자동 가비지 일 수있다. 정확한 세부 사항은 주자에 따라 다릅니다.

올바르게 결정 했으므로 전역 창이 만료되지 않을 수 있습니다. 그런 다음 자동 상태 수집이 호출되지 않습니다. 드레인 시나리오를 포함하여 제한된 데이터의 경우 실제로 만료되지만 영구적 인 무제한 데이터 소스의 경우에는 그렇지 않습니다. 일부 타임 아웃 후 상태를 취소 - 당신은 당신이 사용자 정의 타이머를 사용할 수있는 글로벌 창에 같은 데이터 상태 처리를 수행하는 경우

는 (아직 이들에 대한 블로그하지 않은, @TimerId 통해 @OnTimer을 사용하고, TimerSpec는) 당신의 선택. 상태가 일종의 집합체를 나타내면, 아무튼 타이머를 사용하여 데이터가 상태에서 벗어나지 않도록해야합니다. 여기

는 사용의 빠른 예입니다

new DoFn<Foo, Baz>() { 

    private static final String MY_TIMER = "my-timer"; 
    private static final String MY_STATE = "my-state"; 

    @StateId(MY_STATE) 
    private final StateSpec<ValueState<Bizzle>> = 
     StateSpec.value(Bizzle.coder()); 

    @TimerId(MY_TIMER) 
    private final TimerSpec myTimer = 
     TimerSpecs.timer(TimeDomain.EVENT_TIME); 

    @ProcessElement 
    public void process(
     ProcessContext c, 
     @StateId(MY_STATE) ValueState<Bizzle> bizzleState, 
     @TimerId(MY_TIMER) Timer myTimer) { 
    bizzleState.write(...); 
    myTimer.setForNowPlus(...); 
    } 

    @OnTimer(MY_TIMER) 
    public void onMyTimer(
     OnTimerContext context, 
     @StateId(MY_STATE) ValueState<Bizzle> bizzleState) { 
    context.output(... bizzleState.read() ...); 
    bizzleState.clear(); 
    } 
} 
+0

정확히 내가 뭘 찾고 있었는지, 고마워. 나는 실제로 전역 윈도우가 아닌 '세션'윈도우를 사용하여 동일한 결과를 얻을 수 있는지 궁금해합니다. – peay

+0

그나저나 위대한 블로그 게시물! – peay

+0

안녕하세요 Kenn, Bizzle이 BizZle이 이미 코더 구현 (예 : Integer, Map 등)이있는 일부 멤버 필드가 포함 된 POJO라고 가정하고 Bizzle.coder()를 구현하는 방법을 보여 주실 수 있습니까? – Josh

1

GlobalWindows을 사용하면 상태의 자동 가비지 수집이 수행되지 않습니다. 일부 비 전역 창을 사용하는 경우에만 워터 마크가 창 끝에 허용 된 지 연을 더한 후에 가비지 수집 됨으로 표시됩니다.

GlobalWindows으로 작업해야 할 작업은 수동으로 상태를 last update timestamp으로 유지하는 것입니다. 그런 다음 주기적으로 타이머를 설정하여 현재 시간과 비교하여이 시간 소인을 확인하고 필요한 경우 상태를 삭제합니다. 처음으로 키를 발견하면 (이 타임 스탬프가없는 상태에서 볼 수있는)이 타이머를 설정 한 다음 @OnTimer 방법으로 다시 설정합니다. 입력 된 워터 마크 그래서 모든 추가 입력이 낙하 할이며, 허용 된 지각에 의한 윈도우의 단부를 초과하는 경우 -

+0

덕분에,이 도움이됩니다. 상태를 어떻게 삭제합니까? 'stateCell.write (null)'? 여전히 빈'ValueState'가 매달려 있지 않습니까? – peay

+0

켄 (Kenn)의 답변에서 '깔끔한'것으로 나타났습니다. 어떻게 알았는지 확실하지 않았습니다. – peay