spark 맵과 mapPartitions 차이

2431 단어 spark

주요 차이점:


맵은 rdd의 모든 요소를 조작합니다.
mapPartitions는 rdd의 모든 구역의 교체기를 조작합니다

MapPartitions의 이점:


일반적인 맵이라면, 예를 들면 파티션에 1만 개의 데이터가 있다.ok, 그럼 당신의 기능은 1만 번을 실행하고 계산해야 합니다.
맵 Partitions를 사용한 후, 하나의task는function을 한 번만 실행하고, function는 모든 파티션 데이터를 한 번에 수신합니다.한 번만 실행하면 돼, 성능이 비교적 높아.맵 과정에서 추가 대상을 빈번하게 만들어야 한다면 (예를 들어 rdd의 데이터를 jdbc를 통해 데이터베이스에 기록해야 하고, 맵은 모든 요소에 대한 링크를 만들어야 하고, 맵파티션은 모든 파티션에 대한 링크를 만들어야 한다) 맵파티션의 효율은 맵보다 훨씬 높다.
SparkSql 또는 DataFrame은 기본적으로 mapPartition을 최적화합니다.
 

MapPartitions의 단점:


일반적인 맵 작업이라면 function의 실행으로 데이터를 처리합니다.그렇다면 메모리가 부족한 경우, 예를 들어 1천 개의 데이터를 처리했다면, 이때 메모리가 부족하다면, 이미 처리된 1천 개의 데이터를 메모리에서 쓰레기로 회수하거나 다른 방법으로 공간을 비울 수 있다.따라서 일반적인 맵 작업은 메모리의 OOM 이상을 초래하지 않습니다. 
그러나MapPartitions 조작은 대량의 데이터에 대해 말하자면 심지어 하나의 파티션, 100만 개의 데이터가 한 번에 하나의 function에 전송된 후에 한꺼번에 메모리가 부족할 수 있지만 메모리 공간을 비울 방법이 없다. OOM으로 메모리가 넘칠 수도 있다.

Demo


각 숫자를 2배로 바꾸는 기능 구현
def main(args: Array[String]): Unit = {

  var conf = new SparkConf().setMaster("local[*]").setAppName("partitions")
  var sc   = new SparkContext(conf)

  println("1.map--------------------------------")
  var aa   = sc.parallelize(1 to 9, 3)
  def doubleMap(a:Int) : (Int, Int) = { (a, a*2) }
  val aa_res = aa.map(doubleMap)
  println(aa.getNumPartitions)
  println(aa_res.collect().mkString)

  
  println("2.mapPartitions-------------------")
  val bb = sc.parallelize(1 to 9, 3)
  def doubleMapPartition( iter : Iterator[Int]) : Iterator[ (Int, Int) ] = {
    var res = List[(Int,Int)]()
    while (iter.hasNext){
      val cur = iter.next()
      res .::= (cur, cur*2)
    }
    res.iterator
  }
  val bb_res = bb.mapPartitions(doubleMapPartition)
  println(bb_res.collect().mkString)


  println("3.mapPartitions-------------------")
  var cc = sc.makeRDD(1 to 5, 2)
  var cc_ref = cc.mapPartitions( x => {
    var result = List[Int]()
    var i = 0
    while(x.hasNext){
      val cur = x.next()
      result.::= (cur*2)
    }
    result.iterator
  })
  cc_ref.foreach(println)
}

 

출력 결과:

1.map--------------------------------
3
(1,2)(2,4)(3,6)(4,8)(5,10)(6,12)(7,14)(8,16)(9,18)

2.mapPartitions-------------------
(3,6)(2,4)(1,2)(6,12)(5,10)(4,8)(9,18)(8,16)(7,14)

3.mapPartitions-------------------
4
2
8
10
6

좋은 웹페이지 즐겨찾기