본문 바로가기

전체 글

(213)
[실수노트] aws에서 여러 eks cluster에서 karpenter 운영 시 실수 1. 최초 설정 시, vpc의 region 별로 subnet을 지정하여 사용하도록 되어 있다. 이걸 subnet에 tag를 지정해서 사용하게 된다. 나중에 생성한 karpenter에서 같은 subnet을 사용할 경우 같은 tag key를 수정하게 돼서 기존의 karpenter가 정상적으로 작동하지 않게 된다. provisioner crd에서 subnet 지정 시, 기존 것과 동일하게 하여 처리하자. 2. karpenter에서는 신규 pod의 pending 상태를 인식해서 신규 instance를 생성까진 했는데, eks에선 해당 instance가 생성된 걸 인식하지 못 하는 현상이 발생했다. 여러가지 확인을 해보니, ec2의 security group이 이전에 생성했던 eks cluster의 securit..
knative/istio activator 종료 및 재실행 현상 kserve를 설치하면서 내부적으로 knative를 활용하고 있다. 언젠가부터 트래픽이 증가할 때 pod은 문제가 없는데 에러가 발생하기 시작했다. 호출하는 쪽에서 로그를 확인하니 upstream connect error or disconnect/reset before headers. reset reason: connection failure, transport failure reason: delayed connect error: 111 와 같은 에러가 발생했다. 확인하다 보니 knative 설치 때 생성된 activator가 죽었다 살아나기 시작했다. activator 자체는 proxy 역할로 request들을 모았다가 pod에 전달해주는 역할을 한다고 한다. 일단 proxy 리소스를 증가시켜보았다. ..
[Spark/Scala] NullPointerException 발생 - Some(null) 문제 spark로 json 형식 데이터에서 특정 key의 value를 추출한 뒤, 해당 값 중 정규표현식으로 추출하는 로직이 있었다. (자체 제작 함수들) extractJson(data, "key") match { case Some(a) => extraceRegex(a) match { case Some(b) => b case None => None } case None => None } 대충 이런 형태인데, 여기서 평소에 발생하지 않던 NullPointerException이 발생했다. Option 형태로 처리를 하고 있는데, null이 발생한다는 게 이해가 되지 않았다. 원본 데이터를 까보니 {"key": null} 평소에 없던 이런 형태의 데이터가 들어오고 있었다. 그런데 그렇다 하더라도 null은 None..
[실수노트] spark sql 에서 concat 함수 null 처리 spark sql을 사용하다 concat을 활용해서 임의의 값을 만드는 경우가 있었는데, null 이 발생하는 케이스가 발생했다. 일반 텍스트를 조합해서 사용하고 있었는데, null이 발생하는 게 이해가 안 됐었는데, 알고 보니 인자 중에 null이 있으면 null로 반환한다고 한다.
Mac에서 메모리 덤프 및 프로세스 바이너리 확인하기 실행 중인 프로세스의 메모리 dump 복구모드(recovery mode)로 진입하여 터미널 실행 csrutil disable 실행 (보호모드 해제 같은 걸로 작업 완료 후 다시 enable 하는 걸 추천) 재부팅 메모리 dump lldb --attach-pid process save-core "filename" hexedit 설치 brew install hexedit hexedit 명령어 참조해서 메모리 확인 (http://rigaux.org/hexedit.html)
[실수노트] Spark 무한 실행, 멈춤 오류 스파크로 작업을 위해 짜놓았던 테스트 코드를 돌렸더니, 실행 중인 클래스명과 함께 시간만 무한히 증가하는 화면만 나오는 상태로 끝나지 않았다. 한 번 돌기 시작하면 중간에 쉘에서 취소해도 멈추지 않고 프로세스를 강제로 죽여야 종료가 됐다. 뭔가 설정이 꼬였다고 생각해서 처음에는 메모리 등의 이슈인가 하여 늘려보고 spark session이나 context를 종료했다 실행하는 등 다양한 방법을 해봤지만 결론은 같았다. 알고 보니 원인은 어이없고 당연한 이유였는데... udf 코드를 변경했는데 원래는 일정 횟수만큼 돌던 코드를 오류가 날 때까지 돌게 수정을 했는데 종료 조건이 명확하지 않아서 무한히 도는 문제였다. scala를 사용해서 재귀로 짰는데.. 아마 자동으로 꼬리재귀로 메모리가 잘 관리돼서 stac..
스트림 처리 [데이터 중심 애플리케이션 설계 11장] 이벤트 스트림 전송: 생산자가 이벤트를 만들면 소비자가 처리한다. 토픽이나 스트림으로 관련 이벤트를 묶는다. 메시징 시스템: 생산자와 소비자 사이에 직접 통신 채널을 사용하는 방식을 기본으로 확장된다. 생산자에서 소비자로 메시지를 직접 전달: 설계 상황에서는 잘 작동하지만, 메시지 유실 가능성을 고려해서 애플리케이션 코드를 작성해야 한다. 오프라인 상태에 취약하다 메시지 브로커: 직접 방식의 대안으로 중간에 메시지 브로커를 통해 메시지를 보내는 방식이다. 메시지 브로커는 일종의 데이터베이스다. 브로커에 메시지가 모이기 때문에 클라이언트의 상태에 쉽게 대처가 가능하다. 비동기로 작동한다. 복수 소비자: 여러 소비자가 같은 토픽에서 메시지를 읽는 패턴 로드 밸런싱: 소비자 중 하나로 전달되고 소비자들끼리 메..
일괄 처리 [데이터 중심 애플리케이션 설계 10장] 데이터 처리 방식 서비스(온라인 시스템): 클라이언트가 요청이 올 때까지 기다리는 방식 일괄 처리 시스템(오프라인 시스템): 큰 입력을 받아 처리하는 방식으로 사용자가 대기 하지 않고 주기적으로 실행됨 스트림 처리 시스템(준실시간 시스템): 온라인과 오프라인 사이로 요청에 대해 응답이 아닌 입력 데이터를 소비하여 출력 데이터 생산 유닉스 도구 일괄 처리 일반적인 프로그래밍 언어에선 메모리에 데이터를 올리고 작업을 하지만, 메모리 보다 큰 데이터셋을 자동으로 디스크로 보내고 자동으로 여러 CPU코어에서 병렬로 정렬한다. (메모리 부족 없이 큰 데이터셋을 처리 가능) 각 프로그램이 하나의 일만 하게 한다. 모든 출력이 다른 프로그램의 입력이 되게 한다. 맵리듀스와 분산 파일 시스템 맵리듀스: 맵퍼 + 리듀서..