2016-10-26 3 views
3

나는 이미 conf.set("spark.rdd.compress","true")persist(MEMORY_AND_DISK_SER)을 사용하여 RDD를 압축하고 있습니다. Kryo 직렬화를 사용하면 프로그램이 더 효율적으로 만들어 집니까, 아니면이 경우 유용하지 않습니까? 나는 Kryo가 더 효율적인 방법으로 노드들간에 데이터를 보내기위한 것이라는 것을 알고있다. 그러나 통신 된 데이터가 이미 압축 된 경우에도 필요합니까?Spark에서 Kryo 직렬화를 언제 사용합니까?

+0

내가 이해하는 바와 같이 Spark는 직렬화 메커니즘에 의해 제공된 바이트 배열을 압축합니다 (직렬화가 발생한 후). 그러면 통신 속도가 빨라집니다. 표준 Java serializer를 사용하기 때문에 직렬화 자체의 속도는 향상되지 않습니다. – dk14

답변

1

크리 오 직렬화가 더 최적화 된 직렬화 기술이므로 RDD 또는 데이터 프레임 클로저에 사용되는 모든 클래스를 직렬화하는 데 사용할 수 있습니다. 아래에서와 같이 kryo serialization의 특정 사용을 위해

  1. RDD pr 데이터 프레임 클로저 내에서 사용되는 타사 비 직렬화 클래스를 직렬화해야하는 경우에 사용하십시오.
  2. 효율적인 직렬화 기술을 사용하고 싶습니다.
  3. 일부 클래스로 인해 직렬화 오류가 발생하지 않은 경우 u 클래스에 kryo serializer를 등록 할 수 있습니다.
1

또 다른 점을 고려하십시오. 직렬화 및 직렬화 해제에서 키로는 기본값보다 빠르기 때문에 키로를 사용하는 것이 좋습니다. 그러나 성능 향상은 프로그램 속도에 영향을주는 다른 점이 있습니다. 예를 들어 spark 코드를 작성하는 방법, lib를 선택하는 방법 등이 있습니다.

1

설명 된 (압축되고 지속 된) RDD 상태 모두 직렬화를 사용합니다. RDD를 지속 할 때는 직렬화하고 디스크에 저장합니다 (직렬화 된 출력을 압축하는 경우). 직렬화는 셔플 (노드간에 데이터 전송)에도 사용되는 것이 옳습니다 : 데이터가 로컬 디스크 나 네트워크를 통해 JVM을 떠나야 할 때마다 직렬화해야합니다.

Kryo는 크게 최적화 된 시리얼 라이저이며, 거의 모든 것을 위해 표준 java 시리얼 라이저보다 성능이 뛰어납니다. 귀하의 경우 실제로 이미 Kryo를 사용하고있을 수 있습니다. 귀하의 스파크 구성 매개 변수를 확인할 수 있습니다 :

"spark.serializer"는 "org.apache.spark.serializer.KryoSerializer"이어야합니다. 그렇지 않은 경우

은 다음과 내부적으로 설정할 수 있습니다 : 마지막 질문 ("? 그것도 필요하다")에 관한

conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") 

, 그에 대한 일반적인 주장을하기 어렵다. Kryo는 데이터 통신에있어 느린 단계 중 하나를 최적화하지만, 유스 케이스에서는 다른 사람들이 당신을지지하고 있습니다. 그러나 Kryo를 시도하고 그 차이를 벤치마킹 할 때 단점은 없습니다!