더북(TheBook)

6.1.8.2 그 외 다른 윈도 연산자

스파크 스트리밍은 reduceByKeyAndWindow 메서드 외에도 다양한 상황에 활용할 수 있는 여러 윈도 연산자를 제공한다. 이 중 일부는 일반 DStream에서도 사용할 수 있으며, 다른 함수들(즉, 함수 이름에 ByKey가 포함된 함수들)은 Pair DStream에서만 사용할 수 있다. 메서드 전체 목록은 표 6-1과 같다.

▼ 표 6-1 스파크 스트리밍이 제공하는 윈도 연산자

연산자

설명

window(winDur, [slideDur])

길이가 winDur인 슬라이딩 윈도 내 유입된 DStream 요소들을 slideDur 주기마다 RDD 형태로 생성한다. slideDur를 지정하지 않으면 미니배치 주기를 기본 값으로 사용한다.

countByWindow(winDur, slideDur)

길이가 winDur인 슬라이딩 윈도 내 유입된 DStream 요소들을 slideDur 주기마다 모아서 개수를 집계하고, 그 결과를 RDD에 담아 생성한다.

countByValueAndWindow(winDur, slideDur, [numParts])

길이가 winDur이고 이동 거리가 slideDur인 슬라이딩 윈도 내 유입된 요소의 고윳값별로 개수를 집계한다. numParts로 결과 RDD에 적용할 파티션 개수를 변경할 수 있다.

reduceByWindow(reduceFunc, winDur, slideDur)

길이가 winDur인 슬라이딩 윈도 내 유입된 DStream 요소들을 slideDur 주기마다 reduceFunc 함수에 전달해 단일 값으로 리듀스하고, 그 결과를 RDD에 담아 생성한다.

reduceByWindow(reduceFunc, invReduceFunc, winDur, slideDur)

길이가 winDur인 슬라이딩 윈도에 새로 유입된 DStream 요소들을 slideDur 주기마다 reduceFunc 함수에 전달해 단일 값으로 리듀스한다. 이와 동시에 슬라이딩 윈도를 벗어난 기존 요소들을 역리듀스(invReduceFunc) 함수로 전달해 reduceFunc에서 리듀스한 단일 값에서 제외한 결과를 RDD에 담아 생성한다.3 이 메서드는 역리듀스 함수를 사용하지 않는 reduceByWindow보다 더 효율적이다.

groupByKeyAndWindow(winDur, [slideDur], [numParts/partitioner])

길이가 winDur이고 이동 거리가 slideDur인 슬라이딩 윈도 내 유입된 요소들을 키별로 그루핑한다. 결과 RDD에 적용할 파티션 개수 또는 Partitioner를 선택 인수로 지정할 수 있다.

reduceByKeyAndWindow(reduceFunc, winDur, [slideDur], [numParts/partitioner])

길이가 winDur이고 이동 거리가 slideDur인 슬라이딩 윈도 내 유입된 요소들을 키별로 리듀스한다. 결과 RDD에 적용할 파티션 개수 또는 Partitioner를 선택 인수로 지정할 수 있다.

reduceByKeyAndWindow(reduceFunc, invReduceFunc, winDur, [slideDur], [numParts], [filterFunc])

리듀스 함수만 전달하는 reduceByKeyAndWindow와 기능은 동일하지만, 역리듀스 함수를 사용해 슬라이딩 윈도를 벗어난 요소들을 더 효율적으로 제외할 수 있다. 선택 인수인 filterFunc 함수로 결과 DStream에 남을 키-값 쌍의 조건을 지정할 수 있다.

 

참고로 앞 예제에서 사용한 reduceByKeyAndWindow 메서드 대신, window 메서드를 호출한 결과에 reduceByKey 메서드를 호출해도 같은 결과를 얻을 수 있다.

 

3 역주 예를 들어 지난 1시간 동안 발생한 거래액을 5초마다 계산해야 한다면 이 메서드를 사용해 최근 5초간 새로 발생한 거래액을 누적하고, 1시간 5초 전부터 1시간 전까지 발생한(즉, 슬라이딩 윈도를 벗어난) 거래액을 누적 합계에서 빼는 방식으로 구현할 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.