# apache spark

Spark memory 관련 옵션 및 Planning
오늘은 간단하게 spark의 메모리 옵션을 계획하는 글을 다루어보도록 하겠습니다. 최근 들어서 spark에서의 쿼리 퍼포먼스를 더 낼 수 있는 방법에 대하여 공부 중에 있어서, 스파크 튜닝 관련 내용과 옵션들을 다시 정리해두면 좋을 것 같아 글을 작성하게 되었습니다. Memory 관련 옵션들의 의미 yarn.nodemanager.resource.memory-mb nodemanager가 컨테이너를 생성할 때 쓸 수 있는 용량을 의미합니다. [r5.4xlarge](https://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseG
Spark 돌리다가 만난 에러들 정리
Another instance of Derby may have already booted the database /root/spark-1.6.0-bin-hadoop2.6/bin/metastore_db. metastore_db에 있는 dbex.lck을 지우면 된다. temporary라서 지워도 다시 생김.
Spark Configuration
Spark configuration Spark의 property, memory, core 등을 설정하고자 하면 spark-default.conf, pyspark(혹은 자신이 쓰는 shell), spark-submit, SparkConf 파일을 수정하면 된다. Property 적용 순서는 SparkConf, shell 파일, spark-submit, spark-default.conf

Apache Spark - Memory
러닝스푼즈 - Practical Spark 강의 를 요약한 내용입니다. Spark 는 다양한 실행 모드를 지원하고, 각 실행 모드에 따라 컴포넌트의 실행 위치가 달라짐 Local 모드라면 단일 JVM 내에 Driver 와 Executor 가 존재 Client 모드라면 Driver JVM 과 다수의 Executor JVM 이 존재

Apache Spark - Join Strategy
Spark는 분산 처리 컴퓨팅 엔진이므로 일반적인 RDMS보다 조금 더 폭 넓게 Join Strategy를 지원 Broadcast Hash Join Broadcast Nested Loop Join Shuffle Hash Join Shuffle Sort Merge Join Cartesian Product Join Spark SQL을 사용하여 Join을 할 때, 여러 타입의 힌트가 지원 BROADCAST 힌트 사용시 autoBroadcastJoinThreshold 옵션을 무시하고 동작 MERGE (SHUFFLE_MERGE 과 동일) Sort-mege 조인을 사용 SHUFFLE_HASH SHUFFLEREPLICATENL 만약 JOIN 대상 양쪽 테이블에 Join 을 위한 다른 Hint 가 각각 지정된다면 Spark 는 다음의 우선순위를 이용해 결정 BROADCAST > MERGE > SHUFFLE_HASH > SHU

Apache Spark - Cache와 Persistence
러닝스푼즈 - Practical Spark 강의와 스파크 완벽 가이드 를 요약한 내용입니다. Cache Spark 데이터 가공을 빠르고 효율적으로 하기 위한 기능 Spark는 논리적인 수준에서 데이터를 파티션 단위로 나누어 처리 !

Amazon EMR의 기능을 알아보자
Amazon EMR 기능 살펴보기 1\. 사용 편의성 Amazon EMR을 사용하면 빅 데이터 환경 및 애플리케이션을 간단하게 구축하고 운영할 수 있습니다. 관련 EMR 기능을 통해 클러스터 및 협업 개발을 위한 EMR Studio를 쉽게 프로비저닝하고 관리형으로 확장하고 재구성할 수 있습니다. 몇 분 내에 클러스터 프로비저닝: 몇 분 내에 EMR 클러스터를 시작할 수 있습니다. 인프라 프로비저닝, 클러스터 설정, 구성 또는 튜닝에 대해 걱정할 필요가 없습니다. EMR은 이러한 작업을 처리하여 팀이 차별화된 빅 데이터 애플리케이션 개발에 집중할 수 있도록 합니다. 비즈니스 요구 사항을 충족하도록 리소스의 규모를 쉽게 조정: EMR 관리형 스케일링 정책 확장 및 축소를 쉽게 설정하고 EMR 클러스터를 통해 사용 및 성능 요구를 충족할 수 있도록 컴퓨팅 리소스를 자동으로 관리할 수 있습니다. 이렇게 하면 클러스터 활용도를 향상시키고
Ubuntu 20.04 Apache Spark & Zeppelin 설치하기
Ubuntu 20.04 LTS 환경 설치하기 전엔 항상 입력해주자 Java Install Java PATH Apache Spark Install PATH setting Screenshot from 2022-02-04 04-17-48 Start master server / 8080 포트 확인 http://localhost:8080 접속 Screenshot from 2022-02-04 04-23-58 Start wo

[Apache Spark] 아파치 스파크의 메모리 관리에 대해서
Spark를 사용하다보면 메모리 관련해서 문제가 발생되는 경우가 많습니다. 최근 연구하는데 있어서 Apach Spark의 Structured Streaming(https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html)을 사용할 일이 있어서 사용하는데 메모리 관련해서 문제가 자주 발생되어 이와 관련된 공부한 내용을 적습니다. 본격적인 스파크의 메모리 관리를 알아보기 위해서는 Spark가 왜 메모리 관리 관련해서 알아야되는지 알아야합니다. 왜 스파크의 메모리 관리에 대해서 알아야 하는가? 🤯 스파크는 Task가 수행하는데 있어서 모든 계산이 메모리 내에서 발생하는 메모리 내 처리 엔진입니다 (정확히는 In-Memory technol

Apache Spark - 집계 함수
스파크 완벽 가이드 를 요약한 내용입니다. Aggregation 구매 이력 데이터를 사용해 파티션을 휠씬 적은 수로 분할할 수 있도록 리파티셔닝 빠르게 접근할 수 있도록 캐싱 집계 함수 org.apache.spark.sql.functions 패키지 참조 count countDistinct 고유레코드 수 approxcountdistinct 근사치로 구하지만 연산 속도가 빠름 first와 last min과 max 문자열도 동작이 됨 sum sumDistinct avg avg, mean 함수로 평균을 구함 분산과 표준편차 표본표준분산 및 편차: variance

Apache Spark - Architecture
러닝스푼즈 - Practical Spark 강의와 스파크 완벽 가이드 를 요약한 내용입니다. 한 대의 컴퓨터는 대규모 정보를 연산할 만큼 자원이나 성능을 가지지 못함 클러스터는 여러 컴퓨터의 자원을 모아 하나의 컴퓨터처럼 사용할 수 있도록 해줌 Cluster Manager는 다수의 Spark 작업을 실행할 수 있도록 리소스를 관리해주는 Hadoop, AWS EMR의 YARN 혹은 Kubernetes와 같은 클러스터를 말함 사용자는

Apache Spark - 주요 개념
러닝스푼즈 - Practical Spark 강의와 스파크 완벽 가이드 를 요약한 내용입니다. Spark를 사용하여 데이터를 다양한 저장소(eg. Kafka, MySQL 등)에서 원하는 Format(eg.CSV, Avro, Parquet 등) 으로 읽기 데이터를 다른 데이터와 합치거나 필터링 및 선택 데이터를 집계 (GROUP BY AGG) 가공한 데이터를 다양한 저장소에 원하는 Format 으로 저장 가 가능한데, 이러한 작업들을 할 때 Spark의 내부 동작 과정이 발생 Transformation과 Action Spark의 DataFrame / SQL / DataSet API를 사용할 때, 내부적으로 RDD로 코드가 생성되어 실행 RDD

[Apache Spark] Spark SQL의 카탈리스트 옵티마이저
😎 Spark SQL이 편리한 이유! 사용하는 데이터 포맷이 parquet이고, SQL만으로 처리할 수 있는 경우 schema에 매핑되는 클래스를 정의할 필요가 없다. Spark SQL에서는 Catalyst Optimizer가 최적화를 대신해준다. DataFrame은 Untyped Data인 Row를 사용하기 때문에 연산에 제한이 있었지만, Dataset은 Typed Data로 변환하여 처리하기 때문에 DataFrame보다 좀 더 복잡한 연산이 가능하다.       😮 Catalyst Optimizer Spark SQL을 구현하기 위해 확장 가능한 옵티마이저인 카탈리스트가 구현되었다. 🧚♀️ 카탈리스트의 확장 가능한 설계의 목적 Spark SQL에 새로운 최적화 요소나 기술 추가를 쉽게 할 수 있게 하기 외부 개발자들이 Optimizer를 확장시키는 것을 가능하게 하기 &nbs

[Apache Spark] 스파크 스케줄러
🧚 Fair Scheduler 스파크 애플리케이션은 여러 잡을 실행시켜 원하는 바를 달성한다. 스파크 잡은 태스크라고 하는 더 작은 실행 단위로 나뉜다. 이 태스크는 여러 익스큐터에게 작업 실행을 요청함으로써 병렬 처리가 가능하다. 태스크가 종료되면 결과를 받고 다른 태스크를 실행 요청하며, 잡의 모든 태스크가 완료될 때까지 작업 요청을 진행하게 된다. 잡의 모든 태스크가 종료되면 다음 잡을 실행할 수 있다. 즉, FIFO 구조이다. 🚨 하나의 잡에서 실행해야 할 태스크가 엄청 많다면?! 뒤에 들어오는 잡의 태스크 수가 아무리 적어도 앞선 태스크가 끝나지 않으면 멈춰서 기다려야 한다. 이렇게 되면 잡의 순수 실행 시간의 총합은 동일하겠지만, 대기시간
[Apache Spark] 에코시스템
🐍 PySpark 저수준 API(특히 RDD)를 사용하는 경우 유연성을 얻는 대신 성능 저하를 감수해야 한다. 파이썬 데이터를 스파크와 JVM에서 이해할 수 있도록 변환하고 그 반대로 변환하는 과정에서 큰 비용이 발생하기 때문이다. 이 과정에는 데이터 직렬화 처리 과정과 함수 처리 과정이 포함된다. 구조적 API는 동작 속도가 빠르다. 여러 프로그래밍 모델을 함께 사용할 수 있다는 장점이 있다. 예) 스파크를 이용해 큰 규모의 ETL 작업 수행 → 결과를 드라이버로 수집 → Pandas 라이브러리를 활용해 해당 결과에 대한 추가 처리 작업 진행 즉, 스파크로 빅데이터를 처리하고 Pandas 라이브러리로 작은 데이터를 처리하는 기능을 사용할 수 있다. 🌩️ 스파크 패키지 사용 방법 스칼라나 자바를 사용하는 경우 → 빌드 파일의 의존성 부분에 포함시킨다! 파이썬이나 R을
[Apache Spark] 성능 튜닝
잡의 실행 속도를 높이기 위한 성능 튜닝 방법을 알아보자! 간접적인 성능 향상 → 전체 스파크 애플리케이션이나 스파크 잡에 영향을 미치게 된다. 직접적인 성능 향상 → 개별 스파크 잡, 스테이지, 태스크, 코드 등 특정 영역에만 영향을 주므로 전체 스파크 애플리케이션이나 스파크 잡에는 영향을 미치지 않는다. 🧚 간접적인 성능 향상 기법 🏢 설계 방안 좋은 설계 방안으로 애플리케이션을 설계해야 한다. 👉 스칼라 vs 자바 vs 파이썬 vs R 사용자의 환경에 따라 언어를 달리 선택할 수 있다. 단일 머신 머신러닝 → R RDD 트랜스포메이션, UDF 사용하는 경우 → R과 파이썬은 지양 사용자 정의 함수를 정의하면 데이터 타입과 처리 과정을 엄격하게 보장하기 어럽기 때문에, 애플리케이션 주 언어로 파이썬을 사용하고 일부를 스칼라로 변경하거나 스칼라 UDF를 정의해

[Apache Spark] 모니터링과 디버깅
🌭 모니터링 범위 스파크 애플리케이션과 잡 클러스터에서 애플리케이션이 실행되는 상황을 파악하거나 디버깅하려면 스파크 UI와 스파크 로그를 확인해야 한다. 스파크 UI와 스파크 로그는 RDD와 쿼리 실행 계확과 같은 개념적 수준의 정보를 제공한다. JVM 스파크는 모든 익스큐터를 개별 JVM에서 실행하므로 코드가 실행되는 과정을 이해하기 위해 각 가상 머신을 모니터링해야 한다. 일부 정보는 스파크 UI에서도 확인할 수 있지만, 저수준 디버깅이 필요하다면 JVM 도구가 더 유용하다. OS와 머신 JVM은 호스트 운영 시스템(OS)에서 실행되므로 머신의 상태를 모
[Apache Spark] 스파크 배포 환경
1️⃣ 클러스터 환경 🫐 설치형 클러스터 (on-premise) 장점 자체 데이터센터를 운영하는 조직에 적합하다. 사용 중인 하드웨어를 완전히 제어할 수 있으므로 특정 워크로드의 성능을 최적화할 수 있다. 여러 종류의 저장소를 선택할 수 있다. 단점 설치형 클러스터의 크기가 제한적이다. (너무 작거나 너무 클 수 있음) 하둡 파일 시스템(HDFS)이나 키-값 저장소 같은 자체 저장소 시스템을 선택하고 운영해야 한다. 설치형 클러스터의 자원 활용 문제를 해결할 수 있는 가장 좋은 방법은 클러스터 매니저를 사용하는 것이다. → 다수의 스파크 애플리케이션을 실행할 수 있고 자원을 동적으로 재할당할 수 있다. ☁️ 클라우드 배포 환경 (public cloud) 장점 자원을 탄력적으로 늘이고 줄이는 것이 가능하다. 애플리케이션마다 다른
[Apache Spark] 스파크 애플리케이션 개발하기
💡 스파크 애플리케이션 스파크 애플리케이션 → 스파크 클러스터 + 사용자 코드 🧣 스칼라 기반 앱 스칼라는 스파크의 '기본' 언어이기 때문에 애플리케이션을 개발하는 가장 적합한 방법으로 볼 수 있다. 스파크 애플리케이션은 두 가지 자바 가상 머신 기반의 빌드 도구인 sbt나 아파치 메이븐을 이용해 빌드할 수 있다. 스칼라 애플리케이션에 sbt 빌드 환경을 구성하려면 패키지 정보를 관리하기 위해 build.sbt 파일을 정의해야 하는데, build.sbt 파일에 포함되어야 할 핵심 항목은 아래와 같다. 프로젝트 메타데이터 (패키지명, 패키지 버전 정보 등) 라이브러리 의존성을 관리하는 장소 라이브러리에 포함된 의존성 정보 사용자 코드를 작성하고 spark-submit 명령을 사용해 코드를 클러스터에 제출한다. 프로젝트를 설정하고 코드를 작성한 뒤 빌드한다. 'uber-jar',
[Spark] Spark Streaming 피보나치 수열 예제
소스코드 출처 : O'REILLY 스파크를 활용한 실시간 처리 상태 기반 피보나치 원소 연산 n번째 요소를 얻기 위해 n-1 번째 요소를 처리 비상태 기반 피보나치 원소 연산 ` 비네 공식 (Binet formula) 를 이용하여 이전 요소를 구하지 않고 직접 계산 -> 스트림의 상태를 알 필요가 없음