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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spark 팁: 컴퓨팅 집약적인 작업을 위해 병합 후 셔플 파티션 비활성화작은 입력에서 UDAF(사용자 정의 집계 함수) 내에서 컴퓨팅 집약적인 작업을 수행할 때 spark.sql.adaptive.coalescePartitions.enabled를 false로 설정합니다. Apache Sp...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.