복붙노트

[SCALA] 어떻게 유착에 가장 numberOfPartitions을 계산?

SCALA

어떻게 유착에 가장 numberOfPartitions을 계산?

그래서, 일반적으로 하나의 COALESCE ()를 사용한다는 것을 이해 :

나는 또한 필요한 경우에만 데이터를 이동하여 셔플 감소대로 다시 파티션보다 저렴 것으로 알고 있습니다. 내 문제는 유착이 소요되는 매개 변수 (idealPartionionNo)를 정의하는 방법이다. 나는 다른 기사에서 저에 전달 프로젝트를 진행하고 그는 그 매개 변수의 값을 계산하기 위해 아래의 계산을 사용하고 있었다.

// DEFINE OPTIMAL PARTITION NUMBER
implicit val NO_OF_EXECUTOR_INSTANCES = sc.getConf.getInt("spark.executor.instances", 5)
implicit val NO_OF_EXECUTOR_CORES = sc.getConf.getInt("spark.executor.cores", 2)

val idealPartionionNo = NO_OF_EXECUTOR_INSTANCES * NO_OF_EXECUTOR_CORES * REPARTITION_FACTOR

이것은 다음 파티션 프로그램 객체에 사용된다 :

val partitioner = new HashPartitioner(idealPartionionNo)

또한 다음과 함께 사용했을 때

RDD.filter(x=>x._3<30).coalesce(idealPartionionNo)

이것은 올바른 접근 방식인가? idealPartionionNo 값 계산 뒤에 주요 아이디어는 무엇인가? REPARTITION_FACTOR은 무엇인가? 어떻게 일반적으로 그 정의 작동합니까?

원사가 즉시 사용할 수있는 집행을 식별 할 책임이 있기 때문에 또한, 그 (AVAILABLE_EXECUTOR_INSTANCES으로 즉, 대체 NO_OF_EXECUTOR_INSTANCES) idealPartionionNo을 계산 즉시 사용에 해당 번호 (AVAILABLE_EXECUTOR_INSTANCES)를 얻는 방법은 무엇입니까?

이상적으로, 양식의 몇 가지 실제 사례 :

그때:

당신이이를 설명하는 좋은 블로그에 저를 참조 할 수 있습니다 경우에도, 정말 감사합니다.

해결법

  1. ==============================

    1.실제로 파티션의 최적의 번호는 사용 가능한 자원보다 당신이 가지고있는 데이터 변환을 사용하고 전체 구성에 더 의존한다.

    실제로 파티션의 최적의 번호는 사용 가능한 자원보다 당신이 가지고있는 데이터 변환을 사용하고 전체 구성에 더 의존한다.

    당신은 (일반적으로 요인 2 또는 3 보인다) 코어의 수에 비해 파티션을 oversubscribing 제안 규칙의 번호를 찾거나 특정 크기로 파티션을 유지하지만,이 계정에 자신의 코드를 고려하지 않습니다 수 있습니다 :

    내 의견으로는 :

    어떤 것들은 당신은 일반적으로 기억해야한다 :

  2. ==============================

    2.귀하의 질문은 유효 하나이지만, 스파크 분할 최적화는 실행중인 계산에 전적으로 의존한다. 당신은 다시 분할 / 병합에 좋은 이유가 필요; 당신은 단지 RDD을 (그것은 인구가 띄엄 띄엄 파티션의 거대한 숫자가 있더라도) 계산하는 경우 다음 어떤 다시 분할 / 병합 단계는 당신을 늦출 것입니다.

    귀하의 질문은 유효 하나이지만, 스파크 분할 최적화는 실행중인 계산에 전적으로 의존한다. 당신은 다시 분할 / 병합에 좋은 이유가 필요; 당신은 단지 RDD을 (그것은 인구가 띄엄 띄엄 파티션의 거대한 숫자가 있더라도) 계산하는 경우 다음 어떤 다시 분할 / 병합 단계는 당신을 늦출 것입니다.

    = 셔플 사실 N (병합과 동일 재분할 (N)의 차이 () 및 병합은 (N, 셔플 = 거짓)를 실행 모델과 관련이있다. 셔플 모델 원래 RDD 각 파티션을 얻어, 임의로 보낸다 파티션의 새 (작은 이상) 수를 가진 RDD에서의 모든 집행에 주위 데이터 및 결과. 노 셔플 모델은 하나 개의 작업으로 부하를 여러 파티션을 새로운 RDD을 만듭니다.

    의이 계산을 생각해 보자 :

    sc.textFile("massive_file.txt")
      .filter(sparseFilterFunction) // leaves only 0.1% of the lines
      .coalesce(numPartitions, shuffle = shuffle)
    

    셔플이 true이면 텍스트 파일 / 필터 계산은 TEXTFILE에 기본값으로 지정된 태스크의 수에서 발생하고, 작은 필터링 된 결과가 섞습니다. 셔플이 거짓 인 경우, 전체 작업의 수는 가장 numPartitions이다.

    numPartitions가 1 인 경우, 그 차이는 매우 굳어진다. 셔플 모델은 처리 후 하류 DAG 조작 한 실행기 필터링 결과 0.1 %를 전송할 병렬 데이터를 필터링한다. 노 셔플 모델은 처리하고 모든 처음부터 하나 개의 코어의 데이터를 필터링합니다.

    다운 스트림 작업을 고려하십시오. 한 번만이 데이터 집합을 사용하는 경우, 당신은 아마에 다시 분할 할 필요가 없습니다. 당신이 (예를 들어 디스크에) 나중에 사용하기 위해 필터링 RDD를 저장하는 경우, 위의 장단점을 고려하십시오. 그것은이 모델에 익숙해지는 경험을 소요 할 때 하나 개를 수행 나은, 그래서 모두를 시도하고 그들이 수행하는 방법을 참조하십시오!

  3. ==============================

    3.다른 사람이 대답 것처럼, 당신이 무엇을 물어 계산하는 어떤 공식이 없다. 즉 당신은 첫 번째 부분에 대한 추측하고 시간이 지남에 따라 다음 미세 조정을 할 수 있습니다 말했다.

    다른 사람이 대답 것처럼, 당신이 무엇을 물어 계산하는 어떤 공식이 없다. 즉 당신은 첫 번째 부분에 대한 추측하고 시간이 지남에 따라 다음 미세 조정을 할 수 있습니다 말했다.

    첫 번째 단계는 당신이 충분한 파티션을 확인하는 것입니다. 당신이 실행기 당 NO_OF_EXECUTOR_INSTANCES의 집행 및 NO_OF_EXECUTOR_CORES 코어가 경우에 당신은 * 동시에 NO_OF_EXECUTOR_CORES 파티션 (각 특정 인스턴스의 특정 코어에 갈 것) NO_OF_EXECUTOR_INSTANCES를 처리 할 수 ​​있습니다. 즉,이 모든 것을이 코어 사이에 균등하게 분배되어 있다고 가정하고 모든 프로세스에 정확히 같은 시간이 필요했다. 이것은 드문 경우입니다. 그들 중 일부는 (예를 들어, 데이터 요구가 다른 노드에서 온) 또는이 균형되지 않습니다 때문에 단순히 때문에 locallity 중 하나 다른 사람 전에 완료 될 수있는 좋은 기회가있다 (예를 들어, 다음을 포함한 다음 루트 도메인으로 분할 된 데이터 파티션이있는 경우 구글은 아마) 매우 큰 것입니다. REPARTITION_FACTOR가 활동하기 시작하는 곳이다. 아이디어는 우리가 각 코어를 "초과 예약"따라서 만약 하나 명의 마감 매우 빠르게 일 명 마감 천천히 우리가 그들 사이에 작업을 나눌 수있는 옵션을 가지고있다. 2-3의 요인은 일반적으로 좋은 아이디어이다.

    이제 단일 파티션의 크기를 살펴 수 있습니다. 전체 데이터를 말할 수 것은 크기가 X MB 그리고 당신은 N 파티션을 가지고있다. 각 파티션은 평균 X / N의 매크로 블럭에있을 것입니다. N은 X에 큰 상대 인 경우에 당신은 아주 작은 평균 파티션 크기 (예를 들어, 몇 KB)가 있습니다. 이 경우에는 일반적으로 각 파티션을 관리하는 오버 헤드가 너무 높으면 때문에 N을 낮출 수있는 좋은 아이디어이다. 크기가 매우 큰 경우, 다른 한편으로 (예를 들어, 몇 GB)에 당신은 등 가비지 컬렉션, 메모리 사용 등의 문제가 발생할 것 같은 시간에 많은 데이터를 보유 할 필요가

    최적의 크기는 좋은 질문이지만, 일반적으로 사람들은 좋은 것입니다 아마 100~1,000메가바이트의하지만 MB의 진실 수십에서 파티션을 선호하는 것 같다.

    당신이 당신의 파티션이 어떻게 변하는 지 계산을 할 때주의해야하는 또 다른 것입니다. 예를 들어, 공간이 100MB 각 1000 개 파티션으로 시작하지만 각 파티션은 당신이해야 아마 유착 1K가되도록 데이터를 필터링 말할 수 있습니다. 당신이 GROUPBY을하거나 가입 할 때 비슷한 문제가 발생할 수 있습니다. 이러한 경우 파티션의 크기와 파티션의 수를 모두 변경하고 바람직하지 않은 크기에 도달 할 수 있습니다.

  4. from https://stackoverflow.com/questions/40865326/how-to-calculate-the-best-numberofpartitions-for-coalesce by cc-by-sa and MIT license