Trino) Deview 2023에 나왔던 JMX 모니터링 따라해보기
최근에 Deview 2023에서 Trino 관련 내용 중에서 JMX 모니터링을 따라해보려고 해요
비록 현장 참여는 못했지만, 너무 정리잘된 pdf를 참고했습니다.
예상 독자는 아래와 같습니다.
- Trino 적용을 검토하는 분
- s3, hdfs의 파일을 Ansi SQL로 읽고 싶으신 분
- Impala, SparkSql 대체를 고려하시는 분
다룰 내용은 아래와 같습니다
- JMX로 모니터링하기
Trino란?
Trino는 2007년 Facebook에서 hive의 속도에 한계를 느껴 만든 쿼리 엔진(presto)의 오픈소스 버전이에요.
Impala와 마찬가지 in memory distributed query engine 라서 엄청 빠릅니다
저는 딱 1년 전에 Trino를 K8S에 올려봤는데, 요즘 핫해서 다시 보고있어요
https://mightytedkim.tistory.com/60
나의 궁금증 - 모니터링은 어찌하나요
모니터링을 하고 싶은데 마땅한 자료를 못찾아서, 고민하고 있었거든요
제가 찾은 내용은 아래 2가지였어요
1. k8s의 pod 상태 모니터링 (grafana) - memory/cpu 사용률 등
2. jmx_connector를 이용해 sql로 조회
하지만 뭔가 아쉬웠죠.
그러던 와중에 Deview에서 Trino를 다룬다는 이야기를 듣고 발표자료를 찾아봤어요
크으크크으 모니터링 관련 내용이 있군요!
Deview 발표 - JMX_Exporter로 하지요
어떤 식으로 naver는 모니터링하고 있을까?
역시 JMX를 이용하는구나. 여기까지는 나랑 똑같은데 promethues랑 연결을 했어요
jvm.config에 -java-agent 설정값을 추가하는 방식으로 하는군요!
대박 좋아요. 저도 따라해보기로 해요
좋군요. 따라해볼게요!
흐지부지하면 안하게되니까 바로 따라했습니다.
먼저 최신 jmx_prometheus_javaagent를 다운받았어요
https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.17.2/
장소는 제가 편한 위치로 넣었어요
$ vi Dockerfile
FROM trinodb/trino:365
COPY jmx_prometheus_javaagent-0.17.2.jar /etc/trino/catalog/jmx_prometheus_javaagent-0.17.2.jar
exporter.yaml은 configmap으로 만들었어요. 안 그러면 매번 빌드해야하니까요
- 어떤 값을 넣어야할지는 몰라서 jmx-connector에 나오는 대표 값들을 넣었어요
https://trino.io/docs/current/connector/jmx.html
kind: ConfigMap
apiVersion: v1
metadata:
name: trino-jmx-config
data:
trino-jmx-config.yaml: |-
lowercaseOutputName: true
lowercaseOutputLabelNames: true
rules:
- pattern: "java.lang<type=Memory><>HeapMemoryUsage.used"
name: "jvm_heap_memory_used"
- pattern: "java.lang<type=Threading><>ThreadCount"
name: "jvm_thread_count"
- pattern: "trino.failuredetector<name=HeartbeatFailureDetector><>ActiveCount"
name: "trino_active_nodes"
- pattern: "trino.memory<type=ClusterMemoryPool, name=general><>FreeDistributedBytes"
name: "trino_memory_cluster_general_free_bytes"
- pattern: "trino.memory<name=ClusterMemoryManager><>QueriesKilledDueToOutOfMemory"
name: "trino_memory_killed_queries_out_of_memory"
- pattern: "trino.execution<name=QueryManager><>RunningQueries"
name: "trino_queries_running"
- pattern: "trino.execution<name=QueryManager><>StartedQueries.FiveMinute.Count"
name: "trino_queries_started_5min_count"
- pattern: "trino.execution<name=QueryManager><>FailedQueries.FiveMinute.Count"
name: "trino_queries_failed_5min_count"
- pattern: "trino.execution<name=QueryManager><>InternalFailures.FiveMinute.Count"
name: "trino_queries_internal_failures_5min_count"
- pattern: "trino.execution<name=QueryManager><>ExternalFailures.FiveMinute.Count"
name: "trino_queries_external_failures_5min_count"
- pattern: "trino.execution<name=QueryManager><>UserErrorFailures.FiveMinute.Count"
name: "trino_queries_user_error_failures_5min_count"
- pattern: "trino.execution<name=QueryManager><>ExecutionTime.FiveMinutes.P50"
name: "trino_queries_execution_latency_p50"
- pattern: "trino.execution<name=QueryManager><>WallInputBytesRate.FiveMinutes.P90"
name: "trino_queries_input_data_rate_p90"
- pattern: "trino.execution<name=TaskManager><>InputDataSize.FiveMinute.Count"
name: "trino_tasks_input_data_bytes"
- pattern: "trino.execution<name=TaskManager><>InputPositions.FiveMinute.Count"
name: "trino_tasks_input_rows"
그리고 statefulset, deployment에 configmap을 연결해줍니다.
worker
coordinator
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: trino-worker
spec:
(생략)
volumeMounts:
- name: trino-jmx-vol
mountPath: /etc/trino/catalog/trino-jmx-config.yaml
subPath: trino-jmx-config.yaml
(생략)
volumes:
- name: trino-jmx-vol
configMap:
name: trino-jmx-config
apiVersion: apps/v1
kind: Deployment
metadata:
name: trino-coordinator
spec:
(생략)
volumeMounts:
- name: trino-jmx-vol
mountPath: /etc/trino/catalog/trino-jmx-config.yaml
subPath: trino-jmx-config.yaml
(생략)
volumes:
- name: trino-jmx-vol
configMap:
name: trino-jmx-config
jvm.config의 값에 deview의 명령어 한줄을 추가해줘요
저는 .config /.properties는 모두 configmap으로 관리해서 아래처럼 수정해줫어요
jmxremote 관련된 설정값은 정확하지 않을 수 있으니 참고만 부탁드려
--- kind: ConfigMap apiVersion: v1 metadata: name: trino-configs data: config.properties.coordinator: |- coordinator=true (생략) jmx.rmiregistry.port=9080 jmx.rmiserver.port=9081 config.properties.worker: |- coordinator=false (생략) jmx.rmiregistry.port=9080 jmx.rmiserver.port=9081 jvm.config: |- -server (생략) -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.rmi.port=9081 -javaagent:/etc/trino/catalog/jmx_prometheus_javaagent-0.17.2.jar=9000:/etc/trino/catalog/trino-jmx-config.yaml |
그러면 pod안에서 localhost:9000 하면 metric이 출력될거에요.
이걸 가지고 promtheus target에 입력해주면 됩니다.
더 해야할 것
발표자료를 보면 $1_$2를 이용해서 동적으로 metric을 만들어요.
jmx-connector를 이용해 sql로 조회하면 이 값들을 볼 수 있는데 시간이 없어서 더 진행하지는 못했어요.
기회가 된다면
1. jmx-connector로 데이터를 조회해서 필요한 값을 jmx_exporter로 넣는 것까지 해보고 싶어요.
2. 저만의 k8s trino 대시보드를 만들어서 grafana archive에 올리고 싶어요
생각보다 관련된 자료가 너무 없더라고요. trino 도입을 고려하는 분들께 도움이 되었으면 좋겠습니닿