캐시와 지속의 차이점은 무엇입니까?


답변:


222

와 함께 cache(), 당신은 단지 기본 저장 수준을 사용 :

  • MEMORY_ONLY대한 RDD
  • MEMORY_AND_DISK에 대한 데이터 집합

을 사용하면 RDD데이터 세트persist() 모두에 대해 원하는 스토리지 레벨을 지정할 수 있습니다 .

공식 문서에서 :

  • 에 () 또는 () 메소드를 RDD사용하여 지속되도록 표시 할 수 있습니다 .persistcache
  • 지속되는 각각 RDD은 다른을 사용하여 저장할 수 있습니다storage level
  • cache() 메소드는 기본 저장 레벨을 사용하는 속기 StorageLevel.MEMORY_ONLY(저장 메모리에서 객체를 탈 직렬화).

다음 persist()이외의 스토리지 레벨을 지정하려는 경우 사용하십시오 .

  • MEMORY_ONLY받는 RDD
  • MEMORY_AND_DISK에 대한 데이터 집합

공식 문서에 대한 흥미로운 링크 : 선택할 스토리지 레벨


17
참고 cache()현재 사용 MEMORY_AND_DISK
ximiki

위의 의견이 맞지 않다고 생각합니다. 링크 ahars를 사용하여 최신 공식 문서를 읽으면 마지막 글 머리 기호와 일치합니다. cache () 메서드는 기본 저장소 수준 인 StorageLevel.MEMORY_ONLY (직렬화 해제 된 개체를 메모리에 저장)를 사용하기위한 약식입니다.
user2596560

1
@ximiki MEMORY_AND_DISK는 데이터 세트의 기본값입니다. MEMORY_ONLYRDD의 기본값입니다.
ahars

1
@ user2596560 주석이 데이터 세트의 기본 캐시 값에 맞습니다. MEMORY_ONLY 기본값을 유지하는 RDD에 대한 귀하의 권리
ahars

83

cachepersist운영 의 차이점 은 순전히 구문입니다. 캐시가 지속되거나 (지속의 동의어이다 MEMORY_ONLY), 즉 cache단지입니다 persist기본 저장 용량 수준으로MEMORY_ONLY


/ ** *이 RDD를 기본 저장소 수준 ( MEMORY_ONLY)으로 유지합니다. * /
def persist () : this.type = persist (StorageLevel.MEMORY_ONLY)

/ ** *이 RDD를 기본 저장소 수준 ( MEMORY_ONLY)으로 유지합니다. * /
def cache () : this.type = persist ()

자세한 내용은 여기를 참조하십시오 ...


캐싱 또는 지속성은 (반복 및 대화식) Spark 계산을위한 최적화 기술입니다. 중간 부분 결과를 저장하여 이후 단계에서 재사용 할 수 있습니다. 따라서 이러한 중간 결과 RDD는 메모리 (기본값) 또는 디스크와 같은 더 견고한 저장소 및 / 또는 복제에 유지됩니다. 작업을 RDD사용하여 캐시 할 수 있습니다 cache. persist작업을 사용하여 지속될 수도 있습니다 .

persist, cache

이 기능을 사용하여의 저장 레벨을 조정할 수 있습니다 RDD. 메모리를 확보 할 때 Spark는 스토리지 수준 식별자를 사용하여 유지할 파티션을 결정합니다. 매개 변수 less variant persist() 및 cache()는 다음에 대한 약어입니다. persist(StorageLevel.MEMORY_ONLY).

경고 : 저장 레벨이 변경되면 다시 변경할 수 없습니다!

경고-캐시를 신중하게 ... 참조 ( (왜) 캐시를 호출하거나 RDD를 유지해야합니까? )

RDD메모리에 캐시 할 수 있다고 해서 맹목적으로 그렇게해야한다는 의미는 아닙니다. 데이터 세트에 몇 번 액세스했는지와 그렇게하는 데 소요되는 작업량에 따라 메모리 압력 증가로 인해 지불 한 가격보다 재 계산 속도가 빨라질 수 있습니다.

캐싱 할 시점이 없으면 데이터 집합을 읽은 경우 실제로 작업 속도가 느려질 것입니다. 캐시 된 데이터 세트의 크기는 Spark Shell에서 확인할 수 있습니다.

변형 나열 ...

def cache(): RDD[T]
 def persist(): RDD[T]
 def persist(newLevel: StorageLevel): RDD[T]

* 아래 예 참조 : *

val c = sc.parallelize(List("Gnu", "Cat", "Rat", "Dog", "Gnu", "Rat"), 2)
     c.getStorageLevel
     res0: org.apache.spark.storage.StorageLevel = StorageLevel(false, false, false, false, 1)
     c.cache
     c.getStorageLevel
     res2: org.apache.spark.storage.StorageLevel = StorageLevel(false, true, false, true, 1)

여기에 이미지를 입력하십시오

참고 : 캐싱과 지속성의 매우 작고 순전히 구문상의 차이로 인해 RDD 때문에 두 용어는 종종 서로 바꿔서 사용됩니다.

더 시각적으로 여기를 참조하십시오 ....

메모리와 디스크에 지속

여기에 이미지 설명을 입력하십시오

은닉처

캐싱은 응용 프로그램의 성능을 크게 향상시킬 수 있습니다.

여기에 이미지 설명을 입력하십시오


블록 안에 DF가 있는데 어떻게 접근 할 수 있습니까?
Bindumalini KK

48

다른 점이 없다. 에서 RDD.scala.

/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)

/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
def cache(): this.type = persist()

23

스파크는 5 가지 유형의 스토리지 레벨을 제공합니다

  • MEMORY_ONLY
  • MEMORY_ONLY_SER
  • MEMORY_AND_DISK
  • MEMORY_AND_DISK_SER
  • DISK_ONLY

cache()사용 MEMORY_ONLY합니다. 다른 것을 사용하려면을 사용하십시오 persist(StorageLevel.<*type*>).

기본적으로 persist()데이터는 JVM 힙에 직렬화되지 않은 객체로 저장됩니다.


4

Cache () 및 persist () 두 방법 모두 스파크 계산 성능을 향상시키는 데 사용됩니다. 이러한 방법은 중간 단계 결과를 저장하여 후속 단계에서 재사용 할 수 있도록합니다.

cache ()와 persist ()의 유일한 차이점은 캐시 기술을 사용하여 필요한 경우에만 중간 결과를 메모리에 저장할 수 있고 Persist ()에서는 중간 결과를 5 개의 스토리지 레벨 (MEMORY_ONLY, MEMORY_AND_DISK, MEMORY_ONLY_SER, MEMORY_AND_DISK_SER, DISK_ONLY).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.