주니어 데이터 엔지니어 우솨's 개발일지

데이터 엔지니어링 59일차 TIL 본문

데브코스

데이터 엔지니어링 59일차 TIL

우솨 2024. 6. 30. 10:09

학습 내용

 

Spark의 주요 파일 타입


Parquet : Spark의 기본 파일 포맷
- 트위터와 클라우데라에서 공동 개발(Doug Cutting)



파티션 다시 나누기

df2 = df.repartition(4)


파티션 줄이기

df3 = df2.coalesce(2)


파티션 저장
format종류 : avro ,parquet, json 등

df.write \
    .format("avro") \
    .mode("overwrite") \
    .option("path", "dataOutput/avro/") \
    .save()


Transformations and Actions
- Transformations
        - Narrow Dependencies : 독립적인 partition level 작업
                - select, filter, map 등등
        - Wide Dependencies : Shuffling이 필요한 작업
                - groupby, reduceby, partitionby, repartition, coalesce 등
- Actions
        - Read, Write, Show, Collect -> Job을 실행시킴(실제 코드가 실행)
        - Lazy Exeuction
                - 더 많은 오퍼레이션을 볼 수 있기에 최적화를 더 잘할 수 있다. => 그래서 SQL이 더 선호됨

Jobs, Stages, Tasks
- Action : Job을 하나 만들어내고 코드가 실제로 실행됨
- Job : 하나 혹은 그 이상의 stage로 구성(Stage는 Shuffling이 발생하는 경우 새로 생김)
- Stage : DAG의 형태로 구성된 Task들 존재(stage의 Task들은 병렬실행이 가능) 
- Task : 가상 작은 실행 유닛으로 Executor에 의해 실행됨

Bucketing
- DataFrame을 특정 ID를 기준으로 나눠서 테이블로 저장
        - 다음부터는 이를 로딩하여 사용함으로써 반복처리시 시간 단축
        - DataFrameWriter의 bucketBy 함수 사용
        - Bucket의 수와 기준 ID 지정
        - 데이터의 특성을 잘 알고 있는 경우 사용 가능하다.

File System Partitioning
- 데이터를 Partition Key 기반 폴더("Partition") 구조로 물리적으로 나눠저장
- 굉장히 큰 로그 파일을 데이터 생성시간 기반으로 데이터 읽기를 많이 한다면?
        - 데이터 자체를 연도-월-일의 폴더 구조로 저장
- 데이터를 읽기 과정을 최적화(스캐닝 과정이 줄어들거나 없어짐)
- 데이터 관리도 쉬워짐(Retention Policy적용시)
- Partition key를 잘못 선택하면 엄청나게 많은 파일들이 생성된다.