2016-11-29 3 views
2

아래의 pyspark로 작성한 카운터가 항상 올바른 결과를 제공하지 않는 이유는 글로벌 카운터와 관련이 있습니까?pyspark의 글로벌 카운터

def increment_counter(): 
    global counter 
    counter += 1 

def get_number_of_element(rdd): 
    global counter 
    counter = 0 
    rdd.foreach(lambda x:increment_counter()) 
    return counter 

답변

4

전역 변수는 드라이버 노드에만 정의되어 있으므로 로컬 호스트에서 실행될 때까지 정상적으로 작동합니다. 작업을 여러 프로세스에 배포하자 마자 counter 변수에 액세스 할 수 없으며 자체 프로세스에서 새 프로세스를 만들게됩니다. 따라서 최종 결과에는 드라이버 프로세스에서 수행 된 증분 만 포함됩니다.

당신이 찾고있는 것은 꽤 일반적인 사용법이며, 스파크의 누적 기 기능에 의해 보호됩니다. 누산기는 프로세스가 끝나면 배포되고 수집되므로 합계에는 드라이버 노드 만이 아닌 모든 노드의 증가분이 포함됩니다.

Accumulators - Spark Programming Guide

+0

정말 고맙습니다! – xxx222