Data/Trino

Trino) Deview 2023에 나왔던 JMX 모니터링 따라해보기

MightyTedKim 2023. 3. 12. 23:40
728x90
반응형
최근에 Deview 2023에서 Trino 관련 내용 중에서 JMX 모니터링을 따라해보려고 해요
비록 현장 참여는 못했지만, 너무 정리잘된 pdf를 참고했습니다.

 

예상 독자는 아래와 같습니다. 

  • Trino 적용을 검토하는 분
  • s3, hdfs의 파일을 Ansi SQL로 읽고 싶으신 분
  • Impala, SparkSql 대체를 고려하시는 분

 

다룰 내용은 아래와 같습니다

  • JMX로 모니터링하기

https://deview.kr/data/deview/session/attach/[133]CQuery%20-%20%EC%9A%B0%EB%8B%B9%ED%83%95%ED%83%95%20Trino%EC%99%80%20%EC%8D%B8%ED%83%80%EA%B8%B0.pdf S

 


Trino란?

Trino는 2007년 Facebook에서 hive의 속도에 한계를 느껴 만든 쿼리 엔진(presto)의 오픈소스 버전이에요.

Impala와 마찬가지 in memory distributed query engine 라서 엄청 빠릅니다

 

저는 딱 1년 전에 Trino를 K8S에 올려봤는데, 요즘 핫해서 다시 보고있어요

 

https://mightytedkim.tistory.com/60

 

Kubernetes)Trino설치_yaml

spark thrift server는 관리하기 힘들어서, Trino 공부 thrift 세팅하신 분들은 metastore, mysql 그대로 사용하면 되니까 금방 hello world 할 수 있을거에요 https://github.com/joshuarobinson/trino-on-k8s https://joshua-robinson

mightytedkim.tistory.com

 

나의 궁금증 - 모니터링은 어찌하나요

모니터링을 하고 싶은데 마땅한 자료를 못찾아서, 고민하고 있었거든요

제가 찾은 내용은 아래 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/

 

Central Repository: io/prometheus/jmx/jmx_prometheus_javaagent/0.17.2

 

repo1.maven.org

 

장소는 제가 편한 위치로 넣었어요

$ 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
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
coordinator
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 도입을 고려하는 분들께 도움이 되었으면 좋겠습니닿

728x90
반응형