복붙노트

[HADOOP] RDD 파티션 방법

HADOOP

RDD 파티션 방법

공백으로 구분 된 많은 수의 부동 소수점 값으로 구성된 텍스트 파일이 있습니다. 이 파일을 scala의 RDD에로드하고 있습니다. 이 RDD는 어떻게 분할됩니까?

또한 모든 파티션에 동일한 수의 요소가 각 파티션의 인덱스와 함께 포함되도록 사용자 지정 파티션을 생성하는 방법이 있습니까?

val dRDD = sc.textFile("hdfs://master:54310/Data/input*")
keyval=dRDD.map(x =>process(x.trim().split(' ').map(_.toDouble),query_norm,m,r))

여기에 HDFS에서 여러 텍스트 파일을로드하고 프로세스는 내가 부르고있는 함수입니다. mapPartitonsWithIndex와 함께 솔루션을 사용할 수 있습니까? 함께 프로세스 함수 내에서 해당 인덱스에 액세스 할 수 있습니까? 지도는 파티션을 섞습니다.

해결법

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

    1.coalesce 함수를 사용하여 사용자 정의 파티션을 생성 할 수 있습니다.

    coalesce 함수를 사용하여 사용자 정의 파티션을 생성 할 수 있습니다.

    coalesce(numPartitions: Int, shuffle: Boolean = false): RDD[T]
    
  2. ==============================

    2.로드 된 rdd는 기본적으로 partitioner : hash code로 분할됩니다. 커스텀 파티셔너를 지정하려면, 자신의 파티셔너와 함께 제공되는 rdd.partitionBy ()를 확인할 수 있습니다.

    로드 된 rdd는 기본적으로 partitioner : hash code로 분할됩니다. 커스텀 파티셔너를 지정하려면, 자신의 파티셔너와 함께 제공되는 rdd.partitionBy ()를 확인할 수 있습니다.

    coalesce ()를 사용하는 것은 괜찮은 것으로 생각하지 않습니다. api docs에서 coalesce ()는 파티션 수를 줄이는 경우에만 사용할 수 있으며 심지어 coalesce ()를 사용하여 사용자 정의 파티션을 지정할 수도 없습니다.

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

    3.기본적으로 파티션은 각 HDFS 파티션에 대해 만들어지며 기본적으로 64MB입니다. 자세한 내용은 여기를 참조하십시오.

    기본적으로 파티션은 각 HDFS 파티션에 대해 만들어지며 기본적으로 64MB입니다. 자세한 내용은 여기를 참조하십시오.

    먼저 데이터를 다시 분할 할 수있는 세 가지 방법을 살펴보십시오.

    1) 두 번째 매개 변수, 필요한 최소 파티션 수     RDD의 경우 textFile ()에 입력해야하지만주의해야합니다.

    In [14]: lines = sc.textFile("data")
    
    In [15]: lines.getNumPartitions()
    Out[15]: 1000
    
    In [16]: lines = sc.textFile("data", 500)
    
    In [17]: lines.getNumPartitions()
    Out[17]: 1434
    
    In [18]: lines = sc.textFile("data", 5000)
    
    In [19]: lines.getNumPartitions()
    Out[19]: 5926
    

    보시다시피, [16]은 RDD가 가진 파티션의 수는 이미 우리가 요청한 파티션의 최소 수보다 큽니다.

    2) 다음과 같이 repartition ()을 사용하십시오.

    In [22]: lines = lines.repartition(10)
    
    In [23]: lines.getNumPartitions()
    Out[23]: 10
    

    경고 : 이것은 셔플을 불러오고 RDD에있는 파티션의 수를 늘리려는 경우에 사용해야합니다.

    문서에서 :

    3) 다음과 같이 coalesce ()를 사용하십시오.

    In [25]: lines = lines.coalesce(2)
    
    In [26]: lines.getNumPartitions()
    Out[26]: 2
    

    여기서 Spark는 RDD를 축소하고이를 활용할 것임을 알고 있습니다. 리 파티션 () vs coalesce ()에 대해 자세히 알아보십시오.

    하지만이 모든 것이 데이터가 파티션 전체에서 완벽하게 균형을 유지하도록 보장 할 것입니까? 실제로 파티션에서 데이터의 균형을 유지하는 방법에 대해 경험했던 것처럼?

  4. from https://stackoverflow.com/questions/24671755/how-to-partition-a-rdd by cc-by-sa and MIT license