ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spark] Spark Lazy Evaluation 알아보기
    Spark 2023. 5. 22. 07:52
    728x90
    반응형

    - 목차

     

    Transformation 과 Action.

     

    Spark Application 은 Transformation 과 Action 들로 구성됩니다. 
    Transformation 은 filter, select, groupBy, orderBy 등이 있구요.
    그리고 Action 은 show, write, collect, agg 등이 있습니다. 
    이들 각각은 이름에서도 알 수 있듯이, 
    Transformation 은 데이터를 변형하는 Operation 이며, 
    Action 은 새로운 Dataset 을 생성하는 Operation 입니다. 

    여기서 Action 의 내부적인 동작을 이해하는 것이 중요합니다. 
    Action 을 통해서 실질적인 Lazy Evaluation 이 수행되기 때문이죠. 
    Action 을 이해하기 예시를 작성해보겠습니다. 

    List<Row> sourceData = Arrays.asList(
                RowFactory.create("Alice", 30, "Seoul"),
                RowFactory.create("Bob", 20, "Daegu"),
                RowFactory.create("Cindy", 25, "Busan")
        );
    
    StructType schema = new StructType()
            .add(new StructField("name", DataTypes.StringType, false, Metadata.empty()))
            .add(new StructField("age", DataTypes.IntegerType, false, Metadata.empty()))
            .add(new StructField("city", DataTypes.StringType, false, Metadata.empty()));
    
    Dataset<Row> dataset = session.createDataFrame(sourceData, schema);
    Dataset<Row> dataset1 = dataset.filter("name = 'Andy'");
    Dataset<Row> dataset2 = dataset1.select("name", "city");
    dataset2.show();



    위 예시에서 2개의 Transformation 과 1개의 Action 이 사용되었습니다. 
    filter, select 는 Transformation 입니다. 
    name 이 'andy' 인 Row 들을 필터링하고, 
    name, age, city 칼럼들 중에서 age 칼럼을 제외시킵니다. 
    그리고 show 라는 표준 출력을 위한 Action 이 수행되죠. 

    이렇게 Spark Application 은 위와 같이 Transformation 과 Action 들로 구성됩니다. 


    Lazy Evaluation.

    Lazy Evaluation 은 Transformation 의 수행을 지연시키는 것을 의미합니다. 
    filter 와 같은 Transformation Operation 이 코드의 수행 과정에서 즉각적으로 수행되는 것이 아니라 
    적절한 시기가 될때까지 지연됨을 뜻하는데요. 
    Transformation 이 수행되는 시점은 Action 이 실행되는 시점이며, 
    Action 이 Transformation 을 위한 트리거가 됩니다. 

    위 예시를 보면, show 라는 Action 이 수행될 때에 filter 와 select 에 해당하는 Transformation 이 실행됩니다. 

    이와 같이 Lazy Evaluation 을 사용함으로써 얻는 성능적인 이점이 있습니다. 
    이를 Query Optimization 라고 부르는데요. 
    관련된 이점을 살펴보겠습니다. 

     


    predicate pushdown.

    이는 DataSource 레벨에서 얻을 수 있는 이점입니다. 
    Avro, Parquet 와 같이 Schema 를 가지는 파일들은 자체적인 File Reader 를 활용하여 파일의 데이터를 조회합니다. 
    Filter 기능을 사용함으로써 File Read 과정에서 원하는 데이터만을 선별하여 조회할 수 있습니다. 
    마치 필요한 파일의 일부만을 로드하는 관점으로 Disk IO 를 줄이고, 최초로 로드되는 메모리 용량을 줄일 수 있습니다. 

    column pruning.


    Parquet, ORC 와 같은 Column-based File 들은 내부적으로 파일 조회시에 칼럼 단위로 필터링하는 것이 가능합니다. 
    이를 column pruning 이라고 합니다. Avro 나 JSON 같이 Row 기반의 파일에서 적용할 수는 없습니다. 

    반응형
Designed by Tistory.