Apache Spark 개인적 실습했던 내용을 옮겨보고자 한다.
서버 스펙 : 4대 서버(Mater Node 1대 / Worker Node 3대)
테스트 데이터 : 테스트 데이터 6.5G
작업 내용 : 테스트 데이터 GroupBy/Aggregate 연산 진행
Single Machine(Python) 테스트
→ OutOfMemory로 작업 Killed
Single Machine(PySpark Local Mode) 테스트
→ 대용량 데이터 처리하는 메커니즘이 달라 느리지만 작업은 오류없이 완료
Apache Spark(Pyspark Yarn Mode) 로컬 데이터 연산 실습
→ FileNotFoundException 발생 이유 : 데이터를 병렬 처리로 처리 도중 2번 WorkNode에서 1997.csv 파일을 찾지 못해 발생한 오류. 해당 파일을 모든 WorkNode에 카피 후 다시 실습 진행
오류 없이 작업이 성공하였고, 앞선 실습(Pyspark Local Mode)에서 싱글노드 환경에서 작업을 실행했을 때와 처리속도가 3배이상 차이가 발생함.
분산 처리 과정
Spark Driver가 분석 파일을 읽고 Hadoop Block Size(128MB) 만큼 나눠서 WorkNode Executor에 배분
각 데이터 작업 완료 후 노드별로 데이터 집계를 진행(집계 진행 시 네트워크 통신을 통해 데이터 이동이 발생하기에 남발되면 속도가 저하됨)
Apache Spark(Pyspark Yarn Mode) Hadoop 데이터 연산 실습
앞서 데이터 연산 실습한 데이터를 Local 아닌 Hadoop 올려 실습 진행
Apache Spark(Pyspark Standalone) 실행(Default)
Standalone 모드에 경우 Core수를 주지않으면 전부 할당됨. Executor Memory의 경우는 1G 할당.
2번째로 실행된 Application는 1번째로 실행된 Application이 Core 자원을 전부할당받아 사용중이기에 반환할 때까지, 대기하게 됨.
1번째 어플리케이션 완료 후 회수받은 자원으로 2번째 Application이 실행되는 것을 확인할 수 있음.
Apache Spark(Pyspark Standalone) 실행(Core 2/Memory 2G/Executor 4)
Spark RDD 와 Spark DataFrame 비교
둘다 작업 속도는 차이가 없음(SparkSQL도 결국은 내부적으로 RDD로 작업이 수행되기 때문)같은 데이터 처리 작업을 하는 코드이지만 직관성면에서 차이가 큼.
Spark Join(Shuffle/Broadcast) Network 통신방식 차이
Spark Cache / persist
cache() 와 persist는 첫 Action 실행 후 RDD 정보를 메모리 또는 디스크에 저장해 다음 Action 수행할 때 불필요한 재생성 필요없이 원하는 작업 즉시 실행할 수 있게 해주는 메소드
cache() 메서드와 persist()메서드는 둘 다 로드된 데이터를 저장공간상에 올려두는 작업을 하며,
RDD.cache()는 persist(StorageLevel.MEMORY_ONLY)
DF_cache()는 persist(StorageLevel.MEMORY_AND_DISK) 로 작동한다.
DF.cache()는 df.persist(StorageLevel.MEMORY_AND_DISK) 와 같다고 볼 수 있다.
1.cache()
RDD 데이터를 메모리에 저장하고, 만약 저장 메모리 공간이 충분치 않다면 부족한 용량만큼 저장하지 않음.
2.persist()
StorageLevel Option을 통해 저장위치(메모리/디스크)와 저장방식(직렬화여부) 등 상세히 지정할 수 있는 기능 제공.
RDD Cache vs DataFrame Cache
강의 때 무조건 데이터프레임 캐시가 좋다고하셨는데 찾아보고 추후 기재예정.