역시 마찬가지로 디테일은 없다. 디테일은 레퍼런스 문서를 참고하자.

설치 순서는 ES -> Kibana -> FluentBit 순이다. Fluentd 를 먼저 시도했는데 ES 로 데이터가 유입되지 않았다. 유저 불량으로 보이긴 하는데 아무런 오류 메시지도 보여주지 않아서 원인 확인이 어려웠다. FluentBit 은 매끄럽게 바로 동작했다.

ES 와 Kibana 는 Helm chart 로 설치한다.

먼저 ES.

helm repo add elastic https://helm.elastic.co
kubectl create namespace elastic
helm install elasticsearch elastic/elastics …

역시나 디테일은 다른 문서들에게 맡기고 “방법” 에 집중해서 정리하고자 한다.

일단 k8s 클러스터에 Prometheus 설치부터 하자.

kubectl create namespace prometheushelm install prometheus stable/prometheus-operator -n prometheus

설치가 되었다면, k8s 에 Prometheus 관련 여러 개의 서비스들이 등록되어 있을 것이다.

kubectl get svc -n prometheusNAME                                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)       …

현재 데스크탑에 셋업한 k3s 클러스터는 클라우드 서비스에 종속적이지 않다. 다른 말로 하면, 필요한 인프라는 전부 알아서 셋업해야 된다는 뜻이다.

그 중 하나가 볼륨이다. 개별 워커 노드에 공간을 충분히 할애하고 emptyDir 이나 hostPath 등을 사용할 수도 있겠지만 노드에 미리 공간할애를 해 둬야 된다는 부분이 귀찮고 비효율적이다. 호스트 서버에는 할애한 공간 외에도 몇 백 기가정도의 공간이 따로 남아 있다. 어떻게 하면 좋을까?

조금 찾아보니 NFS 를 설정하고 Kubernetes 에서 PV/PVC 를 통해 해당 NFS 를 가져다 쓰는 게 서비스 비종속적인 방법 중에서는 가장 쉬워 보였다.

역시 디테일 없이 구글링 …


개발 환경 셋업의 마무리로 k8s 에서 Structured Streaming 쿼리로 결과를 파일 (S3), Kafka 등에 기록하는 것을 테스트했었다. 많은 TODO 를 남겼지만 일단 정상 동작하는 것을 확인해서 Spark 은 얼추 실행 테스트를 마쳤구나 생각했는데, 배치 쿼리는 파일 싱크에 기록할 때 기록 방법이 조금 다르다는 것을 나중에 깨달았다.

Structured Streaming 파일 싱크는 아웃풋 디렉토리 아래에 메타데이터 디렉토리를 만들고 거기에 각 마이크로 배치 별로 기록이 정상적으로 완료된 파일들의 리스트를 파일에 기입한다. 개별 task 가 아웃풋 파일들을 쓰고, task 가 정상적으로 완료되면 driv …


이제 k3s 클러스터에 MinIO 도 설치되었고 private docker registry 도 설정되었다. 이제 k3s 클러스터에 Spark 어플리케이션을 실행해 보자. (나중에는 remote shuffle service 도 설정해보고 할 예정인데 아직은 k8s 자체도 잘 모르니 쉬운 것부터…)

최신 버전인 Spark 3.0.1 의 바이너리를 다운로드받고 (spark-3.0.1-hadoop-3.2 로 사용함) <SPARK_HOME> 이라고 하자.

실행해 보니 bounty castle 관련 라이브러리가 없다는 에러가 나타나서 다운로드 받아서 넣어주는 것으로 했다. Spark docker image 를 다시 만들때에도 포함이 된다.

cd <SPARK_HOME>/jar …

위의 문서를 통해 k3s 클러스터의 기본 설정이 완료되었다. 추가 설정 없이 docker hub 를 통해 이미지를 pull 하고 push 할 수 있지만, 여러 제약도 있고 리모트 서버에 읽고 써야 되어서 아무래도 빠릿빠릿한 부분이 덜하다. 그래서 많은 경우 private docker registry 를 구성하고 이를 사용하도록 하는 듯 하다.

docker registry 를 구성하려면 역시 스토리지를 설정해야 하는데, docker registry helm chart 에서 S3 에 저장하는 기능을 제공한다. 물론 private docker registry 를 k8s 클러스터에서 사용하는데 실제 S3 를 다녀와야 되면 비용 …


사실 구글링해가면서 삽질한 거 정리하는 거라 내용은 없다. 디테일도 일단 없다. 새로 세팅한 데스크탑을 개발용도로 활용하려고 하는 거라 일단 돌아가게 만드는 게 목표이고, Kubernetes In Action 서적을 보면서 지식이 비는 부분들을 나중에 메꿀 계획이다. 그래서 거의 커맨드와 레퍼런스 (남겨뒀으면?) 수준으로 작성하려고 한다.

Kafka, S3 (MinIO), docker private repository 정도 셋업하고 이걸 활용해서 Spark 쿼리를 실행하는 것까지 우선 해 보았다. (그래서 노드가 상당히 많다. 32G 머신인데 32G 더 달아야되나 고민중…) 이번 문서에서는 k3s 셋업만 다뤄보려고 한다.

사실 삽질 과정은 지루한데 정리하면 뭐 없다. 우선 노드들을 띄우자 …


지난 주말, Spark 3.0.0 릴리즈를 위한 브랜치가 생성되었다. Spark 3.0 릴리즈를 위한 “feature freeze” 상태로 전환된 것이다. (예외 사항은 있을 수 있지만) 새로 제안될 신규 기능은 3.0.x 에는 추가되기 어려울 것 같고, 다르게 보면 Spark 3.0 에 적용될 새로운 변화들을 짚어보기에 적당한 시점이라고 할 수 있겠다.

나의 주된 관심사 및 공헌 분야는 Structured Streaming 이라서 이 분야에 도입될 변화들만 간단하게 정리해 보려고 한다. 다른 분야들은 3.0 출시 전후로 많은 글이 올라올 것 같기도 하고 잘 모르기도 하니… JIRA 기준으로 정리했기 때문에 SQL 로 …


현재 Spark 2.3.x 기준으로 Spark 는 map/flatMapGroupsWithState API 를 이용하여 세션 윈도우를 구현하도록 권장하고 있으며, 이에 대한 예시 구현을 제공하고 있다.

예시 구현은 mapGroupsWithState API 의 아주 단순한 활용 사례이기 때문에 해당 구현을 이해할 수 있어야 제시하는 구현도 이해할 수 있을 것이다. 해당 코드를 처음 본다면 시간을 내어 코드와 map/flatMapGroupsWithState API 문서를 먼저 읽어보기 바란다.

예시 구현은 프로세싱 타임을 기준으로 세션 윈도우를 정의하고 있다. 프로세싱 타임의 경우에는 늦은 이벤트가 들어오지 않기 때문에 특 …


주변에서 Jay Kreps 의 Kafka exactly-once 관련 작성한 글이 돌아다니길래 한 번 훑어 봤다. (영어 실력이 미천해서 정독은 정말 시간을 많이 들여야 되어서… 일단 먼저 훑어봄)

새로운 방법이라도 나온 건가 했는데, 일단 훑어본 걸로는 현재 사용되고 있는 방법을 사용하고 있는 듯 하다. 디테일에 대한 부분은 첫 링크의 Confluent 블로그 글이나 두번째 링크의 KIP 위키 페이지를 보는 것이 더 나아 보인다.

멱등성을 이용하거나 트랜잭션을 이용한 exactly-once 는 Storm trident 때부터 지원한 고전적인 방법이다.

단 한 번 보내는 게 아니라 여러 번 보내되 단 한 번의 시도만 유효하게 …

Jung-taek Lim

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store