From 5a4afba997c86f42b3a6de1f77e6b4359ff13af9 Mon Sep 17 00:00:00 2001
From: AdheipSingh <34169002+AdheipSingh@users.noreply.github.com>
Date: Thu, 14 Dec 2023 00:39:00 +0530
Subject: [PATCH] mm less druid (#120)
---
e2e/configs/druid-mmless.yaml | 362 +++++++++++++++++++++++++++++
examples/tiny-cluster-mmless.yaml | 364 ++++++++++++++++++++++++++++++
2 files changed, 726 insertions(+)
create mode 100644 e2e/configs/druid-mmless.yaml
create mode 100644 examples/tiny-cluster-mmless.yaml
diff --git a/e2e/configs/druid-mmless.yaml b/e2e/configs/druid-mmless.yaml
new file mode 100644
index 00000000..e5fd2820
--- /dev/null
+++ b/e2e/configs/druid-mmless.yaml
@@ -0,0 +1,362 @@
+apiVersion: "druid.apache.org/v1alpha1"
+kind: "Druid"
+metadata:
+ name: tiny-cluster
+spec:
+ image: apache/druid:28.0.0
+ # Optionally specify image for all nodes. Can be specify on nodes also
+ # imagePullSecrets:
+ # - name: tutu
+ startScript: /druid.sh
+ scalePvcSts: true
+ rollingDeploy: true
+ defaultProbes: false
+ podLabels:
+ environment: stage
+ release: alpha
+ podAnnotations:
+ dummy: k8s_extn_needs_atleast_one_annotation
+ additionalContainer:
+ - containerName: mysqlconnector
+ runAsInit: true
+ image: apache/druid:27.0.0
+ command:
+ - "sh"
+ - "-c"
+ - "wget -O /tmp/mysql-connector-j-8.0.32.tar.gz https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-j-8.0.32.tar.gz && cd /tmp && tar -xf /tmp/mysql-connector-j-8.0.32.tar.gz && cp /tmp/mysql-connector-j-8.0.32/mysql-connector-j-8.0.32.jar /opt/druid/extensions/mysql-connector/mysql-connector-java.jar"
+ volumeMounts:
+ - name: mysqlconnector
+ mountPath: "/opt/druid/extensions/mysql-connector"
+ volumes:
+ - name: mysqlconnector
+ emptyDir: {}
+ volumeMounts:
+ - name: mysqlconnector
+ mountPath: "/opt/druid/extensions/mysql-connector"
+ securityContext:
+ fsGroup: 0
+ runAsUser: 0
+ runAsGroup: 0
+ containerSecurityContext:
+ privileged: true
+ services:
+ - spec:
+ type: ClusterIP
+ clusterIP: None
+ commonConfigMountPath: "/opt/druid/conf/druid/cluster/_common"
+ jvm.options: |-
+ -server
+ -XX:MaxDirectMemorySize=10240g
+ -Duser.timezone=UTC
+ -Dfile.encoding=UTF-8
+ -Dlog4j.debug
+ -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
+ log4j.config: |-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ common.runtime.properties: |
+ #
+ # Zookeeper-less Druid Cluster
+ #
+ druid.zk.service.enabled=false
+ druid.discovery.type=k8s
+ druid.discovery.k8s.clusterIdentifier=druid-it
+ druid.serverview.type=http
+ druid.coordinator.loadqueuepeon.type=http
+ druid.indexer.runner.type=httpRemote
+ # Metadata Store
+ druid.metadata.storage.type=derby
+ druid.metadata.storage.connector.connectURI=jdbc:derby://localhost:1527/var/druid/metadata.db;create=true
+ druid.metadata.storage.connector.host=localhost
+ druid.metadata.storage.connector.port=1527
+ druid.metadata.storage.connector.createTables=true
+ # Deep Storage
+ druid.storage.type=s3
+ druid.storage.bucket=druid
+ druid.storage.baseKey=druid/segments
+ druid.s3.accessKey=minio
+ druid.s3.secretKey=minio123
+ druid.s3.protocol=http
+ druid.s3.enabePathStyleAccess=true
+ druid.s3.endpoint.signingRegion=us-east-1
+ druid.s3.enablePathStyleAccess=true
+ druid.s3.endpoint.url=http://myminio-hl.druid.svc.cluster.local:9000/
+ #
+ # Extensions
+ #
+ druid.extensions.loadList=["druid-kubernetes-overlord-extensions", "druid-avro-extensions", "druid-s3-extensions", "druid-hdfs-storage", "druid-kafka-indexing-service", "druid-datasketches", "druid-kubernetes-extensions"]
+ #
+ # Service discovery
+ #
+ druid.selectors.indexing.serviceName=druid/overlord
+ druid.selectors.coordinator.serviceName=druid/coordinator
+ druid.indexer.logs.type=s3
+ druid.indexer.logs.s3Bucket=druid
+ druid.indexer.logs.s3Prefix=druid/indexing-logs
+ druid.lookup.enableLookupSyncOnStartup=false
+ env:
+ - name: POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: POD_NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+
+ nodes:
+ brokers:
+ # Optionally specify for running broker as Deployment
+ kind: Deployment
+ nodeType: "broker"
+ # Optionally specify for broker nodes
+ # imagePullSecrets:
+ # - name: tutu
+ priorityClassName: system-cluster-critical
+ druid.port: 8088
+ services:
+ - spec:
+ type: ClusterIP
+ clusterIP: None
+ nodeConfigMountPath: "/opt/druid/conf/druid/cluster/query/broker"
+ replicas: s
+ runtime.properties: |
+ druid.service=druid/broker
+ # HTTP server threads
+ druid.broker.http.numConnections=5
+ druid.server.http.numThreads=40
+ # Processing threads and buffers
+ druid.processing.buffer.sizeBytes=25000000
+ druid.sql.enable=true
+ extra.jvm.options: |-
+ -Xmx512m
+ -Xms512m
+
+ coordinators:
+ # Optionally specify for running coordinator as Deployment
+ kind: Deployment
+ nodeType: "coordinator"
+ druid.port: 8088
+ services:
+ - spec:
+ type: ClusterIP
+ clusterIP: None
+ nodeConfigMountPath: "/opt/druid/conf/druid/cluster/master/coordinator-overlord"
+ replicas: 1
+ runtime.properties: |
+ druid.service=druid/coordinator
+ # HTTP server threads
+ druid.coordinator.startDelay=PT30S
+ druid.coordinator.period=PT30S
+ # Configure this coordinator to also run as Overlord
+ druid.coordinator.asOverlord.enabled=true
+ druid.coordinator.asOverlord.overlordService=druid/overlord
+ druid.indexer.queue.startDelay=PT30S
+ druid.indexer.runner.capacity: 2
+ druid.indexer.runner.namespace: druid
+ druid.indexer.runner.type: k8s
+ druid.indexer.task.encapsulatedTask: true
+ extra.jvm.options: |-
+ -Xmx800m
+ -Xms800m
+
+ hot:
+ nodeType: "historical"
+ druid.port: 8088
+ resources:
+ requests:
+ memory: "1.5Mi"
+ cpu: "1"
+ services:
+ - spec:
+ type: ClusterIP
+ clusterIP: None
+ nodeConfigMountPath: "/opt/druid/conf/druid/cluster/data/historical"
+ replicas: 1
+ livenessProbe:
+ failureThreshold: 10
+ httpGet:
+ path: /status/health
+ port: 8088
+ initialDelaySeconds: 5
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 5
+ readinessProbe:
+ failureThreshold: 20
+ httpGet:
+ path: /druid/historical/v1/loadstatus
+ port: 8088
+ initialDelaySeconds: 5
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 5
+ startUpProbes:
+ failureThreshold: 20
+ httpGet:
+ path: /druid/historical/v1/loadstatus
+ port: 8088
+ initialDelaySeconds: 60
+ periodSeconds: 30
+ successThreshold: 1
+ timeoutSeconds: 10
+ volumeMounts:
+ - mountPath: /druid/data/segments
+ name: hot-volume
+ volumeClaimTemplates:
+ - metadata:
+ name: hot-volume
+ spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 5Gi
+ storageClassName: gp2
+ runtime.properties: |
+ druid.service=druid/hot
+ druid.server.tier=hot
+ druid.server.priority=1
+ druid.processing.buffer.sizeBytes=25000000
+ druid.processing.numThreads=2
+ # Segment storage
+ druid.segmentCache.locations=[{"path":"/druid/data/segments","maxSize":1000000000}]
+ druid.server.maxSize=1000000000
+ extra.jvm.options: |-
+ -Xmx512m
+ -Xms512m
+
+ cold:
+ nodeType: "historical"
+ druid.port: 8088
+ resources:
+ requests:
+ memory: "0.5Mi"
+ cpu: "0.5"
+ services:
+ - spec:
+ type: ClusterIP
+ clusterIP: None
+ nodeConfigMountPath: "/opt/druid/conf/druid/cluster/data/historical"
+ replicas: 1
+ livenessProbe:
+ failureThreshold: 10
+ httpGet:
+ path: /status/health
+ port: 8088
+ initialDelaySeconds: 5
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 5
+ readinessProbe:
+ failureThreshold: 20
+ httpGet:
+ path: /druid/historical/v1/loadstatus
+ port: 8088
+ initialDelaySeconds: 5
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 5
+ startUpProbes:
+ failureThreshold: 20
+ httpGet:
+ path: /druid/historical/v1/loadstatus
+ port: 8088
+ initialDelaySeconds: 60
+ periodSeconds: 30
+ successThreshold: 1
+ timeoutSeconds: 10
+ volumeMounts:
+ - mountPath: /druid/data/segments
+ name: cold-volume
+ volumeClaimTemplates:
+ - metadata:
+ name: cold-volume
+ spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 5Gi
+ storageClassName: gp2
+ runtime.properties: |
+ druid.service=druid/cold
+ druid.server.tier=cold
+ druid.server.priority=0
+ druid.processing.buffer.sizeBytes=25000000
+ druid.processing.numThreads=2
+ # Segment storage
+ druid.segmentCache.locations=[{"path":"/druid/data/segments","maxSize":2000000000}]
+ druid.server.maxSize=2000000000
+ extra.jvm.options: |-
+ -Xmx512m
+ -Xms512m
+
+ routers:
+ nodeType: "router"
+ druid.port: 8088
+ kind: Deployment
+ services:
+ - spec:
+ type: ClusterIP
+ clusterIP: None
+ nodeConfigMountPath: "/opt/druid/conf/druid/cluster/query/router"
+ replicas: 1
+ runtime.properties: |
+ druid.service=druid/router
+ # HTTP proxy
+ druid.router.http.numConnections=50
+ druid.router.http.readTimeout=PT5M
+ druid.router.http.numMaxThreads=100
+ druid.server.http.numThreads=100
+ # Service discovery
+ druid.router.defaultBrokerServiceName=druid/broker
+ druid.router.coordinatorServiceName=druid/coordinator
+ # Management proxy to coordinator / overlord: required for unified web console.
+ druid.router.managementProxy.enabled=true
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+ name: druid-cluster
+rules:
+- apiGroups:
+ - ""
+ resources:
+ - pods
+ - configmaps
+ verbs:
+ - '*'
+- apiGroups: ["batch"]
+ resources: ["jobs"]
+ verbs: ["get", "watch", "list", "delete", "create"]
+- apiGroups: [""]
+ resources: ["pods", "pods/log"]
+ verbs: ["get", "watch", "list", "delete", "create"]
+---
+kind: RoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: druid-cluster
+subjects:
+- kind: ServiceAccount
+ name: default
+roleRef:
+ kind: Role
+ name: druid-cluster
+ apiGroup: rbac.authorization.k8s.io
diff --git a/examples/tiny-cluster-mmless.yaml b/examples/tiny-cluster-mmless.yaml
new file mode 100644
index 00000000..b9db8924
--- /dev/null
+++ b/examples/tiny-cluster-mmless.yaml
@@ -0,0 +1,364 @@
+# uses minio.
+# run ```make helm-minio-install``` to install minio
+apiVersion: "druid.apache.org/v1alpha1"
+kind: "Druid"
+metadata:
+ name: tiny-cluster
+spec:
+ image: apache/druid:28.0.0
+ # Optionally specify image for all nodes. Can be specify on nodes also
+ # imagePullSecrets:
+ # - name: tutu
+ startScript: /druid.sh
+ scalePvcSts: true
+ rollingDeploy: true
+ defaultProbes: false
+ podLabels:
+ environment: stage
+ release: alpha
+ podAnnotations:
+ dummy: k8s_extn_needs_atleast_one_annotation
+ additionalContainer:
+ - containerName: mysqlconnector
+ runAsInit: true
+ image: apache/druid:27.0.0
+ command:
+ - "sh"
+ - "-c"
+ - "wget -O /tmp/mysql-connector-j-8.0.32.tar.gz https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-j-8.0.32.tar.gz && cd /tmp && tar -xf /tmp/mysql-connector-j-8.0.32.tar.gz && cp /tmp/mysql-connector-j-8.0.32/mysql-connector-j-8.0.32.jar /opt/druid/extensions/mysql-connector/mysql-connector-java.jar"
+ volumeMounts:
+ - name: mysqlconnector
+ mountPath: "/opt/druid/extensions/mysql-connector"
+ volumes:
+ - name: mysqlconnector
+ emptyDir: {}
+ volumeMounts:
+ - name: mysqlconnector
+ mountPath: "/opt/druid/extensions/mysql-connector"
+ securityContext:
+ fsGroup: 0
+ runAsUser: 0
+ runAsGroup: 0
+ containerSecurityContext:
+ privileged: true
+ services:
+ - spec:
+ type: ClusterIP
+ clusterIP: None
+ commonConfigMountPath: "/opt/druid/conf/druid/cluster/_common"
+ jvm.options: |-
+ -server
+ -XX:MaxDirectMemorySize=10240g
+ -Duser.timezone=UTC
+ -Dfile.encoding=UTF-8
+ -Dlog4j.debug
+ -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
+ log4j.config: |-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ common.runtime.properties: |
+ #
+ # Zookeeper-less Druid Cluster
+ #
+ druid.zk.service.enabled=false
+ druid.discovery.type=k8s
+ druid.discovery.k8s.clusterIdentifier=druid-it
+ druid.serverview.type=http
+ druid.coordinator.loadqueuepeon.type=http
+ druid.indexer.runner.type=httpRemote
+ # Metadata Store
+ druid.metadata.storage.type=derby
+ druid.metadata.storage.connector.connectURI=jdbc:derby://localhost:1527/var/druid/metadata.db;create=true
+ druid.metadata.storage.connector.host=localhost
+ druid.metadata.storage.connector.port=1527
+ druid.metadata.storage.connector.createTables=true
+ # Deep Storage
+ druid.storage.type=s3
+ druid.storage.bucket=druid
+ druid.storage.baseKey=druid/segments
+ druid.s3.accessKey=minio
+ druid.s3.secretKey=minio123
+ druid.s3.protocol=http
+ druid.s3.enabePathStyleAccess=true
+ druid.s3.endpoint.signingRegion=us-east-1
+ druid.s3.enablePathStyleAccess=true
+ druid.s3.endpoint.url=http://myminio-hl.druid.svc.cluster.local:9000/
+ #
+ # Extensions
+ #
+ druid.extensions.loadList=["druid-kubernetes-overlord-extensions", "druid-avro-extensions", "druid-s3-extensions", "druid-hdfs-storage", "druid-kafka-indexing-service", "druid-datasketches", "druid-kubernetes-extensions"]
+ #
+ # Service discovery
+ #
+ druid.selectors.indexing.serviceName=druid/overlord
+ druid.selectors.coordinator.serviceName=druid/coordinator
+ druid.indexer.logs.type=s3
+ druid.indexer.logs.s3Bucket=druid
+ druid.indexer.logs.s3Prefix=druid/indexing-logs
+ druid.lookup.enableLookupSyncOnStartup=false
+ env:
+ - name: POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: POD_NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+
+ nodes:
+ brokers:
+ # Optionally specify for running broker as Deployment
+ kind: Deployment
+ nodeType: "broker"
+ # Optionally specify for broker nodes
+ # imagePullSecrets:
+ # - name: tutu
+ priorityClassName: system-cluster-critical
+ druid.port: 8088
+ services:
+ - spec:
+ type: ClusterIP
+ clusterIP: None
+ nodeConfigMountPath: "/opt/druid/conf/druid/cluster/query/broker"
+ replicas: s
+ runtime.properties: |
+ druid.service=druid/broker
+ # HTTP server threads
+ druid.broker.http.numConnections=5
+ druid.server.http.numThreads=40
+ # Processing threads and buffers
+ druid.processing.buffer.sizeBytes=25000000
+ druid.sql.enable=true
+ extra.jvm.options: |-
+ -Xmx512m
+ -Xms512m
+
+ coordinators:
+ # Optionally specify for running coordinator as Deployment
+ kind: Deployment
+ nodeType: "coordinator"
+ druid.port: 8088
+ services:
+ - spec:
+ type: ClusterIP
+ clusterIP: None
+ nodeConfigMountPath: "/opt/druid/conf/druid/cluster/master/coordinator-overlord"
+ replicas: 1
+ runtime.properties: |
+ druid.service=druid/coordinator
+ # HTTP server threads
+ druid.coordinator.startDelay=PT30S
+ druid.coordinator.period=PT30S
+ # Configure this coordinator to also run as Overlord
+ druid.coordinator.asOverlord.enabled=true
+ druid.coordinator.asOverlord.overlordService=druid/overlord
+ druid.indexer.queue.startDelay=PT30S
+ druid.indexer.runner.capacity: 2
+ druid.indexer.runner.namespace: druid
+ druid.indexer.runner.type: k8s
+ druid.indexer.task.encapsulatedTask: true
+ extra.jvm.options: |-
+ -Xmx800m
+ -Xms800m
+
+ hot:
+ nodeType: "historical"
+ druid.port: 8088
+ resources:
+ requests:
+ memory: "1.5Mi"
+ cpu: "1"
+ services:
+ - spec:
+ type: ClusterIP
+ clusterIP: None
+ nodeConfigMountPath: "/opt/druid/conf/druid/cluster/data/historical"
+ replicas: 1
+ livenessProbe:
+ failureThreshold: 10
+ httpGet:
+ path: /status/health
+ port: 8088
+ initialDelaySeconds: 5
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 5
+ readinessProbe:
+ failureThreshold: 20
+ httpGet:
+ path: /druid/historical/v1/loadstatus
+ port: 8088
+ initialDelaySeconds: 5
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 5
+ startUpProbes:
+ failureThreshold: 20
+ httpGet:
+ path: /druid/historical/v1/loadstatus
+ port: 8088
+ initialDelaySeconds: 60
+ periodSeconds: 30
+ successThreshold: 1
+ timeoutSeconds: 10
+ volumeMounts:
+ - mountPath: /druid/data/segments
+ name: hot-volume
+ volumeClaimTemplates:
+ - metadata:
+ name: hot-volume
+ spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 5Gi
+ storageClassName: gp2
+ runtime.properties: |
+ druid.service=druid/hot
+ druid.server.tier=hot
+ druid.server.priority=1
+ druid.processing.buffer.sizeBytes=25000000
+ druid.processing.numThreads=2
+ # Segment storage
+ druid.segmentCache.locations=[{"path":"/druid/data/segments","maxSize":1000000000}]
+ druid.server.maxSize=1000000000
+ extra.jvm.options: |-
+ -Xmx512m
+ -Xms512m
+
+ cold:
+ nodeType: "historical"
+ druid.port: 8088
+ resources:
+ requests:
+ memory: "0.5Mi"
+ cpu: "0.5"
+ services:
+ - spec:
+ type: ClusterIP
+ clusterIP: None
+ nodeConfigMountPath: "/opt/druid/conf/druid/cluster/data/historical"
+ replicas: 1
+ livenessProbe:
+ failureThreshold: 10
+ httpGet:
+ path: /status/health
+ port: 8088
+ initialDelaySeconds: 5
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 5
+ readinessProbe:
+ failureThreshold: 20
+ httpGet:
+ path: /druid/historical/v1/loadstatus
+ port: 8088
+ initialDelaySeconds: 5
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 5
+ startUpProbes:
+ failureThreshold: 20
+ httpGet:
+ path: /druid/historical/v1/loadstatus
+ port: 8088
+ initialDelaySeconds: 60
+ periodSeconds: 30
+ successThreshold: 1
+ timeoutSeconds: 10
+ volumeMounts:
+ - mountPath: /druid/data/segments
+ name: cold-volume
+ volumeClaimTemplates:
+ - metadata:
+ name: cold-volume
+ spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 5Gi
+ storageClassName: gp2
+ runtime.properties: |
+ druid.service=druid/cold
+ druid.server.tier=cold
+ druid.server.priority=0
+ druid.processing.buffer.sizeBytes=25000000
+ druid.processing.numThreads=2
+ # Segment storage
+ druid.segmentCache.locations=[{"path":"/druid/data/segments","maxSize":2000000000}]
+ druid.server.maxSize=2000000000
+ extra.jvm.options: |-
+ -Xmx512m
+ -Xms512m
+
+ routers:
+ nodeType: "router"
+ druid.port: 8088
+ kind: Deployment
+ services:
+ - spec:
+ type: ClusterIP
+ clusterIP: None
+ nodeConfigMountPath: "/opt/druid/conf/druid/cluster/query/router"
+ replicas: 1
+ runtime.properties: |
+ druid.service=druid/router
+ # HTTP proxy
+ druid.router.http.numConnections=50
+ druid.router.http.readTimeout=PT5M
+ druid.router.http.numMaxThreads=100
+ druid.server.http.numThreads=100
+ # Service discovery
+ druid.router.defaultBrokerServiceName=druid/broker
+ druid.router.coordinatorServiceName=druid/coordinator
+ # Management proxy to coordinator / overlord: required for unified web console.
+ druid.router.managementProxy.enabled=true
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+ name: druid-cluster
+rules:
+- apiGroups:
+ - ""
+ resources:
+ - pods
+ - configmaps
+ verbs:
+ - '*'
+- apiGroups: ["batch"]
+ resources: ["jobs"]
+ verbs: ["get", "watch", "list", "delete", "create"]
+- apiGroups: [""]
+ resources: ["pods", "pods/log"]
+ verbs: ["get", "watch", "list", "delete", "create"]
+---
+kind: RoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: druid-cluster
+subjects:
+- kind: ServiceAccount
+ name: default
+roleRef:
+ kind: Role
+ name: druid-cluster
+ apiGroup: rbac.authorization.k8s.io