게시글
질문&답변
S3 폴더 구조에 따른 Static Partition Pruning, DPP 질문
안녕하세요 sgjeong1108님,Dynamic Partition Pruning(DPP)이 제대로 동작하려면 스파크가 "파티션 컬럼 -> 디렉터리 위치" 매핑을 메타데이터로 알고 있어야 합니다.이 매핑을 알리는 일반적인 방법이 말씀하신 Hive-style 디렉터리(col=value/…) 이고, 이 경우 메타스토어가 없어도(그냥 spark.read.parquet만 해도) 자동 "파티션 디스커버리"가 됩니다근데, Hive-style이 아니어도 됩니다. 다만 그 경우엔 메타스토어(또는 Delta/Iceberg 카탈로그) 에 파티션을 등록해 스파크가 매핑을 알게 해줘야 SPP/DPP가 작동합니다만약 디렉토리가 /year=2024/data.parquet라면 다음과 같이 하시면 됩니다.df.write .partitionBy("year") .mode("overwrite") .parquet("/path/to/data")그게 아니라면 location을 사용하시면 됩니다.CREATE EXTERNAL TABLE events ( user_id BIGINT, ts TIMESTAMP, ... ) PARTITIONED BY (year INT) STORED AS PARQUET LOCATION 's3://bucket/events'; -- 이거는 상위 루트 -- 폴더명이 'year=2024'가 아니어도 되요 ALTER TABLE events ADD PARTITION (year=2024) LOCATION 's3://bucket/events/2024'; ALTER TABLE events ADD PARTITION (year=2025) LOCATION 's3://bucket/events/2025';
- 0
- 2
- 16
질문&답변
Top Queue Interview Questions 질문
안녕하세요 이시우님,수강생님의 생각이 아주 좋습니다. "물리적으로 큐처럼 만드는 건 어렵다"는 부분은 정확해요.다만, 스택 두 개를 통해 논리적으로 큐의 동작을 흉내낼 수 있다는 점이 핵심이에요.즉, 구현 관점에서는 완전히 가능하며 실제로 자주 사용되는 인터뷰 문제이기도 합니다.
- 0
- 1
- 16
질문&답변
Queue 강의를 듣고 난 후에 대한 질의
안녕하세요 김제원님,좋은 질문들이 많네요.큐를 지정할 때는 무조건 큐의 이름을 지정해 줘야 하나요? 자동으로 비어 있는 woker에 큐를 할당하는 방법은 없나요?=> 꼭 지정할 필요는 없습니다.. BaseOperator(queue="...")를 지정하지 않으면 기본값(default) 큐로 갑니다. Airflow/Celery 설정의 default_queue를 바꾸면 기본 큐 이름을 바꿀 수 있어요.=> “빈 워커”로의 자동 배정은 큐 단위로만 이뤄집니다. Celery는 “같은 큐를 구독하는(worker -q) 워커들” 사이에서 작업을 분배합니다. “현재 가장 한가한 워커를 자동으로 찾아서” 같은 기능은 같은 큐를 공유할 때에만 자연스럽게 일어납니다(라운드로빈+prefetch 수준). cpu_intensive라는 woker에 여러개의 큐가 동시에 요청이 왔을 경우 동기적으로 처리하나요?=> 동기적이라는 말이.. 직렬 처리를 말씀 하시는 건가요? Celery 워커는 기본적으로 worker_concurrency(프로세스/스레드 수)만큼 병렬로 처리합니다. 한 워커가 여러 큐(-q cpu,gpu,io)를 구독하면 각 큐에서 들어온 작업을 하나의 작업 대기열로 합쳐 자신의 동시성만큼 병렬 실행해요. 직렬 처리를 원하신다면, 그 워커를 worker_concurrency=1로 세팅하시면 될 겁니다. 큐를 생성하면 해당 큐의 물리적 자원은 어떻게 할당 되는 것인가요?=> 큐는 "논리적 라우팅 키"일 뿐, 자원을 직접 할당하지 않습니다. 자원은 Worker에서 알아서 합니다.. 워커 프로세스 수(concurrency), 머신 vCPU/RAM, 컨테이너 리소스 제한(요청/제한), 쿠베라면 노드/네임스페이스 등에서 결정됩니다. 대체로 하나의 DAG에서 강의에 예시와 같이 여러 개의 큐를 사용하는 경우가 있을까요?=> 가능은 하지만, 너무 많이 하나로 넣는 것은 추천드리지 않습니다.. 일반적으로는 “리소스 클래스별” 소수 큐로 충분합니다. 예를 들면 cpu_intensive, io_heavy, gpu, external_api 이런 식으로 말입니다. 워커를 많이 만들어 환경을 구성하는 사례는 어떤 사례가 있는지 알 수 있을까요?=> Work Load를 분리할 때 CPU 바운드/IO 바운드/GPU/대용량 메모리 작업을 서로 다른 워커 그룹으로 격리할 때가 있을 수 있겠고 ...멀티 테넌시/팀 분리가 필요할때 팀별 큐/워커로 나눠 소음(노이즈 네이버) 방지 및 운영 책임 분리를 원할때? 쯤이 있을 것 같습니다.
- 0
- 1
- 23
질문&답변
broadcast Join과 boradcast + UDF 차이
안녕하세요 sgjeong1108님,좋은 질문이네요. 일단 실행 계층 측면에서 봤을때, broadcast join은 JVM 내부에서 해시 조인, Whole-Stage Codegen 최적화를 가능하게 하지만 UDF + broadcast(파이썬 UDF)는 JVM와 Python를 계속 왕복해서 비효율적이며, 코드젠/컬럼너 실행도 비활성화되어있습니다.또한 broadcast join는 카탈리스트 최적화, 통계, AQE 활용 가능해서 대체로 빠른 반면에, UDF + broadcast는 필터,프루닝,프레디킷 푸시다운 등 대부분 막혀서 느립니다.결과적으로 기본은 항상 broadcast join로 설계를 하시되, Lookup 자체가 함수형 변환이어야 하거나, 외부 라이브러리를 꼭 써야 할때나... 조인으로 표현이 어려울 때는 UDF + broadcast를 사용하시면 됩니다.
- 0
- 2
- 21
질문&답변
Replit을 사용해보려고 하는데 영상처럼 진행이 안되네요
안녕하세요 admin님,지금 들어가 보니 리플릿(Replit)의 화면 구성이 많이 바뀌었네요. 곧 도움이 될 영상을 올리겠습니다.현재 버전 기준으로 사용하는 방법은 다음과 같습니다:로그인을 합니다.왼쪽 메뉴에서 “Explore more” 버튼을 클릭합니다.“Developer Frameworks” → “Languages” → “Python” 순서로 들어갑니다.“Remix” 버튼을 클릭합니다.팝업 창이 뜨면 이름과 설명을 입력하고 “Use Framework” 버튼을 누릅니다.상단 탭에서 Console 옆에 있는 “+ Tools & files” 버튼을 클릭합니다.main.py 파일을 선택하거나 새로 만듭니다.원하는 파이썬 코드를 입력한 뒤▶ (플레이) 버튼을 누르거나Command + Enter 키를 눌러 실행합니다.
- 0
- 2
- 36
질문&답변
Flink 2.0 버전부터 스칼라를 더이상 지원하지 않네요
안녕하세요 열심히 하자님,보내주신 링크를 보자면, 계획을 보면 Scala API가 제거가 되어도 Scala 사용자들은 Java API를 통해 Flink 기능을 사용할 수 있어 보입니다. 별로 걱정은 하지 않으셔도 될 듯 합니다.어차피 보여주는 식의 스칼라 API가 없어지는 거지, Scala 자체가 Java를 그대로 사용할 수 있으니 상관은 없을 것 같습니다.그리고 팀마다 다른데, 자바를 대부분 사용합니다.
- 0
- 2
- 24
질문&답변
Data Sink Topology 질문 있습니다
안녕하세요 열심히하자님,휴가 출발전에 ㅋㅋㅋ 또 답변 드립니다.일단 SinkWriter가 로컬에 임시로 데이터를 쓰고 Committer가 커밋을 수행한다는 게 맞나요?네, 맞습니다. 다만 Committer는 단순히 “커밋한다”보다는 “체크포인트 성공 시점에 트랜잭션을 안전하게 마무리하는 역할”로 이해하시면 정확해요. Topology 용어도 궁금한데요 Topology가 네트워크 시간에 노드들을 연결해놓은 방식이라고 배웠었는데요 여기서 Topology가 어떤 뜻으로 사용되나요?말씀하신 대로, 네트워크 분야에서 Topology는 노드 간 연결 구조를 의미하죠. Flink에서도 거의 같은 개념을 차용하고 있습니다. 다만 Flink에서의 “Topology”는 다음처럼 해석됩니다:Flink Job이 실행될 때, 연산자(operators) 간의 데이터 흐름 구조 전체즉, Source -> Transformation -> Sink 로 이어지는 전체 데이터 플로우 그래프가 바로 Flink의 Topology입니다. Flink는 내부적으로 이 Topology를 Directed Acyclic Graph (DAG) 형태로 구성하고, 각 연산자 간 데이터 스트림이 어떤 병렬도(parallelism)와 네트워크 경로를 통해 연결되는지를 나타냅니다. 마지막으로 flink 문서를 찾아보니 SinkWriter, Committer, Global Committer 클래스가 삭제 되었다고 나오는데요, 버전업이 되면서 이제는 이런 방식으로 동작하지 않는 건가요?흐음... 어디 그렇게 나와있죠? 제가 최신 2.0 ~ 2.2 중심으로 강의 했었는데... 지금 찾아보니 그런 내용이 없는데 한번 링크 남겨주시면 알아보겠습니다.https://nightlies.apache.org/flink/flink-docs-master/docs/dev/datastream/sinks/ 마지막으로 제가 여러 강의에서 강조했듯이 영어로 공부하셔야 보다 깊고 자세히 아실수 있습니다. 그렇지 않으면 한자로 변환된 단어를 외우다시피 해야되는데, 그렇게 되면 글로벌 경쟁력(나중에 해외 취직 희망시)도 낮아지고 이해도도 낮아질 수 있습니다.그럼 즐공하세요!
- 0
- 2
- 25
질문&답변
State Management & Fault Tolerance 부분 설명이 하나도 이해가 안 돼요
안녕하세요 열심히하자님,질문 좋네요!First Class Support에 대해서 궁금합니다. 왜 First Class라는 용어를 사용하나요?First-Class라는 표현은 "언어적, 시스템적 핵심 개념으로서 완전하게 지원된다"는 뜻이에요.예를 들어, Python에서 함수(Function)가 일급 객체(First-Class Citizen)라고 하죠. 이는 함수 자체를 변수로 넘기거나 리턴할 수 있을 때 쓰는 표현이에요.같은 맥락으로, Flink는 Stateful Stream Processing을 First-Class Support로 제공한다는 말은, 상태(State) 관리가 옵션이 아니라 프레임워크의 기본 철학과 구조에 완전히 녹아 있다는 뜻입니다.즉, Flink의 런타임, API, 체크포인트, 백프레셔 등 모든 구성요소가 ‘상태 유지’를 전제로 설계되어 있습니다. 반대로 Spark는 Stateless 모델이 기본이고, Stateful은 부가 기능 수준으로만 지원합니다.Periodic checkpointing, Robust의 차이가 궁금합니다. 유추상.. Periodic checkpointing은 주기적으로 체크포인트를 지정해서 체크포인트 기준으로 다시 동작시키기 때문에 중복 처리를 할 수 있는데, Flink는 exactly once를 지원하기 때문에 무조건 한 번만 실행함을 보장하는 건가요?Spark와 Flink는 둘 다 상태(state)를 주기적으로 저장하는 체크포인트(Checkpoint) 기능을 가지고 있지만, 이 기능이 어떤 수준으로 데이터를 일관성 있게 복원할 수 있느냐에서 큰 차이가 있습니다.Spark의 경우에는 Periodic Checkpointing 방식을 사용합니다. 즉, 일정 시간 간격(예: 10초마다, 1분마다)으로 현재의 상태를 저장해두고, 장애가 발생했을 때 그 시점으로 복구하는 방식이에요. 이 접근법은 단순하고 구현이 쉬운 대신, 그 사이에 처리 중이던 일부 데이터는 다시 재실행될 수 있습니다.그래서 결과적으로 at-least-once 수준의 보장만 가능합니다. 즉, 어떤 이벤트가 중복으로 처리될 가능성이 남아있다는 뜻이죠. 반면 Flink는 Robust하고 Exactly-once를 보장하는 Checkpointing을 제공합니다. 여기서 Robust는 시스템 전반이 장애나 네트워크 지연에도 안정적으로 동작하도록 설계되어 있다는 의미이고, Exactly-once는 데이터가 단 한 번만, 정확하게 처리된다는 것을 보장합니다.즉, 중복도 없고 누락도 없는 완전한 일관성을 유지하는 거죠. 이게 가능한 이유는 Flink가 내부적으로 분산 스냅샷(distributed snapshot) 구조를 사용하기 때문입니다. 각 연산자(operator)의 상태를 이벤트 스트림의 특정 지점과 함께 일관되게 저장하고, 장애가 발생하면 그 시점의 스냅샷에서부터 정확히 이어서 재실행합니다. 이 방식은 Spark보다 훨씬 정교하고 오버헤드가 낮으며, 복구 시 정확성이 뛰어납니다. Backpressure는 데이터가 많이 들어와 병목이 생길 때 처리인데, Spark는 지원 범위가 좁고 Flink는 세밀하게 지원 가능한건가요?Backpressure는 데이터 유입 속도가 처리 속도를 초과할 때 생기는 병목 현상을 제어하는 메커니즘이에요. Spark는 간단한 큐 기반 버퍼링만 지원 (coarse-grained) 어느 정도 밀리면 전체 스트림 처리 속도가 늦어지는데... 이에 반해 Flink는 연산자(operator) 단위로 fine-grained (세밀한 단위) 조절하여, 각 연산자가 처리 속도에 맞춰 upstream 속도를 조절해서 부드럽고 안정적인 흐름 유지합니다. 즉, fine-grained는 세밀한 단위로 조정 가능하다는 뜻이에요.짧게 말하자면 ... Spark는 coarse-grained(거친 단위), Flink는 fine-grained(세밀한 단위)라고 생각하면 되겠습니다. 한글과 영어를 섞어서 얘기하다보니 장황하네요 ㅎㅎㅎ... 마지막으로 ...maintain state across events: flink가 event 기반으로 동작하고, 이벤트간의 상태를 알고 있다는 뜻인가요?네, 맞습니다!Flink는 이벤트 스트림을 처리하면서, 이전 이벤트의 상태를 계속 유지하며 계산을 이어갈 수 있다는 뜻입니다. Spark이 Standalone하고 윈도우 사이에 연결이 없다: 추측상 데이터를 윈도우 단위로 잘라서 처리하고, 윈도우끼리 상태를 공유하지 않는다는 뜻 맞을까요? 역시 잘 이해하셨습니다!!Spark Structured Streaming은 윈도우 단위로 데이터를 나누고, 그 윈도우 간의 상태(State)를 직접 연결하지 않습니다. 즉, 이전 윈도우에서의 누적 상태를 유지하거나 세션 기반 상태를 관리하려면 개발자가 직접 외부 저장소(State Store, Redis 등)에 저장하고 불러와야 해요. 반면 Flink는 그 상태 관리가 내부에 이미 통합되어 있죠. 도움이 되셨으면 좋겠네요! - 참고로 제가 내일부터 3일간 휴가라... 다음 질문을 하실때는 늦게 답변드릴수 있습니다(랩탑을 안가져갈꺼라...)
- 0
- 2
- 30
질문&답변
dns 관련하여 질문이 있습니다.
안녕하세요 Domini님,제가 잘 이해했는지 모르겠는데, 밑에 AI가 말한 대로 AWS 같은 곳에서 하신다면 등록하신 Custom한 도메인을 Route53에서 Ingress 주소와 연결하시면 됩니다.
- 0
- 2
- 17
질문&답변
kafka 단독 실시간 데이터 처리보다 flink를 추가로 구축하고 사용시의 장점에 대해 질문 드립니다.
안녕하세요, 백지훈님,좋은 질문이에요. 요약하자면...Kafka 단독일 경우에는 메시지 버스 + 간단한 소비/생산에 최적이라 할수 있고, 상태가 작고, 윈도우/조인/지연 이벤트 처리가 단순한 경우 괜찮습니다.Flink 추가하시면 대규모 상태, 이벤트타임 정확성, 복잡한 윈도우 조인, 재처리 및 Backfill, 정확히 한 번 처리까지 더 많은 장점이 있습니다.제가 실전에서 느꼈던 좋은 점으로는 지연 이벤트 보정, 세션 종료 타이머 같은 것을 잘 쓰고 있습니다.
- 0
- 1
- 26




