본문 바로가기

전체 글

(215)
[log4j2] log4j2 설정법 및 spark operator 연동 (feat. datahub 로깅) 데이터허브를 spark에 연동하면 데이터허브 로그가 추가로 발생하게 되는데 이 로그의 양이 spark로그 보다 많게 느껴지는 경우가 많다.로깅 레벨에 대해서 데이터허브를 찾아보면 log4j.properties 파일에 log4j.logger.datahub.spark=DEBUGlog4j.logger.datahub.client.rest=DEBUG 를 추가해서 디버깅하는 법이 나와있다. 근데 현재 사용하는 스파크 버전에서는 log4j 가 아니고 log4j2를 사용하고 있어서 뭔가 애매한 상황이었다. 여러가지 시도를 하다가 위 구문을 log4j2 형식에 맞게 변형하면 사용이 가능하고, 그 외에도 원하는 패키지의 로그 레벨을 자유롭게 지정이 가능하다는 걸 알게 됐다. * log4j2.properties 생성    ..
[Spark] spark history server 띄울 때, iam 권한으로 s3 읽기 emr on eks를 적용하면 spark history server를 사용하고 싶은데, ec2의 주소로 접근이 어려워서 직접 띄우기로 하였다. event log 설정과 docker를 활용한 띄우기는 아래 글들을 참고하여서 로컬에서 테스트는 잘 진행했다. https://aws.github.io/aws-emr-containers-best-practices/troubleshooting/docs/self-hosted-shs/ Self Hosted SHS - EMR Containers Best Practices GuidesSelf Hosted Spark History Server In this section, you will learn how to self host Spark History Server inste..
[실수노트] 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..