나는 이미 conf.set("spark.rdd.compress","true")
과 persist(MEMORY_AND_DISK_SER)
을 사용하여 RDD를 압축하고 있습니다. Kryo 직렬화를 사용하면 프로그램이 더 효율적으로 만들어 집니까, 아니면이 경우 유용하지 않습니까? 나는 Kryo가 더 효율적인 방법으로 노드들간에 데이터를 보내기위한 것이라는 것을 알고있다. 그러나 통신 된 데이터가 이미 압축 된 경우에도 필요합니까?Spark에서 Kryo 직렬화를 언제 사용합니까?
답변
크리 오 직렬화가 더 최적화 된 직렬화 기술이므로 RDD 또는 데이터 프레임 클로저에 사용되는 모든 클래스를 직렬화하는 데 사용할 수 있습니다. 아래에서와 같이 kryo serialization의 특정 사용을 위해
- RDD pr 데이터 프레임 클로저 내에서 사용되는 타사 비 직렬화 클래스를 직렬화해야하는 경우에 사용하십시오.
- 효율적인 직렬화 기술을 사용하고 싶습니다.
- 일부 클래스로 인해 직렬화 오류가 발생하지 않은 경우 u 클래스에 kryo serializer를 등록 할 수 있습니다.
또 다른 점을 고려하십시오. 직렬화 및 직렬화 해제에서 키로는 기본값보다 빠르기 때문에 키로를 사용하는 것이 좋습니다. 그러나 성능 향상은 프로그램 속도에 영향을주는 다른 점이 있습니다. 예를 들어 spark 코드를 작성하는 방법, lib를 선택하는 방법 등이 있습니다.
설명 된 (압축되고 지속 된) RDD 상태 모두 직렬화를 사용합니다. RDD를 지속 할 때는 직렬화하고 디스크에 저장합니다 (직렬화 된 출력을 압축하는 경우). 직렬화는 셔플 (노드간에 데이터 전송)에도 사용되는 것이 옳습니다 : 데이터가 로컬 디스크 나 네트워크를 통해 JVM을 떠나야 할 때마다 직렬화해야합니다.
Kryo는 크게 최적화 된 시리얼 라이저이며, 거의 모든 것을 위해 표준 java 시리얼 라이저보다 성능이 뛰어납니다. 귀하의 경우 실제로 이미 Kryo를 사용하고있을 수 있습니다. 귀하의 스파크 구성 매개 변수를 확인할 수 있습니다 :
"spark.serializer"는 "org.apache.spark.serializer.KryoSerializer"이어야합니다. 그렇지 않은 경우
은 다음과 내부적으로 설정할 수 있습니다 : 마지막 질문 ("? 그것도 필요하다")에 관한
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
, 그에 대한 일반적인 주장을하기 어렵다. Kryo는 데이터 통신에있어 느린 단계 중 하나를 최적화하지만, 유스 케이스에서는 다른 사람들이 당신을지지하고 있습니다. 그러나 Kryo를 시도하고 그 차이를 벤치마킹 할 때 단점은 없습니다!
내가 이해하는 바와 같이 Spark는 직렬화 메커니즘에 의해 제공된 바이트 배열을 압축합니다 (직렬화가 발생한 후). 그러면 통신 속도가 빨라집니다. 표준 Java serializer를 사용하기 때문에 직렬화 자체의 속도는 향상되지 않습니다. – dk14