2017-04-19 1 views
0

업데이트 : 폴더 크기는 2T입니다 !!! 이제 내 질문은 어떻게 스파크와 같은 큰 파일을 처리하는 것입니다?거대한 폴더의 계산 번호가 Spark에서 실패했습니다.


나는 거대한 폴더 크기 (최소 200GB 이상, 정확한 크기를 알지 못함)가있는 온라인 저장 용량을 보유하고 있습니다. 거대한 폴더 안에있는 모든 파일의 줄 번호를 계산 중입니다.

spark.sparkContext.textFile("online/path").filter(x => x.contains("keyword")).count 

하지만 항상 실패했습니다. Spark UI에서 총 작업 수는 1,546,000이고 110,000 개의 작업을 마친 후에 프로그램이 실패했음을 확인했습니다.

로그 파일을 확인하려고했지만 로그 파일 자체가 너무 커서 내 브라우저에서 읽을 수 없습니다.

나는 또한 시도 mapParititions :

spark.sparkContext.textFile.mapPartitions(p => p.filter(x => x.contains("keyword"))).count() 

없음을 빕니다.

내 설정 :

Driver Memory: 16G 
Executor memory: 16G 
Executor Number: 12 
Executor Core number :10 

내 스파크 클러스터가 138 개 코어와 800G의 메모리가 있습니다.

답변

0

~ 128MB 파티션에 할당 된 각 작업 및 실행 프로그램 당 10 코어로이 작업이 클러스터에서 완료 될 것으로 기대됩니다. 너무 많은 작업을하는 경우가있을 수 있습니다. 각각의 작업은 단순한 오버 헤드가 있기 때문입니다. 이 가설을 테스트하려면 병합으로 파티션 수를 줄이십시오. 예 :

spark.sparkContext.textFile("online/path").coalesce(1000).filter(x => x.contains("keyword")).count 
+0

는이 문제는 너무 많은 시간이 소요되지 않습니다. 대신 문제는 추락합니다. – derek

+0

나는 다시 분할을 사용했다 : 다시 파티션하기 (120) 그리고 여전히 동일하다. – derek

+0

죄송합니다, 명확히하겠습니다. 150 만 건의 작업 오버 헤드로 인해 충돌이 발생할 가능성이 큽니다. 다음과 같이 작은 클러스터에서이 문제를 복제 할 수 있습니다. val df = (0에서 1500000까지) .toDF.repartition (1500000); df.count; 파티션 나누기가 병합과 다른 점은 병합 (1000)이 셔플을 발생시키지 않고 150 만 개의 작업을 트리거하는 반면 파티션 나누기 (1000)는 데이터를 다시 셔플 할 때 150 만 작업을 계속 트리거 함을 의미합니다. –

0

"textFile"에는 두 번째 매개 변수 인 "minPartitions"가 있습니다. 아마도 시도해 볼 수 있습니다.

파일 크기가 작고, 파일 개수가 큰 경우, 다른 읽기 방법을 사용할 수있다 "wholeTextFiles"

관련 문제