apache-spark - write - spark sql이란



작업자, 코어 및 DataFrame 크기를 기반으로 Spark 파티션의 최적 수 결정 (1)

Spark-land에는 작업이 다른 노드로 배포되고 동시에 실행되는 방식을 둘러싼 여러 가지 유사하지만 아직 다른 개념이 있습니다. 구체적으로는 다음과 같습니다.

  • 스파크 드라이버 노드 ( sparkDriverCount )
  • Spark 클러스터에 사용 가능한 작업자 노드 수 ( numWorkerNodes )
  • Spark 집행자의 수 ( numExecutors )
  • 모든 근로자 / 집행자가 동시에 DataFrame을 조작합니다 ( dataFrame )
  • dataFrame 의 행 수 ( numDFRows )
  • dataFrame 의 파티션 수 ( numPartitions )
  • 마지막으로 각 작업자 노드에서 사용할 수있는 CPU 코어 수 ( numCpuCoresPerWorker )

모든 스파크 클러스터에는 스파크 드라이버 가 하나 뿐인 다음 0 개 이상의 작업자 노드가 있다고 생각 합니다. 내가 틀렸다면, 저를 바로 잡아서 시작하십시오! 나는 그것에 대해 다소 정확하다고 가정하고 여기에 몇 가지 변수를 고정시켜 보겠습니다. 우리는 드라이버 1 개와 작업자 노드 4 개의 Spark 클러스터를 가지고 있으며, 각 Worker Node에는 4 개의 CPU 코어가 있으므로 총 16 개의 CPU 코어가 있다고 가정 해 보겠습니다. 그래서 "주어진"여기에 있습니다 :

sparkDriverCount = 1
numWorkerNodes = 4
numCpuCores = numWorkerNodes * numCpuCoresPerWorker = 4 * 4 = 16

설정으로 볼 때 몇 가지를 결정하는 방법을 궁금해합니다. 구체적으로 :

  • numWorkerNodesnumExecutors 사이의 관계는 무엇입니까? 유언 집행자에 대한 근로자 비율이 알려져 있습니까? numWorkerNodes (또는 다른 입력)가 주어진 numWorkerNodes 를 결정하는 방법이 있습니까?
  • numDFRows 대한 numPartitions 의 알려진 / 일반적으로 받아 들여지는 / 최적의 비율이 있습니까? 어떻게 dataFrame 의 크기를 기반으로 '최적의'파티션 수를 계산합니까?
  • 저는 다른 엔지니어로부터 일반적인 '경험 법칙'에 대해 다음과 같이 들었습니다. numPartitions = numWorkerNodes * numCpuCoresPerWorker , 그 어떤 진실? 즉, CPU 코어 당 1 개의 파티션이 있어야한다고 규정합니다.

예, spark 애플리케이션에는 드라이버하나만 있습니다.

numWorkerNodesnumExecutors 사이의 관계는 무엇입니까?

작업자는 여러 실행자를 호스트 할 수 있습니다. 작업자가 클러스터의 시스템 / 노드가되고 Executor가 해당 작업자에서 실행되는 프로세스 (코어에서 실행)로 생각할 수 있습니다.

그래서`numWorkerNodes <= numExecutors '입니다.

그 (것)들을위한 어떤 배급 있는가?

개인적으로, 가짜 클러스터에서 작업 한 결과, 내 랩톱이 드라이버 였고 동일한 랩톱의 가상 컴퓨터가 작업자 였고 10k 노드 이상의 산업 클러스터에서 필자는 신경 쓸 필요가 없었습니다. spark 가 그것을 처리하는 것 같습니다.

나는 단지 다음을 사용한다.

--num-executors 64

내 스크립트를 시작 / 제출하고 spark 알면, 얼마나 많은 작업자가 소환해야하는지 알 수 있습니다 (물론 다른 매개 변수와 기계의 특성을 고려하여).

따라서, 개인적으로, 나는 그런 비율을 모른다.

numDFRows 대한 numPartitions 의 알려진 / 일반적으로 받아 들여지는 / 최적의 비율이 있습니까?

나는 하나도 알지 못하지만 어쨌든 #executor의 제품에 # executor.cores를 의지하여 그 결과를 3 또는 4로 곱할 수 있습니다. 물론 이것은 경험적 입니다. pyspark 다음과 같이 보일 것입니다 :

sc = SparkContext(appName = "smeeb-App")
total_cores = int(sc._conf.get('spark.executor.instances')) * int(sc._conf.get('spark.executor.cores'))
dataset = sc.textFile(input_path, total_cores * 3)

DataFrame 의 크기에 따라 '최적의'파티션 수를 어떻게 계산합니까?

그것은 대단한 질문입니다. 물론 대답하기가 어렵고 데이터, 클러스터 등에 달려 있지만 here 나 자신과 함께 논의 here .

파티션이 너무 적어서 대용량 데이터를 처리 할 때 특히 큰 데이터를 처리 할 때 응용 프로그램을 메모리 스트레스에 bigdata 시킬 수 있습니다.

파티션이 너무 많으면 hdfs 에서 생성 hdfs 모든 메타 데이터가 임시 파일 등을 유지하기 때문에 파티션 수가 증가함에 따라 크게 증가하므로 hdfs 에 많은 압력을 가할 수 있습니다. *

그래서 원하는 것은 응용 프로그램미세 조정 하는 부분 중 하나 인 많은 수의 파티션에 적합한 지점 을 찾는 것입니다. :)

'경험 법칙'은 다음과 같습니다. numPartitions = numWorkerNodes * numCpuCoresPerWorker , numPartitions = numWorkerNodes * numCpuCoresPerWorker 습니까?

아, 이걸보기 전에 위의 휴리스틱을 썼습니다. 따라서 이것은 이미 답변되었지만 근로자집행자 의 차이점을 고려합니다.

* 오늘 막 실패했습니다. 너무 많은 파티션을 사용할 때 파이크를 통해 스파크로 내 빅 데이터를 준비하십시오 . 활성 작업은 스파크 UI에서 음수 입니다.





bigdata