2016-06-02 4 views
0

나는 스칼라 2.11로 만든 Dataproc에 스파크를 사용하는 방법을 찾고 있어요. 내 일자리가 ~ 10 BigQuery 테이블을 가져 오기 때문에 2.11을 사용하고 새로운 리플렉션 라이브러리를 사용하여 해당 객체를 사례 클래스에 매핑합니다. (스칼라 2.11에서만 수정 된 새로운 리플렉션 클래스와 동시성에 대한 버그가 있습니다.)이 문제를 해결하기 위해 executor-core를 1로 설정했지만 성능이 저하되는 것은 힘듭니다. 더 좋은 방법이 있습니까?스팍 1.6.X와 Dataproc 클러스터 스칼라 2.11.X를 사용하여

답변

1

일반적으로 executor-cores를 1로 설정하면 동시성 문제를 해결할 수있는 합리적인 방법입니다. Spark 작업에 통합 할 수있는 타사 라이브러리에도 스레드 안전 문제가 발생할 수 있기 때문에 동시성 문제를 해결할 수 있습니다. 핵심은 성능을 희생시키지 않으면 서 실행자의 크기를 1 코어로만 조정할 수 있어야한다는 것입니다. (더 큰 스케줄링 오버 헤드 및 원사 오버 헤드는 ~ 10 %의 성능 저하를 의미 할 수 있지만 관리하기 어려운 것은 아닙니다.) .

8 코어 VM (Dataproc은 기본적으로 VM 당 2 명의 실행자를 팩)에서 8 코어 중 2 개만 사용하기 때문에 몇 가지 곱셈 요소 성능 저하가 있다고 가정합니다. 이 문제를 해결하는 방법은 spark.executor.memory을 비례하여 1 코어와 일치하도록 조정하는 것입니다. 당신은 4 코어 VM을 사용하는 경우, 예를 들어, 클러스터 구성 (gcloud dataproc clusters describe your-cluster-name)에서 당신은 같은 볼 수 있습니다 : 전체 메모리가 아닌 코어를 기반으로

spark:spark.executor.cores: '2' 
spark:spark.executor.memory: 5586m 

원사 팩을, 그래서 이것은 5586m 절반에 맞게 설계되어 의미 YARN 노드이므로 2 코어에 해당합니다. 이 같은 클러스터 출현 경우 :

gcloud dataproc clusters create \ 
    --properties spark:spark.executor.cores=1,spark:spark.executor.memory=2000m 

을 그리고 당신은 여전히 ​​모든 코어를 사용하는 설치와 끝까지해야하지만 동시성 문제없이 (각 집행 과정에서 하나 개의 작업자 스레드 만 해당). 당신은뿐만 아니라 spark:spark.yarn.executor.memoryOverhead 감안해야하기 때문에

난 그냥 새로운 실행 프로그램 크기를 결정하기 위해 다시 다음 memoryOverhead 빼기 2로 나누기 때문에 기본적으로 다음의 memoryOverhead에 추가 할 수 있고,이 경우 5586/2을 사용하지 않은 , 그리고 그 배분은 512m라고 생각되는 기본 청크 크기의 다음 배수까지 또한 배정됩니다.

일반적으로 코어 당 메모리 할당을 조금 더 낮추고 더 많은 메모리 헤드 룸이 필요한 경우 늘리면 시행 착오를 사용할 수 있습니다.

클러스터를 재배포 할 필요가 없습니다. 더 빠른 처리 시간 대신 작업 제출 시간에 다음을 지정할 수 있습니다.

gcloud dataproc jobs submit spark \ 
    --properties spark.executor.cores=1,spark.executor.memory=2000m