2017-02-27 3 views
0

통계가있는 일련의 결과를 생성하는 Spark 작업이 있습니다. 내 작업 항목 수는 슬레이브 수 이상입니다. 그래서 나는 슬레이브 당 하나 이상의 처리를하고있다.Spark 작업자 프로세스 내에서 파일을 작성하십시오.

I cache 결과는 여러 개의 쓰기 작업 (결과 개체에 대한 개체와 통계 개체에 대한 개체)을 사용하기 때문에 RDD 개체를 다시 생성 한 후 결과입니다. 두 쓰기 작업 모두 saveAsHadoopFile을 사용합니다.

캐싱하지 않고 각 쓰기 작업마다 다시 작업을 다시 실행하며 오랜 시간이 걸리고 동일한 실행을 두 번 다시 수행합니다 (쓰기가 더 많은 경우 더 많은 작업).

캐싱 기능을 사용하면 메모리 제한이 초과됩니다. 이전에 계산 된 결과 중 일부는 캐싱 중에 손실되고 메시지는 "CacheManager:58 - Partition rdd_1_0 not found, computing it"입니다. Spark은 결과를 더 많이 캐시하려고 시도하면서 결국에는 무한 루프를 반복합니다.

나는 스파크가 캐싱을위한 다른 저장 레벨을 가지고 있다는 사실을 알고있다. 메모리 + 디스크를 사용하면 우리의 문제를 해결할 수 있습니다. 그러나 나는 우리가 RDD 객체를 생성하지 않고 작업자에게 바로 파일을 기록 할 수 있는지 여부를 궁금해합니다. 비록 그것이 가능한지 확실하지 않습니다. 그렇지?

답변

0

Spark 작업자 프로세스 내에 파일을 쓰는 것이 Java 프로세스에서 파일을 쓰는 것과 다르지 않습니다. 쓰기 작업은 파일을 직렬화하고 HDFS에 저장하는 기능 만 있으면됩니다. This question에는이를 수행하는 방법에 대한 몇 가지 대답이 있습니다.

saveAsHadoopFile은이를 수행하는 편리한 방법입니다.