묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[아파치 카프카 애플리케이션 프로그래밍] 개념부터 컨슈머, 프로듀서, 커넥트, 스트림즈까지!
카프카 클러스터에서 감당 가능한 파티션(레플리카) 수 문의
안녕하세요.카프카 클러스터 규모를 추산하던 중 감당 가능한 토픽/파티션 수가 궁금하여 질문드립니다. 예를 들어,Replication Factor를 3으로 가정할 때 레플리카 개수가 대략 10,000개가 나옵니다(3,000 파티션 × replication factor 3)파티션 10개인 토픽 100개: 1,000개파티션 20개인 토픽 100개: 2,000개총 파티션: 3,000개RF가 3일 때 전체 클러스터 레플리카 수: 9,000개추후 토픽 추가에 따라 레플리카 수가 최대 18,000개까지 늘어날 수 있음토픽과 파티션 규모가 이 정도라면 카프카 클러스터를 적절한 단위(도메인)로 나눠야 할지,아니면 한 클러스터에서 충분히 운용 가능한지 궁금합니다.클러스터를 하나로 구성하여 사용하자니 레플리카 수가 감당 가능할지 고민되고클러스터를 여러개로 구성하여 사용하자니 그에 따른 비용과 오버 엔지니어링이 고민됩니다.파티션이 많을수록 파일 같은 자원을 더 사용하고 각 클라이언트로부터 수많은 요청을 받게 되는데, 브로커를 충분히 늘리면 감당 가능한 정도일까요?큰 규모의 카프카 클러스터를 운용해본 적이 없어 강사님께서 카프카 클러스터를 어떻게 운용하셨는지 여쭤봅니다. (이정도 수준의 레플리카를 운용해본적이 있는지 등)참고로 카프카는 3.x (KRaft 모드) 버전을 사용하려고 합니다.아래는 참고한 자료입니다.참고1) 컨플루언트 개발자 가이드에 따르면 토픽은 KRaft일 때 수백만 개 생성 가능하다고 하지만결국 각 토픽당 파티션 수에 따라 달진다고 언급하고 있습니다.참고2) 컨플루언트 블로그에 따르면 가용성을 고려하면 2,000~4,000개를 권장하고, 지연시간을 고려하면 100 × b × r (b: 브로커 수, r: 복제 팩터) 공식을 제안하고 있습니다.그런데 10년 전에 작성된 글이라 현재는 더 많이 지원하지 않을까 싶습니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
Snowflake처럼 동적으로 생성되는 ID, Mock 테스트가 올바른 접근법일까요?
14:42 에서 Snowflake 알고리즘으로 articleId를 생성한 후 DB에 저장된 121530268440289280L값을 사용해서 테스트 코드를 작성하시는 것을 보고,실제로 Snowflake를 도입해서 Id를 생성하고 같은 방식으로 테스트 코드를 작성한다면 DB에 종속적이라서 반복적으로 테스트 코드를 실행할 때 테스트 코드의 유지보수에서 문제가 발생할 수 있을 거라는 생각이 들었습니다.이런 문제를 막기 위해서 테스트 시에는 Mock 객체를 사용해 미리 정해진 Snowflake가 고정 ID 값을 반환하도록 하는 방식으로 테스트 코드를 작성하는게 맞는건지 궁금해서 질문글을 남기게 되었습니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
ArticleApiTest 에서 정적 내부 클래스를 사용하는 이유는?
ArticleCreateRequest, ArticleUpdateRequest은 ArticleApiTest 클래스 내부에 따로 만들어서 사용하고 있는데 이미 만들어진 클래스를 사용하지 않고 테스트 클래스 내부에서 작성해서 사용하는 이유가 뭔지 궁금합니다. 감사합니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
ArticleApiTest 에서 로그를 System.out.println()으로 남기는 이유 문의
혹시 ArticleApiTest 에서는 System.out.println() 으로 로그를 남기는 이유가 있을까요? ArticleRepositoryTest에서는 log.info로 하셨는데요.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
comment에 왜 page와 pageSize가 있는 것인가요?
게시글을 보면 한 개의 게시물 아래에 댓글이 쭉 나열되어 있습니다.댓글을 확인할 때 page가 아닌 쭉 스크롤(infinite-scroll) 하면서 확인 하는 것인데게시물 댓글에 왜 page와 pageSize가 필요한 것인지 모르겠습니다.게시물의 댓글의 갯수를 말씀하시는 거라면 몇 개의 댓글을 불러오는지 이해가 가는데... 혹시 page와 pageSize가 단순히 두 단어를 말씀하시는 게 맞나요? 아니면 comment_count와 같은 게시물 갯수를 말씀하시는 건가요? @Test void readAll() { CommentPageResponse response = restClient.get() .uri("/v1/comments?articleId=1&page=1&pageSize=10") .retrieve() .body(CommentPageResponse.class); System.out.println("response.getCommentCount() = " + response.getCommentCount()); for (CommentResponse comment : response.getComments()) { if (!comment.getCommentId().equals(comment.getParentCommentId())) { System.out.print("\t"); } System.out.println("comment.getCommentId() = " + comment.getCommentId()); }
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
likeCount, viewCount 등을 처음부터 같이 생성하지 않는 이유가 있을까요?
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요! 수업 잘 듣고 있습니다.댓글 수나 조회수 쪽에서,likeCount, viewCount가 없는 경우 init을 통해 생성해주는 방식을 사용하고 있는데, 처음부터 게시글과 게시글의 조회수 객체를 같이 생성하는 방식을 사용하지 않는 이유가 있을까요?게시글이 있다면 게시글 조회수 객체도 같이 존재하고, 이 둘의 객체 생명주기는 같아야 한다고 생각하는데,강의가 순차적으로 진행됨에 따라 이전에 db에 생성된 값들이 존재하기 때문에 이렇게 하신건지 궁금합니다!! 그리고 처음부터 같이 생성할 수 있다면 다른 프로젝트에서 그 방법을 선택하는 게 나을까요? 감사하빈다!!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
안녕하세요 라우트 과정에서 http프로토콜 -> lb 프로토콜 질문 있습니다.
기존에는 http://localhost:8081 과같이 보내줬는데, 이걸 lb:/MY-FIRST-SERVICE로 바꿨습니다.그렇다면, 원래 localhost:8081로 직접 http 프로토콜로 보내줬던건, 유레카를 거치지 않았고, 하드코딩으로 직접 보내줬던 것이고, 그리고 lb:/를 이용하는 것이 유레카에 저장되어 있는, 정보들을 통해 읽어와서 동적으로 보내주는 것으로 이해하였는데, 제가 이해한게 맞을까요?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
안녕하세요 선생님 헷갈리는 부분이 있어서 질문 남깁니다.
안녕하세요 ! 좋은 강의 해주셔서 감사합니다.hot article 부분에서 헷갈리는 부분이 있어서 질문 남깁니다.hot article 을 저장할때, article 의 생성 날짜 기준으로 저장하기 때문에, 생성 시간이 아닌 다른 날짜에 hot article이 되더라도, 생성 시간이 key가 되어 그 생성 시간 날짜에 저장이 되는 것이 맞나요 ?
-
미해결장애를 허용하는 견고한 시스템 만들기
혹시 강의자료랑 강의 안에 나오는 pdf와 같은거가요?
과거 컨퍼런스에서 발표했던 내용 PDF 에서 자료를 받아서 강의를 보고 있는데 강의내용에 나오는 PDF랑 좀 다른것 같아서요
-
미해결15일간의 빅데이터 파일럿 프로젝트
워크플로우 예약 실행시 테이블은 생성되는데 데이터가 들어가지지 않습니다.
주제 1,2에선 문제 없이 됐었는데 주제 3에서 예약을 실행하니 테이블은 생성 되는데 그 이후 데이터 삽입이 안됩니다. chat gpt 통해 여러가지 시도 해봤는데 해결이 안되네요. 어떻게 해결 가능할까요?하이브 쿼리는 강사님 쿼리 복붙 했습니다.jar 파일 돌렸을 때 날짜는 20250625였고 강의 내용대로 20200322을 다 넣었었습니다. 워크플로우 매개변수 설정도 즉시실행으로 20200322 값을 넣었습니다.JOB - 예약 - LOG2025-07-01 08:19:11,671 INFO org.apache.oozie.command.coord.CoordActionInputCheckXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[0000141-250701040825040-oozie-oozi-C@131] [0000141-250701040825040-oozie-oozi-C@131]::CoordActionInputCheck:: Missing deps: 2025-07-01 08:19:11,673 WARN org.apache.oozie.util.DateUtils: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[0000141-250701040825040-oozie-oozi-C@131] GMT, UTC or Region/City Timezone formats are preferred instead of Asia/Seoul 2025-07-01 08:19:11,673 WARN org.apache.oozie.util.DateUtils: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[0000141-250701040825040-oozie-oozi-C@131] GMT, UTC or Region/City Timezone formats are preferred instead of Asia/Seoul 2025-07-01 08:19:11,678 INFO org.apache.oozie.command.coord.CoordActionReadyXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[] Not starting any additional actions because max concurrency [1] for coordinator [0000141-250701040825040-oozie-oozi-C] has been reached. 2025-07-01 08:19:11,790 INFO org.apache.oozie.command.coord.CoordActionInputCheckXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[0000141-250701040825040-oozie-oozi-C@132] [0000141-250701040825040-oozie-oozi-C@132]::CoordActionInputCheck:: Missing deps: 2025-07-01 08:19:11,792 WARN org.apache.oozie.util.DateUtils: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[0000141-250701040825040-oozie-oozi-C@132] GMT, UTC or Region/City Timezone formats are preferred instead of Asia/Seoul 2025-07-01 08:19:11,792 WARN org.apache.oozie.util.DateUtils: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[0000141-250701040825040-oozie-oozi-C@132] GMT, UTC or Region/City Timezone formats are preferred instead of Asia/Seoul 2025-07-01 08:19:11,796 INFO org.apache.oozie.command.coord.CoordActionReadyXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[] Not starting any additional actions because max concurrency [1] for coordinator [0000141-250701040825040-oozie-oozi-C] has been reached. 2025-07-01 08:19:18,058 INFO org.apache.oozie.command.coord.CoordActionReadyXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[] Not starting any additional actions because max concurrency [1] for coordinator [0000141-250701040825040-oozie-oozi-C] has been reached. 2025-07-01 08:19:30,847 INFO org.apache.oozie.service.StatusTransitService$StatusTransitRunnable: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[-] Running bundle status service from last instance time = 2025-06-30T23:18Z 2025-07-01 08:19:30,848 INFO org.apache.oozie.service.StatusTransitService$StatusTransitRunnable: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[-] Released lock for [org.apache.oozie.service.StatusTransitService] 2025-07-01 08:20:18,064 INFO org.apache.oozie.command.coord.CoordActionReadyXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[] Not starting any additional actions because max concurrency [1] for coordinator [0000141-250701040825040-oozie-oozi-C] has been reached.JOB - 워크플로우 - LOG2025-07-01 08:12:00,094 INFO org.apache.oozie.action.hadoop.Hive2ActionExecutor: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - Workflow] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] Starting action. Getting Action File System 2025-07-01 08:12:02,264 WARN org.apache.oozie.action.hadoop.Hive2ActionExecutor: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - Workflow] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] Invalid configuration value [null] defined for launcher max attempts count, using default [2]. 2025-07-01 08:12:02,264 INFO org.apache.oozie.action.hadoop.YarnACLHandler: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - Workflow] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] Not setting ACLs because mapreduce.cluster.acls.enabled is set to false 2025-07-01 08:12:02,911 INFO org.apache.oozie.action.hadoop.Hive2ActionExecutor: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - Workflow] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] checking action, hadoop job ID [application_1751310527212_0157] status [RUNNING] 2025-07-01 08:12:02,914 INFO org.apache.oozie.command.wf.ActionStartXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - Workflow] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] [***0000143-250701040825040-oozie-oozi-W@hive-6885***]Action status=RUNNING 2025-07-01 08:12:02,914 INFO org.apache.oozie.command.wf.ActionStartXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - Workflow] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] [***0000143-250701040825040-oozie-oozi-W@hive-6885***]Action updated in DB! 2025-07-01 08:12:02,917 INFO org.apache.oozie.command.wf.WorkflowNotificationXCommand: SERVER[server02.hadoop.com] USER[-] GROUP[-] TOKEN[-] APP[-] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] No Notification URL is defined. Therefore nothing to notify for job 0000143-250701040825040-oozie-oozi-W@hive-6885 2025-07-01 08:22:13,932 INFO org.apache.oozie.action.hadoop.Hive2ActionExecutor: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - Workflow] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] checking action, hadoop job ID [application_1751310527212_0157] status [RUNNING]용량CM 상태
-
미해결카프카 완벽 가이드 - 커넥트(Connect) 편
connect 구동 오류
안녕하세요.강의에서 실습을 종료할 때는 첫 구동 순서의 반대로 순서로 종료를 하라고 말씀을 하셨는데그러지 못했습니다...ㅠㅠ 이후 zookeeper, kafka, connect 순으로 구동을 하려고 했지만 아래와 같은 오류가 connect구동단계에서 떴습니다.[2025-06-30 19:42:13,440] INFO [AdminClient clientId=adminclient-8] Retrying to fetch metadata. (org.apache.kafka.clients.admin.KafkaAdminClient:3177)위 구문이 무한반복으로 로그에 뜨게 되는데요. ~/data/kafka-logs/meta.properties을 지웠다가 kafka 구동부터 다시 시작을 시도해 봐도 여전히 connect구동을 위 에러로 진행할 수 없었습니다. 해결방법이 무엇인지 궁금합니다.
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
redisConfig 질문입니다
package org.example.config import org.redisson.Redisson import org.redisson.api.RedissonClient import org.redisson.config.Config import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Primary import org.springframework.data.redis.connection.RedisConnectionFactory import org.springframework.data.redis.connection.RedisStandaloneConfiguration import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory import org.springframework.data.redis.core.RedisTemplate import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer import org.springframework.data.redis.serializer.StringRedisSerializer import java.time.Duration @Configuration class RedisConfig { @Bean fun redisConnectionFactory( @Value("\${database.redis.host}") host: String, @Value("\${database.redis.port}") port: Int, @Value("\${database.redis.password:${null}}") password: String?, @Value("\${database.redis.database:${0}}") database: Int, @Value("\${database.redis.timeout:${10000}}") timeout: Long, ) : LettuceConnectionFactory { val config = RedisStandaloneConfiguration(host, port).apply { password?.let { setPassword(it) } setDatabase(database) } val clientConfig = LettuceClientConfiguration.builder() .commandTimeout(Duration.ofSeconds(timeout)) .build() return LettuceConnectionFactory(config,clientConfig) } @Bean @Primary fun redisTemplate(connectionFactory : RedisConnectionFactory): RedisTemplate<String, String> { val template = RedisTemplate<String, String>() template.connectionFactory = connectionFactory template.keySerializer = StringRedisSerializer() template.valueSerializer = Jackson2JsonRedisSerializer(String::class.java) template.hashKeySerializer = StringRedisSerializer() template.hashValueSerializer = Jackson2JsonRedisSerializer(String::class.java) template.afterPropertiesSet() return template } @Bean fun redissonClient( @Value("\${database.redisson.host}") host: String, @Value("\${database.redisson.timeout}") timeout: Int, @Value("\${database.redisson.password:${null}}") password: String?, ) : RedissonClient { val config = Config() val singleServerConfig = config.useSingleServer() .setAddress(host) .setTimeout(timeout) if (!password.isNullOrBlank()) { singleServerConfig.setPassword(password) } return Redisson.create(config).also { println("redisson create success") } } }An annotation argument must be a compile-time constant와 같은 에러가 나는데 강의 파일 코드로도 같은 에러가 납니다
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
좋아요 락 api test 에서 count 가 0으로 찍혀요
코드가 잘못 된 부분은 없는거 같은데 count=0으로 다 찍히네요
-
미해결[아파치 카프카 애플리케이션 프로그래밍] 개념부터 컨슈머, 프로듀서, 커넥트, 스트림즈까지!
reset offset 질문
--reset-offsets --to-earliest 같은 커맨드를 할 때 제일 처음으로 오프셋이 바뀌는데, 만약 파티션이 여러개일경우에는 어떻게 하나요? 특정파티션만 오프셋을 조절할 수 있는 커맨드도 있나요?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
댓글 최대 2depth - CUD API 구현에서 질문 있습니다.
안녕하세요 선생님 좋은 강의 해주셔서 감사합니다.댓글 create 구현에서 findParent() 함수를 구현할때,.filter(Comment::isRoot)이런 코드가 있는데, 애초에 parentCommentId 에 root 댓글이 아닌 댓글의 ID가 존재하면 안되는 것 아닌가요 ?존재하면 안되는 경우를 filter 로 걸러주는 것 같아서 필요한 코드인지 의문이 들어 질문 남깁니다.
-
미해결15일간의 빅데이터 파일럿 프로젝트
Hue 500 Error 어떻게 해결할 수 있나요?
select car_number, avg(battery) as battery_avgfrom SmartCar_Status_Infowhere battery < 60group by car_number;Hue에서 이 쿼리 돌리면 아래 에러가 뜹니다..chat gpt 통해서 hue_safety_valve.ini에 대한 Hue 서비스 고급 구성 스니펫에 아래 내용도 추가했는데 해결이 안됩니다. 이것 때문에 더이상 진도를 못 나가고 있어서 도움 부탁드려요. [yarn_clusters] [[default]] log_url_template=http://server02.hadoop.com:8042/node/containerlogs/${container_id}/${user}500 Server Error: Server Error for url: http://server02.hadoop.com:8042/node/containerlogs/admin?doAs=admin Error 500 Server Error HTTP ERROR 500 Problem accessing /node/containerlogs/admin. Reason: Server ErrorCaused by:java.lang.ArrayIndexOutOfBoundsException: 4 at org.apache.hadoop.yarn.server.nodemanager.webapp.NMWebAppFilter.containerLogPageRedirectPath(NMWebAppFilter.java:81) at org.apache.hadoop.yarn.server.nodemanager.webapp.NMWebAppFilter.doFilter(NMWebAppFilter.java:62) at com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:829) at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:119) at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:133) at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:130) at com.google.inject.servlet.GuiceFilter$Context.call(GuiceFilter.java:203) at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:130) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767) at org.apache.hadoop.security.http.XFrameOptionsFilter.doFilter(XFrameOptionsFilter.java:57) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767) at org.apache.hadoop.security.authentication.server.AuthenticationFilter.doFilter(AuthenticationFilter.java:644) at org.apache.hadoop.security.authentication.server.AuthenticationFilter.doFilter(AuthenticationFilter.java:592) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767) at org.apache.hadoop.http.lib.StaticUserWebFilter$StaticUserFilter.doFilter(StaticUserWebFilter.java:110) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767) at org.apache.hadoop.http.HttpServer2$QuotingInputFilter.doFilter(HttpServer2.java:1553) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767) at org.apache.hadoop.http.NoCacheFilter.doFilter(NoCacheFilter.java:45) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1180) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:513) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:119) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) at org.eclipse.jetty.server.Server.handle(Server.java:539) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:333) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:283) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:108) at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93) at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303) at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148) at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671) at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589) at java.lang.Thread.run(Thread.java:748) (error 500)
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
Entity 생성 시 access 레벨 지정해주는 이유
강의를 듣다가 한가지 궁금한 부분이 있어서 질문남깁니다. Entity 객체 생성 시NoArgConstructor 선언 시access를 항상 AccessLevel.PROTECTED로 설정하시는데 이유가 있으실까요?
-
미해결Kafka & Spark 활용한 Realtime Datalake
[과제10-3] count 하지 않을때 `persist` 함수의 의미와 순서도에서 `scan csv`가 세번 나온 이유
질문만약 문제에서 카운트를 출력하라는 조건이 없었으면 persist를 호출 하지않아도 같은 퍼포먼스가 나오나요? (문제: ... 각각 데이터를 로드한 후 카운트를 출력하고,...)count 함수를 제외하면 action 계열 함수가 없는데 count 함수가 없는 경우에도 persist가 유의미 한지 궁금합니다. [SQL/DataFrame] - [Details for Query0] 순서도(마지막에 첨부) 에서 Scan csv 가 3번 나타나는 이유는 무엇인가요?? csv 파일을 읽어오는 함수는 두번 실행했는데 왜 3번 실행되는지 궁금합니다. 참고목차질문-참고-코드-순서도코드 구조HDFS 경로 정의스키마 정의데이터프레임 생성time_recorded에 의한 중복열 제거employee_count 컬럼 추가를 위한 joinIT Services and IT Consulting 회사 추출두 테이블 결합결과 출력dropDuplicate가 정확히 어떤 행을 drop 하는지 몰라서 egg-max 조합으로 중복 행을 제거함코드""" >>> company_industries_df.printSchema() root |-- company_id: string (nullable = true) |-- industry: string (nullable = true) >>> company_industries_df.show(5) +----------+--------------------+ |company_id| industry| +----------+--------------------+ | 391906|Book and Periodic...| | 22292832| Construction| | 20300| Banking| | 3570660|Book and Periodic...| | 878353|Staffing and Recr...| +----------+--------------------+ only showing top 5 rows >>> employee_counts_df.printSchema() root |-- company_id: string (nullable = true) |-- employee_count: string (nullable = true) |-- follower_count: string (nullable = true) |-- time_recorded: string (nullable = true) >>> employee_counts_df.show(5) +----------+--------------+--------------+-------------+ |company_id|employee_count|follower_count|time_recorded| +----------+--------------+--------------+-------------+ | 391906| 186| 32508| 1712346173| | 22292832| 311| 4471| 1712346173| | 20300| 1053| 6554| 1712346173| | 3570660| 383| 35241| 1712346173| | 878353| 52| 26397| 1712346173| +----------+--------------+--------------+-------------+ only showing top 5 rows +----------+--------------------+--------------+--------------+-------------+ |company_id| industry|employee_count|follower_count|time_recorded| +----------+--------------------+--------------+--------------+-------------+ | 1353|IT Services and I...| 596046| 14829798| 1713536641| | 1353|IT Services and I...| 595935| 14822564| 1713448937| | 1353|IT Services and I...| 595844| 14817360| 1713407024| | 1353|IT Services and I...| 595782| 14807439| 1713279321| | 1353|IT Services and I...| 595669| 14800204| 1713208435| +----------+--------------------+--------------+--------------+-------------+ only showing top 5 rows """ import time from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, IntegerType from pyspark.sql.functions import col, max spark = SparkSession.builder.getOrCreate() # 1. 파일 경로 정의 company_industries_path = ( "/home/spark/sample/linkedin_jobs/companies/company_industries.csv" ) employee_counts_path = "/home/spark/sample/linkedin_jobs/companies/employee_counts.csv" # 2. 스키마 정의 company_industries_schema = StructType( [ StructField("company_id", IntegerType(), True), StructField("industry", StringType(), True), ] ) employee_counts_schema = StructType( [ StructField("company_id", IntegerType(), True), StructField("employee_count", IntegerType(), True), StructField("follower_count", IntegerType(), True), StructField("time_recorded", IntegerType(), True), ] ) # 3. 데이터프레임 생성 company_industries_df = ( spark.read.option("header", "true") .option("multiLine", "true") .schema(company_industries_schema) .csv(company_industries_path) ) employee_counts_df = ( spark.read.option("header", "true") .option("multiLine", "true") .schema(employee_counts_schema) .csv(employee_counts_path) ) # 4. 중복 제거: groupby(company_id) -> agg -> max(time_recorded) agg_latest_employee_counts_df = employee_counts_df.groupBy("company_id").agg( max("time_recorded").alias("time_recorded") ) # 5. employee_count 컬럼 추가 latest_employee_counts_df = agg_latest_employee_counts_df.join( employee_counts_df, on=["company_id", "time_recorded"], how="inner", ) # 6. 필터링: 업종이 IT Services and IT Consulting인 회사 추출 industry = "IT Services and IT Consulting" it_services_company_industries_df = company_industries_df.filter( col("industry") == industry ) # 7.조인: 회사 정보와 종업원 수 결합 및 필터링: 종업원수 1000명 이상 및 정렬: 종업원수 내림차순 정렬 result_df = ( it_services_company_industries_df.join( latest_employee_counts_df, on="company_id", how="inner", ) .filter(col("employee_count") >= 1000) .orderBy(col("employee_count").desc()) ) # 8. 'company_id', 'employee_count', 컬럼만 출력 result_df.select("company_id", "employee_count").show() time.sleep(300)순서도 이미지가 압축되어 올라가 [링크] 첨부합니다.
-
미해결Kafka & Spark 활용한 Realtime Datalake
[오타신고] 깃허브 레포지토리 내에 폴더명내 오타 (requrements.txt)
안녕하세요!레포지토리에 오타가 있어서 신고합니다.requrements.txt(파일명에 'i'가 빠져있어요.) 저는 경로까지 복사 해서 사용하는데 오타가 있으니 deploy/after_install.sh 설정과 달라 배포가 안되더라구요 ^^; 혹시 저와 같은 분들 계실까봐 남겨 놓습니다.https://github.com/hjkim-sun/datalake-pyspark-apps-season1/blob/ch8.5/requrements.txt 추신: 강의가 너무 좋습니다. 강의자료도 강의 진행도 너무 훌륭해요! 후속 강의도 너무 너무 기대됩니다! 다음 강의는 어떤걸 준비하고 계신지, 또 언제쯤 나올지 너무 궁금해요! 얼른 강의 내주세요 ㅎㅎ
-
미해결15일간의 빅데이터 파일럿 프로젝트
환경세팅 질문있습니다.
java와 이클립스 대신 인텔리제이25버전과와 자바21버전 설치해도 되나요?오라클에서 뒤져봤는데 17버전을 도저히 못찾겠어서요. 혹시 17버전 링크라도 알려주실 수 있나요? 그리고 벌쳐박스도 7..1로 설치해도 되나요? 혹시 구버전도 링크 알려주실수있나요?