2017-12-26 6 views
3

스파크 직렬화와 관련하여 2 가지 질문이 있습니다. 단순히 인터넷 검색으로 답변을 찾을 수 없습니다.Spark : Dataframe Serialization

  1. 현재 사용중인 시리얼 라이저의 이름을 어떻게 인쇄 할 수 있습니까? 나는 spark.serializer가 Java인지 Kryo인지를 알고 싶다.
  2. 나는 Kryo 직렬화를 사용하기로되어있는 다음 코드를 가지고있다; 데이터 프레임에 사용 된 메모리 크기는 21 메가가됩니다. 이것은 직렬화없이 캐싱 만했을 때의 1/4입니다. 그러나 Kryo 구성을 제거하면 크기가 동일하게 유지됩니다. 이것은 Kryo가 처음부터 사용 된 적이 없다는 것을 의미합니까? 데이터 프레임의 레코드가 단순히 행이기 때문에 자바와 Kryo 직렬화가 모두 같은 크기 일 수 있습니까?

    val conf = new SparkConf()  
    conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")  
    conf.set("spark.kryo.registrationRequired", "false")  
    val spark = SparkSession.builder.master("local[*]").config(conf) 
         .appName("KryoWithRegistrationNOTRequired").getOrCreate  
    val df = spark.read.csv("09-MajesticMillion.csv")  
    df.persist(StorageLevel.MEMORY_ONLY_SER) 
    

답변

2

출처 : http://www.agildata.com/apache-spark-rdd-vs-dataframe-vs-dataset/

스파크 1.3 스파크의 성능과 확장 성을 개선하기 위해 지속적인 노력을 기울이고 프로젝트 텅스텐 이니셔티브의 일환으로 새로운 DataFrame API를 소개했다. DataFrame API는 데이터를 설명하는 스키마 개념을 도입하여 Java 직렬화를 사용하는 것보다 훨씬 효율적인 방식으로 Spark에서 스키마를 관리하고 노드간에 데이터를 전달할 수있게합니다. Spark가 바이너리 형식의 오프 힙 저장소로 데이터를 직렬화 한 다음이 오프 힙 메모리에서 직접 많은 변환을 수행하여 개별 개체를 구성하는 것과 관련된 가비지 수집 비용을 피할 수 있으므로 단일 프로세스에서 계산을 수행 할 때 장점이 있습니다 데이터 세트의 각 행에 대해 Spark는 스키마를 이해하기 때문에 데이터를 인코딩하기 위해 Java 직렬화를 사용할 필요가 없습니다.

3

이 Kryo을 뜻은 처음부터 사용하지 않았다?

정확히 의미합니다. Spark SQL (Dataset)은 캐싱을 위해 자체 컬럼 저장 공간을 사용합니다. 따라서 Java 또는 Kryo 직렬화가 사용되지 않으므로 spark.serializer은 전혀 영향을 미치지 않습니다.

+1

답변 해 주셔서 감사합니다. 이것을 설명하는 문서 또는 문서를 참조 할 수 있습니까? – user1888243