728x90
반응형

쾅쾅 부딪히면서 배운 스파크 관련 내용을 그냥 실무에 적용만 해버리고 말면 다 까먹을 것 같아서 정리를 좀 해보려고 한다.

(근데 진짜 쾅쾅 부딪혔다는 점...ㅠ)


Spark 를 띄울 때 가장 기본적으로 설정해야 하는 요소인 Driver와 Executor 사이즈와 개수를 설정하는 방법과 관련 내용을 정리해 보자.

Spark job을 제출한 예시이다.

spark3-submit --master yarn --deploy-mode cluster --queue default --conf spark.dynamicAllocation.enabled=False --conf spark.sql.parquet.writeLegacyFormat=True --conf spark.sql.catalog.spark_catalog.type=hive --files hdfs://nameservice1/user/myConfig.conf --num-executors 3 --executor-cores 2 --executor-memory 4g --driver-memory 2G --name my_test_spark_job --class myApp.MyClass hdfs://nameservice1/user/my-jar.jar
  • executor 수를 정했고: --num-executor 3
  • executor 코어 수를 정했고: --executor-cores 2
  • executor 메모리 크기를 정했다: --executor-memory 4g
  • 추가로 driver 메모리 크기도 정했다: --driver-memory 2g

 

스파크 관련 기초 글은 아래를 참고하자!

2023.12.03 - [코딩해/Kafka, Spark, Data Engineering] - [Spark] 스파크 구조와 실행 과정 | 스파크 기초

 

[Spark] 스파크 구조와 실행 과정 | 스파크 기초

아주 기본적인 내용이지만 글로 정리해보려고 한다. 스파크 처음하는 사람들에게 조금이라도 도움이 될까 해서! 스파크는 Spark Application과 Cluster manager로 구성되어 있다. 그리고 Spark Application에

haonly.tistory.com


Executor에 관한 좀 더 깊은 내용을 알아보자

  • Executor는 캐싱과 실행을 위한 공간을 갖고 있는 JVM이다.
  • Executor와 driver 사이즈는 하나의 노드나 컨테이너에 할당된 자원보다 많은 메모리나 코어를 가질 수 없다.
  • Executor의 일부 공간은 스파크의 내부 메타 데이터와 사용자 자료구조를 위해 예약되어야 한다.(평균 약 25%) 이 공간은 spark.memory.fraction 설정으로 변경 가능하며, 기본값은 0.6으로 나머지 0.4는 캐싱에 쓰인다.
  • 하나의 partition이 여러 개의 executor에서 처리될 수 없다 --> 하나의 partition은 하나의 executor에서 처리

 

Executor 크기

Executor 크기는 어떻게 설정하면 좋을까?

executor의 수는 많게, 크기(core)를 작게 설정하면 

  1. OOM, spill 등이 생길 수 있다. -> 처리할 자원이 충분하지 않기 때문이다.
  2. 자원을 효율적으로 사용할 수 없다. -> 같은 노드 내 executor끼리 통신에도 비용이 필요하다.

executor의 수는 적게, 크기(core)를 크게 설정하면

  1. 너무 큰 executor는 힙 사이즈가 클수록 GC가 시작되는 시점을 지연시켜 Full GC로 인한 지연을 더욱 크게 만든다.
  2. executor당 많은 수의 코어를 쓰면 동시 스레드가 많아지면서 스레드를 다루는 HDFS의 제한으로 인해 성능이 더 떨어질 수도 있다. 

효율적인 세팅을 위해서

  • GPU 자원 기준으로 executor의 개수를 정하고,
  • executor당 메모리는 4GB 이상, executor당 core 수는 (1 < number of GPUs <= 5) 기준으로 설정한다면 일반적으로 적용될 수 있는 효율적인 세팅이라고 할 수 있다.

 

이상은 클러스터 환경에 따른 기본 설정을 고려해 볼 세팅 값이었고,

사용자가 제출한 애플리케이션의 규모, 성능 등을 고려하여 적절히 자원을 더 늘리거나 줄일 수 있어야 한다.

 

스파크 기본 shuffle partition은 200으로 설정되어 있다.(내 클러스터만 그럴 수도 있다...!)

나의 경우 위의 제출 기준(--num-executors 3 --executor-cores 2 --executor-memory 4g)로는 원하는 성능이 나오지 않았으며 memory spill이 많이 일어나 아래와 같이 변경 적용하였다.

--num-executors 3 --executor-cores 100 --executor-memory 18g

이때 partition은 300개로 유지될 수 있도록 해주었다.

 

 

다음 글로는 스파크 properties 정리(공식 문서), 파티션 개수, 크기 정하는 내용, 스파크 튜닝한 내용 등을 정리해 봐야겠다.

스파크 어려운데 너무 강력한 놈이라서 많이 배워야겠다.

728x90
반응형
728x90
반응형

아주 기본적인 내용이지만 글로 정리해보려고 한다.

스파크 처음하는 사람들에게 조금이라도 도움이 될까 해서!


스파크는 Spark Application과 Cluster manager로 구성되어 있다.

그리고 Spark Application에는 Driver와 Executor라는 두가지 JVM 프로세스가 포함되어 있다.

  • Driver: Driver는 SparkSession/SparkContext를 생성하고, Job 을 제출하고 task로 변환하고, worker 간의 task 실행을 조정하는 주요 프로세스이다.
  • Executor: Executor는 주로 특정 계산 작업을 수행하고 결과를 driver에게 반환하는 일을 담당한다.

Spark Application은 실제 일을 수행하며, Cluster manager는 Spark Application 사이에 자원을 중계해주는 역할을 담당한다.

Spark Application

<Spark The Definitive Guide> 참고

Spark Driver 와 Executor에 대해 더 자세히 살펴보자.

  • Spark Driver: 한 개의 노드에서 실행되며, 스파크 전체의 main() 함수를 실행한다. 어플리케이션 내 정보를 유지/관리한다. 사용자가 제출한 job을 task 단위로 변환하여 executor에게 전달한다.
  • Executor: 다수의 worker 노드에서 실행되는 프로세스로 spark driver가 할당한 작업(task)를 수행하여 결과를 반환한다. 또한 블록매니저를 통해 cache 하는 RDD를 저장ㅎ나다.

Cluster Manager(클러스터 매니저)

Cluster Manager 는 스파크와 붙이거나 뗄 수 있는 컴포넌트로, Spark Application의 리소스를 효율적으로 분배하는 역할을 담당한다.

Spark는 executor에 task를 할당하고 관리하기 위하여 Cluster manager에 의존한다.

Spark는 단지 cluster manager와 통신하며 할당 가능한 Executor를 전달받으며 clustor manager의 상세 동작을 알지는 못한다.

스파크3.0 기준으로 Cluster manager의 종류는

  • Spark StandAlone
  • Hadoop Yarn
  • apache mesos
  • kubernetes 등이 있다.

Spark Application 실행 과정(흐름)

Spark를 사용할 때의 대력적인 실행 흐름이다.

  1. 사용자가 spark-submit을 통해 애플리케이션을 제출한다.
  2. Spark driver가 main()을 싱행하여 SparkContext를 생성한다.
  3. SparkContext가 Cluster Manager와 연결된다.
  4. Spark Driver가 Cluster Manager로부터 Executor 실행을 위한 리소스를 요청한다.
  5. Spark Context는 작업 내용을 Task 단위로 분할하여 Executor에게 전달한다.
  6. executor들은 작업을 수행하고 결과를 저장하여 driver에게 제출한다.
  7. Driver 의 main()이 끝나거나 SparkContext.stop()이 호출된다면 Executor들은 중지되고 Cluster manager에 사용했던 자원을 반환한다.

기타 개념 정리

Deploy mode

cluster 사용시 driver 의 실행 위치를 지정한다.

  • Client mode: Driver가 Cluster 외부에 위차치할 때

  • Cluster mode: Driver가 Cluster 내부에 위치할 때

Job, Stage, Task

  • Job: stage의 집합. Application 에서 spark에 요청하는 일련의 작업
  • Stage: task의 집합
  • Task: 하나의 Executor에서 수행되는 최소 작업 단위
728x90
반응형
728x90
반응형

에러 메시지

Caused by: java.lang.AssertionError: assertion failed: Concurrent update to the commit log. Multiple streaming jobs detected for

 

원인

로그에 동시 업데이트 하기 때문에 발생

 

스파크 스트리밍에서 동일한 체크포인트 위치에 두 개 이상의 다른 스파크 작업이 업데이트 하려 할 때 발생한다.

이 때 스파크 설정의 checkpointLocation을 다른 위치로 사용하면 해결할 수 있다.

 

두 개의 다른 스파크 스트리밍 작업에서 checkpoint 위치를 다르게 한다.

      .option("checkpointLocation", checkpointPath1)
      .option("checkpointLocation", checkpointPath2)
728x90
반응형
728x90
반응형

원주 예쁜 대형 카페 추천

로톤다

 

이번에 원주에 클라이밍 하러 다녀간 김에 방문한 대형 카페 '로톤다'

위치

주차

주차장이 엄청 넓지는 않지만 워낙에 외진 곳에 있어서 어떻게든 차를 댈 수 있다!

기업도시 쪽으로 가는 길목이라고 해야 할까? 원주를 잘 모르지만 하여튼 차를 타고 원주 시내에서 차를 타고 15분 정도 걸려 도착했다.

별 기대 없이 추천 받은 카페였는데,

도착해서 입구로 들어서는 순간 빵냄새가 일단 너무 좋았다.

밖에서 봤을 때도 건물이 예뻐 보였고, 빵 공장처럼 생긴 입구를 지나 카페로 가는 길목에 풀장도 있었다.

들어가는 입구랑 들어가서 보인 풀장

오랜만에 이런 예쁜 카페를 오니 힐링이었다 >_<

나랑 지영이랑 유정언니랑 빵냄새에 1차 취하고 가는 길목 풀장 색에 2차 취해버렸다 ㅋㅋㅋ

외부 공간

 

너무 추워서 바깥에 있지는 않았는데 외부에도 넓고 예쁘게 공간이 꾸며져 있어서

춥지 않을 때 오면 진짜 제대로 힐링할 수 있을 것 같다!

 

아래는 메뉴!

재빵 프로그램도 운영하고 있고 아이스크림도 있다.

 

시그니처 먹을까 하다가 너무 비싸서 그냥 아아 마셨다... ㅎㅎ

매장 내부와 아기의자

 

빠아앙~~

빵! 연탄모양 빵이 신기해서 구경했다 ㅋㅋㅋ 
우리가 고른빵들 ㅎㅎㅎ

버터 프레젤이 조금 아쉬웠고 나머지는 전반적으로 평범했다

크로와상 메뉴들은 다 맛있엇을 것 같았고,

소금빵도 고소하고 맛있었다.

요즘 빵맛 까다로워져서 그런가 ㅋㅋㅋ 엄청 맛있다기보다 평균 정도의 빵맛이었다.

 

아이스 아메리카노 맛은 괜찮았다! 근데 6천 원 치고 양이 좀 적은 느낌이었다 ㅠㅠㅠ

전반적으로 맛은 평범하지만 분위기 때문에 또 가고 싶은 곳!

다음에 가면 시그니쳐 커피 먹고 빵도 더 많이 먹어야지 ㅎㅎ

 

728x90
반응형
728x90
반응형

짧고 굵게 다녀온 목포 여행

맛집 정리

 

사실 맛있는 거 왕왕 많이 먹고 올 폐기를 가지고 갔으나 나는 그저 개복치였던 것..

 

그래서 많이는 못 먹었지만 가본 곳 모두 왕왕 추천 집이다!

추가로 가보지는 못했지만 목포 현지인 추천 찐 맛집 + 또간집에도 나온 곳도 추천해 보려고 한다.

 

1. 수가정

- 순두부 맛집

수가정은 목포에만 체인점이 여러개 있는(다른 곳에는 없다ㅠㅠ) 순두부 맛집이다.

 

사실 여행 마지막 식사로 간 곳인데 그동안 너무 많이 먹어서 속이 더부룩해서 가볍게 먹고 싶어서 찾아본 곳이다.

근데 속 더부룩한 사람 어디 간 듯 완!전! 맛있게 먹고 왔다.

 

수가정에는 무려 밥이 돌솥밥으로 나온다!

밥이 맛 없으면 절대 못 먹는 나도 한 그릇 싹싹 비워먹고 누룽지까지 해서 먹었다.

어딜 가든 돌솥밥으로 밥이 나왔으면 좋겠는 사람이다 ㅠㅇㅠ 왕왕 맛있었다.

 
 
 
 

내가 먹은 건 하얀 순두부이고 빨간 순두부는 바지락 순두부이다.

해물, 버섯, 바지락 모두 빨간 국물이었고 확실히 약간의 자극적인 맛이 느껴졌다.

 

그에 비해 하얀 순두부는 너무 밍밍한거 아닐지 ㅎㅎ 걱정했는데,

하얀 순두부 하기를 너무나도 잘 한 선택이었다는 생각이 들 정도로 맛있었다.

약간은 매콤한 맛이 났고 몽글몽글 속이 따듯해져서 후회 없는 선택이었다고 생각한다.

 

지점이 여러갠데 2:30 부터 5:00 까지 브레이크 타임인 곳이 있으니 잘 찾아보고 가자!

내가 간 곳은 아래 위치의 수가정.

 

 

 

2. 독천식당

- 낙지 맛집

 

목포에서 30년 동안 산 현지인이 추천해서 간 낙지 필수 코스!

전날 술을 마셔서 연포탕 국물을 싹 들이켰는데 와- 속이 팍 풀렸다 ㅋㅋㅋㅋㅋ

근데 아직 술이 안깻어서 사진은 없다 ㅇㅅㅇ!

낙지볶음 & 낙지 연포탕 추천!

 

 

3. 끋집

- 목포대교 술집

 

진짜 민망하게도 여기도 사진이 없다...!

난 아직 초보 블로거니까... ㅎㅎㅎ

여기는 뷰가 미쳤다ㅠㅠㅠ 인기도 엄청 많은 곳이라고 하는데 오픈 한 시간 만에 사람들이 꽉 차더라!

 

모둠 해산물 시켜서 해산물 왕왕 먹고 짜파게티(?) ㅋㅋㅋㅋ 뜬금없지만 짜파게티도 먹었고 하얀 닭!! 닭 한 마리 스타일의 백숙을 먹었다.

술도 왕왕 먹엇다 ㅎㅅㅎ

 

아직은 어려운 사람들이 너무 많아서 사진을 찍을 정신이 없던 게 아쉽다 ㅠ

해산물이 엄청 싱싱했고 서비스도 왕왕 주시고

목포대교 뷰와 탠트 형식의 야외 자리가 주는 갬성이 주량 두 배 이벤트다.

목포에서 술집을 가야한다면 여기로 꼭 다시 갈 것이야...!!

 

 

 

4. 석산

- 뷰 맛집, 예쁜 카페

 

여기도 목포 현지인이 데려가 준 카페이다.

뭔가 뜬금 없는 곳에 있는 거 아닌가 했는데 따듯한 분위기와 깔끔한 건물 자체가 그냥 힐링이었다.

 

빵도 여러 종류 있었고 커피 맛도 괜찮았다.

가격은... 음.. ㅎㅎ 그래도 목포에서 카페 간다면 나는 여기 다시 갈듯!

 
 
날씨까지 완-벽!

 

 

5. 그 외 추천

또간집 선경준치회집

- 여기도 목포 현지인 추천이다. 내 지인보다는 부모님이 좋아하신다니 더 신뢰가 가는...

CLB 빵집

- 바게트가 유명한 곳이다. 나는 걍 다 맛있었다 ㅋㅋㅋㅋㅋ 끼리 파트너 빵집이랬나? 그랬는데 끼리치즈 들어간 빵을 못 먹은 게 아쉽다ㅠㅠ (배부름 이슈,,,)

 

 


 

목포는 처음이었지만 현지인 + 친구들로 아주 알차게 여행했다!

자주 가고싶다. SRT도 있고 KTX도 있으니까 그리고 그냥 분위기가 좋았다 ㅎㅎ

 
728x90
반응형
728x90
반응형

본 글은 유데미 Fundamentals of Database Engineering 강의를 들으며 나만 알아볼 수 있게 휘갈긴 정리본임.

섹션2 - ACID -1) What is a Transaction?

쿼리의 모임 - 트랜잭션

하나의 unit으로 작동하는 것임

예) 돈을 송금한다면 1. 계좌에 돈이 있는지 확인(select), 2. 그 계좌에서 돈 빼기(update), 3. 새 계좌에 돈 넣기(update)

트랜잭션은 항상 일어난다.

 

BEGIN: 트랜잭션 시작

COMMIT: 모든 작업을 커밋(변화를 쓴다.)

  - 디스크에 하느냐 메모리에 하느냐 이런 장단점을 이해해야한다.

ROLLBACK: 모두 취소하는 것. 장애시 원상태로 돌려놔야함

  - 메모리에 저장하고 있었다면 쉽지만 디스크라면, 서버가 죽었는데 디스크라면 어떻게 롤백할 것인가? 이러한 고민을 해야함

 

섹션2 - ACID -2) Atomicity

섹션2 - ACID -3) Isolation

  • Dirty reads
  • Non-repeatable reads: 더티 기드의 경우에서 롤백이 아닌 커밋된 경우
  • Phantom reads: 존재하지 않았던 데이터가 다시 조회했을 때 존재하는 현상
  • Lost updates: 업데이트한 결과를 잃는다.

-> 읽기에서 발생할 수 있는 현상들

격리를 통해 막아야 함

1. Read uncommitted -> 빠르다, 격리하지 않는다

2. Read committed -> 일관성은 없음, 커밋된 데이터만 읽는다.

3. Repeatable read -> 트랜젝션이 진행중인 동안 값은 동일하게 유지

4. Snapshot -> 그 순간의 스냅샷 버전을 읽는다

5. Serializable -> 직렬화하여 거의 같은 값을 읽는다(?) 가장 엄격한 격리 수준

고립 수준은 모든 DBMS에서 다 다르다.

--> 결국 모든 격리는 그 순간 순간의 버전인 것

다양하게 격리 레벨들이 있으며 자세히는 천천히 공부해봐야겠음

 

섹션2 - ACID -4) Consistency

데이터의 일관성

사용자에 의해 정의되며 참조 무결성과 관련이 있다

원자성과 격리

읽기(read)의 일관성

어떤 값에 변화가 있을때 그 변화를 바로 알아아 하며, 작업 이후 전체 복제가 되어야 한다.

근데 일관성 유지를 위한 과도한 데이터 정규화는 성능과 조회 속도를 저하시킨다.

-> 복제와도 관련이 있음

 

섹션2 - ACID -4) Durability

단단해야함. 망가져도 다시 돌아와야함 -> 내구성: 트랜젝션 실행 후 서버가 다운되더라도 변화를 볼 수 있어야 한다.

느려질 수 있음

WAL, Asynchronous snapshot, AOF 를 통해 Durability 보장

WAL: 큰 데이터를 디스크에 쓰기에는 느릴 수 밖에 없음 -> 변경사항에 대해 세그먼트 로그를 디스크로 먼저 보낸다

OS Casche : OS 메모리에 저장하는 것은 일단 메모리에 적고 디스크에 한번에 나중에 적재해라. 라고 알려줌

근데, 디스크에 적기 전에 컴퓨터가 망가지면 OS 메모리에 있던 것은 날라가게 되는 것. 자주 있는 사고는 아니지만..

결국 하나의 트랜젝션 커밋까지의 내구성을 보장하는 것.

snapshot : 비동기 스냅샷. 데이터 백업/복제/복구 수행 가능

--> NoSQL에서 특히 매우 중요하다.

728x90
반응형

+ Recent posts