2016-12-01 3 views
7

다양한 상황에서 맵과 맵 파트 사이의 이론적 인 차이점 인, &을 많이 읽었습니다.스파크 RDD- 맵 대 맵 파트

하지만 아래에 설명 된 문제는 GC 작업 & 메모리 (RAM)를 기반으로합니다. 아래에서 문제를 읽으십시오. -

=> 행을 문자열로 변환하는지도 함수를 작성했습니다. 따라서 RDD [org.apache.spark.sql.Row]의 입력은 RDD [String]에 매핑됩니다. 그러나이 접근법으로 맵 객체는 RDD의 모든 행에 대해 생성됩니다. 따라서 많은 수의 객체를 생성하면 GC 활동이 증가 할 수 있습니다.

=> 위 문제를 해결하기 위해 mapPartitions을 사용하려고 생각했습니다. 따라서 객체의 수는 파티션 수와 동일 해집니다. mapPartitions는 Iterator를 입력으로 제공하고 return 및 java.lang.Iterable을 허용합니다. 그러나 Array, List 등과 같은 대부분의 Iterable은 메모리에 있습니다. 그렇다면 엄청난 양의 데이터가 있다면이 방법으로 Iterable을 만들면 메모리가 부족해질 수 있습니다. 또는 여기에 활용되어야하는 다른 컬렉션 (자바 또는 스칼라)이 있습니까 (메모리가 채워지기 시작하면 디스크로 유출하기 위해)? 또는 RDD가 완전히 메모리에있는 경우에만 mapPartitions를 사용해야합니까?

미리 감사드립니다. 어떤 도움이라도 대단히 감사하겠습니다. 당신이 생각하는 경우

답변

1

JavaRDD.mapPartitionsFlatMapFunction 소요 (또는 DoubleFlatMapFunction 같은 일부 변형) 예상되는하지 IterableIterator를 반환 할 수 있습니다. 밑받침 컬렉션이 게으르다면 걱정할 것이 없습니다.

RDD.mapPartitionsIterator에서 Iterator까지의 기능을가집니다.

일반적으로 참조 데이터를 사용하는 경우 mapPartitionsmap으로 대체하고 정적 멤버를 사용하여 데이터를 저장할 수 있습니다. 이것은 동일한 설치 면적을 가지며 작성하기 쉽습니다.

+0

정적 변수는 의미가 없습니다. 매번지도 개체가 만들어지기 때문입니다. 또한, 어떻게하면 하나의 기계에서 parralleism을 달성 할 수 있는지, 그리고 나는 정적 변수를 syncronized해야합니다. 또한 FlatMapFunction은 "public Iterable call (Iterator itr)을 덮어 씁니다." –

+1

또한 게으른 컬렉션 또는 대용량 메모리 (최대 메모리 버퍼 한도를 달성하는 경우)에서 디스크로 유출 될 수있는 컬렉션을 알려주십시오. –