단일 RDD를 2 개로 최적으로 분할하는 Spark


10

특정 매개 변수에 따라 그룹으로 분할 해야하는 큰 데이터 세트가 있습니다. 작업을 가능한 한 효율적으로 처리하고 싶습니다. 그렇게하는 두 가지 방법을 상상할 수 있습니다

옵션 1- 원래 RDD 및 필터에서 맵 작성

def customMapper(record):
    if passesSomeTest(record):
        return (1,record)
    else:
        return (0,record)

mappedRdd = rddIn.map(lambda x: customMapper(x))
rdd0 = mappedRdd.filter(lambda x: x[0]==0).cache()
rdd1 = mappedRdd.filter(lambda x: x[1]==1).cache()

옵션 2- 원본 RDD를 직접 필터링

def customFilter(record):
    return passesSomeTest(record)

rdd0 = rddIn.filter(lambda x: customFilter(x)==False).cache()
rdd1 = rddIn.filter(customFilter).cache()

주먹 방법은 원래 데이터 세트의 모든 레코드를 3 번 ​​반복해야합니다. 두 번째는 정상적인 상황에서 두 번만 수행해야하지만 스파크는 장면 그래프 건물 뒤에서 일부를 수행하므로 상상할 수 있습니다. 같은 방식으로 효과적으로 수행됩니다. 내 질문은 : a.) 하나의 방법이 다른 방법보다 효율적입니까, 아니면 스파크 그래프 작성으로 동등하게 만듭니다. b) 단일 패스 로이 분할을 수행 할 수 있습니까?


나는 또한 비슷한 문제로 내 자신을 발견했으며 실제로 해결책을 찾지 못했습니다. 그러나 실제로 spark에 'lazy evaluation'이 있고 실제로 실행해야하는 것만 실행하고 맵, 필터 및 함께 수행 할 수있는 모든 것을 결합 할 수 있기 때문에 발생하는 것은이 코드에서 명확하지 않습니다. 따라서 설명 하는 내용이 단일 패스로 발생할 수 있습니다 . 그러나 게으른 평가 메커니즘에 익숙하지 않다. 실제로 방금 .cache ()를 발견했습니다. .cache () 하나만 수행하고 전체 결과를 얻는 방법이 있습니까?
user3780968

답변:


9

우선 제가 Spark 전문가가 아니라고 말씀 드리겠습니다. 나는 지난 몇 개월 동안 그것을 많이 사용했으며, 이제 그것을 이해한다고 생각하지만 잘못되었을 수 있습니다.

따라서 귀하의 질문에 대답하십시오 :

a.) 그것들은 동등하지만 당신이 보는 방식에는 맞지 않습니다. Spark는 궁금한 경우 그래프를 최적화하지 않지만 customMapper두 경우 모두 여전히 두 번 실행됩니다. 이는 스파크의 경우 rdd1rdd2완전히 다른 두 개의 RDD이며, 리프에서 시작하여 상향식 변환 그래프를 작성합니다. 옵션 1은 다음과 같이 번역됩니다.

rdd0 = rddIn.map(lambda x: customMapper(x)).filter(lambda x: x[0]==0).cache()
rdd1 = rddIn.map(lambda x: customMapper(x)).filter(lambda x: x[0]==1).cache()

당신이 말했듯이, customMapper두 번 실행됩니다 (또한, 또한 rddIn두 번 읽 힙니다. 즉, 데이터베이스에서 가져온 경우 더 느려질 수 있음을 의미합니다).

b.) 방법이 있습니다 cache(). 올바른 장소 로 이동해야합니다 .

mappedRdd = rddIn.map(lambda x: customMapper(x)).cache()
rdd0 = mappedRdd.filter(lambda x: x[0]==0)
rdd1 = mappedRdd.filter(lambda x: x[0]==1)

이를 통해 스파크에 부분적인 결과를 저장할 수 있다고 알려줍니다. mappedRdd . 그 다음 모두에 이러한 부분 결과를 사용 rdd1하고 rdd2. 스파크 관점에서 이것은 다음과 같습니다.

mappedRdd = rddIn.map(lambda x: customMapper(x)).saveAsObjectFile('..')
# forget about everything
rdd0 = sc.objectFile('..').filter(lambda x: x[0]==0)
rdd1 = sc.objectFile('..').filter(lambda x: x[0]==1)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.