2014-06-16 3 views
-1

1.5G 데이터를 읽고 변환하는 애플리케이션을 구축 중입니다. 내 코드 스켈레톤은 다음과 같습니다.apache spark : 코드 최적화를위한 입력이 필요합니다.

는 // 여기에 내가 // 4000 개 파일을 읽고 노동 조합을 형성 RDD를 모든 레코드와 unionbioSetId로

실행() {

JavaRDD<String> unionbioSetId = readDirectory(ctx, groupAID, groupBID); 
JavaRDD<String> temp= unionbioSetId.coalesce(6, false); 

JavaPairRDD<String, Tuple3<Double, Double, Double>> flatRDD = temp.flatMapToPair(
new PairFlatMapFunction<String, String, String>() { 
return Arrays.asList(new Tuple2<String, String>(key,value)); 
}}).groupByKey().mapToPair(new PairFunction<Tuple2<String, Iterable<String>>, // input 
String, // K 
Tuple3<Double, Double, Double> // V 
>() { 
public Tuple2<String, Tuple3<Double, Double, Double>> call(
Tuple2<String, Iterable<String>> value) { 
}).filter(new Function<Tuple2<String, Tuple3<Double, Double, Double>>, Boolean>() { 
}});// group by key and map to pair,sort by key 
} 
String hadoopOutputPathAsString = directory; 
flatRDD.saveAsTextFile(hadoopOutputPathAsString); 
} 

} 을 반환하는 아이디의 목록을 통과 실행기의 ///////////// NUM 9 드라이버 메모리 : 실행 프로그램 메모리의 2g : 6g에게 execuotr 코어 12

내 프로그램이 map/reduce (동일한 코드 스켈레톤)보다 느리게 실행됩니다. 위의 코드 스켈레톤을 최적화하는 데 도움이 될 수 있습니다.

+0

제공하신 코드는 완전히 읽을 수 없습니다. 심하게 들여 쓰기가 쉬우 며 부품이 분명히 빠져 있습니다. 중괄호가 일치하지 않습니다. 그걸 정리 해주시겠습니까? –

답변

3

coalesce으로 전화하지 마십시오. 파티션이 덜 필요하므로 더 많이 필요합니다. 108 개의 작업자 코어가 있지만 6 개의 파티션이있는 경우 6 개만 사용합니다. 어림짐작은 최소한 3 * num_executors * cores_per_executor = 324 파티션이 필요하다는 것입니다.

JavaRDD<String> temp = unionbioSetId.repartition(350); 

또는 파티션 수를 전혀 변경하지 마십시오. 파일을 읽을 때 데이터는 Hadoop 스플릿으로 분할됩니다. 대부분의 경우 레이아웃이 좋으며 다시 분할하는 데 드는 비용을 피할 수 있습니다.

을 별도로 읽은 다음 해당 유니온을 가져 오는 대신 sc.textFile("file1,file2,file3,...") 또는 sc.textFile("dir/*")으로 읽습니다. 또한 성능 차이가 발생할 수 있습니다.

+0

감사합니다. Daniel. 참조 용 코드를 포맷했습니다. 기밀로되어있는 특정 코드 양식을 제거했습니다. 병합으로 인해 프로그램 실행에 4 분이 걸렸지 만 다시 분할하면 15 분 이상 걸립니다. 내 입력 파일이 다른 경로에 있기 때문에 sc.textFile ("dir/*")을 사용할 수 없으며 파일을 변경해서는 안됩니다. 그래서 각 파일을 읽고 RDD로 변환 한 다음 모든 RDD의 조합을 만들어야합니다. 그러면 8 천만 개의 키 값 쌍이 기록됩니다. .textfile default split을 사용하면 프로그램이 outofmemory 오류로 실행됩니다. –

+0

허, 왜 더 많은 파티션을 가지고 느리게 돌아가고 있는지 궁금해합니다.하지만'sc.textFile'에 대해서는 쉼표로 구분 된 파일 이름 목록을 지정할 수 있습니다. 그것은 비록 그것이 더 빨리 만들 것이라는 보장은 없습니다. –

+0

예. 더 많은 파티션이있는 경우 모든 집행자를 적절하게 활용하지만 시간이 오래 걸립니다. 나는 병합 및 재분할 API에 대해 의심 스럽다. 내 프로그램을 합치면 초고속입니다. 다시 분할 대신 병합을 사용할 수 있습니까? 여전히 동일한 결과가 나타납니다. 고마워요. –