云原生数据立方体:基于Kubernetes的弹性部署与优化实践

摘要

当你在电商平台查看“2024年Q2华北地区手机品类销售额Top10”时,背后的**数据立方体(Data Cube)正在发挥作用——它将分散的用户行为、交易记录、商品信息整合成多维结构,让复杂查询能在秒级返回结果。但传统数据立方体部署方式(如基于Hadoop的静态集群)却面临着资源利用率低(平时空闲、峰值不够)、伸缩缓慢(需要手动调整节点)、维护成本高(集群升级易宕机)**的痛点。

云原生时代,Kubernetes(K8s)的容器编排、弹性伸缩、自愈能力为数据立方体带来了新的解法。本文将带你从0到1理解云原生数据立方体的设计逻辑,掌握基于Kubernetes的部署方案,并通过优化实践和案例研究,让你的数据立方体从“可用”升级到“好用”。

无论你是数据工程师、架构师还是运维人员,读完本文你将学会:

  • 为什么云原生是数据立方体的未来?
  • 如何用Kubernetes部署弹性数据立方体?
  • 如何优化资源、存储、网络以提升性能?

一、什么是云原生数据立方体?

在开始部署之前,我们需要先理清两个核心概念:数据立方体云原生,以及它们的结合点。

1.1 数据立方体:多维分析的“数据超市”

数据立方体是**多维数据分析(OLAP)**的核心模型,它将数据组织成“维度(Dimension)+ 度量(Measure)”的结构,让用户能从不同角度(如时间、地区、产品)分析指标(如销售额、点击量)。

举个例子,一个电商数据立方体可能包含:

  • 维度:时间(年/季/月)、地区(华北/华东/华南)、产品(手机/电脑/家电)、用户(新用户/老用户);
  • 度量:销售额(sum)、订单量(count)、客单价(avg)、转化率(ratio)。

用户可以通过“切片(Slice,固定一个维度,如2024年Q2)”“切块(Dice,固定多个维度,如2024年Q2华北地区手机)”“钻取(Drill-down,从年到月细化)”等操作,快速获取 insights。

传统数据立方体的部署方式通常是静态集群:用Hadoop集群运行Apache Kylin(预计算型)或Presto(实时查询型),节点数量固定,资源分配僵化。这种方式在面对波动负载(如大促期间查询量激增)时,要么因资源不足导致延迟高,要么因资源过剩造成浪费。

1.2 云原生:让数据立方体“活”起来

云原生(Cloud Native)的核心是弹性、可扩展、可自愈,而Kubernetes是云原生的“操作系统”,它通过以下特性解决了传统数据立方体的痛点:

  • 容器化:将数据立方体的组件(如查询引擎、元数据服务)打包成容器,保证环境一致性,避免“本地运行正常,线上崩溃”的问题;
  • 弹性伸缩:通过Horizontal Pod Autoscaler(HPA)或KEDA(基于事件的自动伸缩),根据查询负载动态调整节点数量,峰值时扩容、低谷时缩容;
  • 自愈能力:Kubernetes会自动重启失败的Pod、替换异常节点,保证数据立方体服务的高可用性;
  • 易维护:通过滚动更新(Rolling Update)实现组件升级,不中断服务;通过Namespace隔离多租户,避免资源冲突。

1.3 云原生数据立方体的价值

当数据立方体遇到Kubernetes,产生了1+1>2的效果:

传统数据立方体 云原生数据立方体
静态资源分配,利用率低 动态伸缩,资源利用率提升30%-50%
手动伸缩,延迟高 自动伸缩,峰值响应时间缩短50%
集群升级易宕机 滚动更新,零 downtime 升级
多租户隔离困难 Namespace+资源配额,安全隔离

二、传统数据立方体部署的痛点

为了更深刻理解云原生的价值,我们先回顾传统数据立方体部署的三大痛点:

2.1 资源浪费:“忙时不够,闲时过剩”

传统数据立方体通常部署在固定节点的集群中,比如用10台服务器运行Apache Kylin。在大促期间(如双11),查询量激增,10台服务器无法应对,导致查询延迟从2秒飙升到10秒;而在平时(如凌晨),查询量骤降,10台服务器的CPU利用率只有20%,资源严重浪费。

2.2 伸缩缓慢:“等不及的峰值”

当负载增加时,传统方式需要手动添加节点:运维人员需要登录云平台、创建实例、安装软件、配置集群,整个过程需要30分钟到1小时。而峰值负载往往是突发的(如某款商品突然爆火),等节点添加完成,峰值已经过去,用户早已流失。

2.3 维护麻烦:“升级如拆弹”

传统数据立方体的组件升级(如Kylin从2.x升级到3.x)需要停止整个集群,备份数据,然后逐个节点升级。这个过程中,服务完全中断,影响业务运行。如果升级过程中出现问题(如配置错误),还需要回滚,耗时耗力。

三、基于Kubernetes的云原生数据立方体部署方案

接下来,我们进入实战环节:如何用Kubernetes部署一个弹性、高可用的数据立方体。

3.1 先决条件

在开始之前,你需要准备以下环境和知识:

  • 环境准备
    1. Kubernetes集群(生产级推荐EKS/GKE/AKS,测试用Minikube);
    2. 容器 registry(如Docker Hub、Harbor);
    3. 分布式存储(如AWS S3、阿里云OSS、Ceph,用于存储数据湖中的原始数据);
    4. 监控工具(如Prometheus+Grafana,用于监控资源和查询性能)。
  • 知识储备
    1. Kubernetes基础(Pod、Deployment、StatefulSet、Service、PV/PVC);
    2. 容器化技术(Dockerfile编写、镜像构建);
    3. 数据立方体工具(如Presto Cube、Apache Kylin、ClickHouse Cube,选择适合自己场景的工具)。

3.2 工具选择:根据场景选对数据立方体

不同的数据立方体工具适合不同的场景,以下是三个常用工具的对比:

工具 类型 优势 适合场景
Presto Cube 实时查询 支持跨数据源查询(Hive、S3、MySQL),延迟低(秒级) 实时分析(如用户行为监控)
Apache Kylin 预计算 预计算立方体,查询速度极快(毫秒级) 离线报表(如月度销售额分析)
ClickHouse Cube 高并发 列式存储,支持百万级并发查询 高并发场景(如广告投放分析)

选择建议

  • 如果需要实时分析(如大促期间的实时销量监控),选Presto Cube;
  • 如果需要离线报表(如月度财务分析),选Apache Kylin;
  • 如果需要高并发查询(如广告平台的实时竞价分析),选ClickHouse Cube。

本文以Presto Cube(实时查询场景)为例,讲解部署流程。

3.3 步骤1:容器化数据立方体组件

Presto Cube的核心组件包括:

  • Coordinator:协调器,负责接收查询请求、解析SQL、分配任务给Worker;
  • Worker:工作节点,执行具体的查询任务;
  • Metadata Store:元数据存储,保存立方体的维度、度量、表结构等信息(通常用PostgreSQL或MySQL);
  • Data Lake:数据湖,存储原始数据(如S3中的Parquet文件)。

我们需要将这些组件容器化,编写Dockerfile。

3.3.1 编写Presto Coordinator的Dockerfile
# 使用轻量级基础镜像
FROM alpine:3.18

# 安装Java(Presto需要Java 11+)
RUN apk add --no-cache openjdk11

# 下载Presto发行版(替换为最新版本)
ARG PRESTO_VERSION=0.280
RUN wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/${PRESTO_VERSION}/presto-server-${PRESTO_VERSION}.tar.gz \
    && tar -xzf presto-server-${PRESTO_VERSION}.tar.gz \
    && mv presto-server-${PRESTO_VERSION} /presto \
    && rm presto-server-${PRESTO_VERSION}.tar.gz

# 复制配置文件(coordinator的配置)
COPY presto-coordinator-config /presto/etc

# 设置环境变量
ENV PRESTO_HOME=/presto
ENV PATH=$PATH:$PRESTO_HOME/bin

# 暴露端口(Presto的HTTP端口)
EXPOSE 8080

# 启动命令(作为coordinator运行)
CMD ["presto-server", "run"]
3.3.2 编写Presto Worker的Dockerfile

Worker的Dockerfile与Coordinator类似,只是配置文件不同(需要设置node.environment=worker):

FROM alpine:3.18

RUN apk add --no-cache openjdk11

ARG PRESTO_VERSION=0.280
RUN wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/${PRESTO_VERSION}/presto-server-${PRESTO_VERSION}.tar.gz \
    && tar -xzf presto-server-${PRESTO_VERSION}.tar.gz \
    && mv presto-server-${PRESTO_VERSION} /presto \
    && rm presto-server-${PRESTO_VERSION}.tar.gz

# 复制worker的配置文件
COPY presto-worker-config /presto/etc

ENV PRESTO_HOME=/presto
ENV PATH=$PATH:$PRESTO_HOME/bin

EXPOSE 8080

# 启动命令(作为worker运行)
CMD ["presto-server", "run"]
3.3.3 构建并推送镜像

将Dockerfile和配置文件(presto-coordinator-configpresto-worker-config)放在同一目录下,执行以下命令构建镜像:

# 构建coordinator镜像
docker build -t my-registry/presto-coordinator:v1.0.0 -f Dockerfile.coordinator .

# 构建worker镜像
docker build -t my-registry/presto-worker:v1.0.0 -f Dockerfile.worker .

# 推送镜像到registry
docker push my-registry/presto-coordinator:v1.0.0
docker push my-registry/presto-worker:v1.0.0

3.4 步骤2:部署到Kubernetes

接下来,我们用Kubernetes的资源对象(Deployment、StatefulSet、Service、PV/PVC)部署Presto Cube的组件。

3.4.1 部署Metadata Store(PostgreSQL)

Metadata Store是有状态的(需要持久化元数据),因此用StatefulSet部署:

# presto-metadata-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: presto-metadata
spec:
  replicas: 1
  serviceName: presto-metadata
  template:
    metadata:
      labels:
        app: presto-metadata
    spec:
      containers:
      - name: postgresql
        image: postgres:15-alpine
        ports:
        - containerPort: 5432
        env:
        - name: POSTGRES_DB
          value: "presto"
        - name: POSTGRES_USER
          value: "presto"
        - name: POSTGRES_PASSWORD
          value: "presto123"
        volumeMounts:
        - name: postgres-data
          mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
  - metadata:
      name: postgres-data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: "standard" # 根据集群的存储类调整
      resources:
        requests:
          storage: 10Gi
---
# presto-metadata-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: presto-metadata
spec:
  type: ClusterIP
  selector:
    app: presto-metadata
  ports:
  - port: 5432
    targetPort: 5432
3.4.2 部署Presto Coordinator

Coordinator是无状态的(不需要持久化数据),用Deployment部署:

# presto-coordinator-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: presto-coordinator
spec:
  replicas: 1 # Coordinator通常单实例(可配置高可用)
  selector:
    matchLabels:
      app: presto-coordinator
  template:
    metadata:
      labels:
        app: presto-coordinator
    spec:
      containers:
      - name: presto-coordinator
        image: my-registry/presto-coordinator:v1.0.0
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: "2" # 根据实际需求调整
            memory: "4Gi"
          limits:
            cpu: "4"
            memory: "8Gi"
        env:
        - name: METADATA_DB_URL
          value: "jdbc:postgresql://presto-metadata:5432/presto" # 指向Metadata Service的地址
        - name: METADATA_DB_USER
          value: "presto"
        - name: METADATA_DB_PASSWORD
          value: "presto123"
---
# presto-coordinator-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: presto-coordinator
spec:
  type: NodePort # 测试用NodePort,生产用LoadBalancer或Ingress
  selector:
    app: presto-coordinator
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30080 # 节点端口(可选)
3.4.3 部署Presto Worker(弹性伸缩)

Worker是无状态的,用Deployment部署,并配置HPA实现弹性伸缩:

# presto-worker-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: presto-worker
spec:
  replicas: 3 # 初始副本数
  selector:
    matchLabels:
      app: presto-worker
  template:
    metadata:
      labels:
        app: presto-worker
    spec:
      containers:
      - name: presto-worker
        image: my-registry/presto-worker:v1.0.0
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: "1" # 根据实际需求调整
            memory: "2Gi"
          limits:
            cpu: "2"
            memory: "4Gi"
        env:
        - name: COORDINATOR_URL
          value: "http://presto-coordinator:8080" # 指向Coordinator的地址
        - name: METADATA_DB_URL
          value: "jdbc:postgresql://presto-metadata:5432/presto"
---
# presto-worker-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: presto-worker-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: presto-worker
  minReplicas: 3 # 最小副本数
  maxReplicas: 50 # 最大副本数(根据集群资源调整)
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70 # CPU利用率超过70%时扩容
  - type: Pods
    pods:
      metric:
        name: presto_query_queue_length # 自定义指标(需要Prometheus适配器)
        target:
          type: AverageValue
          averageValue: 10 # 查询队列长度超过10时扩容
3.4.4 部署验证

执行以下命令部署所有组件:

kubectl apply -f presto-metadata-statefulset.yaml
kubectl apply -f presto-metadata-service.yaml
kubectl apply -f presto-coordinator-deployment.yaml
kubectl apply -f presto-coordinator-service.yaml
kubectl apply -f presto-worker-deployment.yaml
kubectl apply -f presto-worker-hpa.yaml

部署完成后,验证组件状态:

# 查看Pod状态(所有Pod应处于Running状态)
kubectl get pods

# 查看Service状态(presto-coordinator的NodePort应为30080)
kubectl get services

# 访问Presto Web UI(http://<节点IP>:30080)

3.5 步骤3:配置弹性伸缩

弹性伸缩是云原生数据立方体的核心优势,我们需要配置HPAKEDA来实现动态伸缩。

3.5.1 基于CPU的伸缩(基础版)

上面的presto-worker-hpa.yaml已经配置了基于CPU利用率的伸缩:当Worker节点的CPU利用率超过70%时,HPA会自动增加副本数;当利用率低于30%时,减少副本数。

3.5.2 基于自定义指标的伸缩(进阶版)

CPU利用率是通用指标,但对于数据立方体来说,查询队列长度查询延迟更能反映负载情况。我们可以用Prometheus收集Presto的自定义指标,再通过Prometheus Adapter将指标暴露给Kubernetes HPA。

步骤1:部署Prometheus和Prometheus Adapter
参考Prometheus官方文档部署Prometheus,然后部署Prometheus Adapter:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/prometheus-adapter/v0.10.0/deploy/manifests/00-namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/prometheus-adapter/v0.10.0/deploy/manifests/prometheus-adapter.yaml

步骤2:配置Presto的指标暴露
Presto默认暴露 metrics 接口(/metrics),我们需要在Prometheus的配置文件中添加Presto的 scrape 任务:

# prometheus-config.yaml
scrape_configs:
- job_name: 'presto'
  static_configs:
  - targets: ['presto-coordinator:8080', 'presto-worker:8080']

步骤3:配置HPA使用自定义指标
修改presto-worker-hpa.yaml,添加基于presto_query_queue_length(查询队列长度)的指标:

metrics:
- type: Pods
  pods:
    metric:
      name: presto_query_queue_length
    target:
      type: AverageValue
      averageValue: 10 # 当平均每个Worker的查询队列长度超过10时扩容
3.5.3 基于事件的伸缩(高级版)

如果你的数据立方体需要应对突发的、可预测的负载(如大促期间的查询量激增),可以用**KEDA(Kubernetes Event-Driven Autoscaling)**实现基于事件的伸缩。例如:

  • 当Kafka队列中的消息数超过阈值时,扩容Worker;
  • 当CloudWatch中的API调用量增加时,扩容Worker。

四、优化实践:从“可用”到“好用”

部署完成后,我们需要通过优化资源、存储、网络等方面,提升数据立方体的性能和稳定性。

4.1 资源分配优化:让资源“物尽其用”

数据立方体的组件对资源的需求不同,我们需要根据其角色调整CPU和内存限制:

  • Coordinator:负责协调查询,需要更多的CPU(用于解析SQL、分配任务),内存需求中等;
  • Worker:负责执行查询,需要更多的内存(用于缓存数据、处理大结果集),CPU需求中等;
  • Metadata Store:负责存储元数据,需要稳定的IO(用SSD存储),内存需求中等。

配置建议

  • Coordinator的资源请求:cpu: 2, memory: 4Gi,限制:cpu: 4, memory: 8Gi
  • Worker的资源请求:cpu: 1, memory: 2Gi,限制:cpu: 2, memory: 4Gi
  • Metadata Store的资源请求:cpu: 1, memory: 2Gi,限制:cpu: 2, memory: 4Gi

4.2 存储优化:减少远程存储访问

数据立方体的查询性能很大程度上取决于数据读取速度,而远程存储(如S3)的延迟较高。我们可以通过以下方式优化存储:

4.2.1 使用数据湖作为原始数据存储

将原始数据存储在数据湖(如S3、OSS)中,数据立方体直接查询数据湖中的文件(如Parquet、ORC),避免数据冗余。例如,Presto可以通过Hive connector查询S3中的Parquet文件:

SELECT 
  time, 
  region, 
  sum(sales) AS total_sales 
FROM hive.default.sales_parquet 
GROUP BY time, region;
4.2.2 缓存常用数据

将常用的立方体数据缓存到Worker节点的本地存储(如EmptyDir或本地SSD)中,减少对远程存储的访问。例如,Presto支持本地缓存(通过presto-cache插件),可以缓存查询结果或数据文件:

# presto-worker-config/cache.properties
cache.enabled=true
cache.base-directory=/tmp/presto-cache
cache.max-size=10GB
4.2.3 使用列式存储格式

将原始数据转换为列式存储格式(如Parquet、ORC),减少数据读取量。例如,Parquet文件的压缩率比CSV高3-5倍,查询时只需要读取所需的列,而不是整个行。

4.3 网络优化:降低通信延迟

当Worker节点数量增加时,Coordinator和Worker之间的通信可能成为瓶颈。我们可以通过以下方式优化网络:

4.3.1 使用高性能CNI插件

选择高性能的CNI插件(如Calico、Cilium),提升Pod间的通信性能。例如,Cilium使用eBPF技术,减少网络转发的开销,比传统的CNI插件(如Flannel)快2-3倍。

4.3.2 部署在同一可用区

将Coordinator和Worker部署在同一可用区(AZ),减少跨区延迟。例如,在AWS EKS中,可以通过节点亲和性配置Pod部署在同一AZ:

# presto-worker-deployment.yaml
spec:
  template:
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: topology.kubernetes.io/zone
                operator: In
                values:
                - us-east-1a # 同一可用区
4.3.3 使用RDMA网络(可选)

如果你的数据立方体需要处理超大规模数据(如PB级),可以使用RDMA(远程直接内存访问)网络,绕过操作系统内核,直接访问远程内存,提升数据传输速度。例如,在阿里云EKS中,可以选择RDMA节点部署Worker。

4.4 监控与日志:快速定位问题

监控和日志是保证数据立方体稳定运行的关键,我们需要收集以下指标:

4.4.1 资源指标
  • CPU利用率:Coordinator和Worker的CPU使用情况;
  • 内存利用率:Coordinator和Worker的内存使用情况;
  • 存储IO:Metadata Store的磁盘读写速度。
4.4.2 查询指标
  • 查询延迟:平均查询时间、95分位查询时间;
  • 查询队列长度:等待执行的查询数量;
  • 查询失败率:失败的查询占比。
4.4.3 伸缩指标
  • 伸缩次数:单位时间内的扩容/缩容次数;
  • 伸缩延迟:从触发伸缩到Pod就绪的时间。

实现方式

  • Prometheus收集指标;
  • Grafana制作 dashboard(示例:https://grafana.com/dashboards/12345);
  • Loki+Grafana收集日志(替代ELK,更轻量);
  • Alertmanager设置报警(如查询延迟超过10秒时发送邮件)。

五、案例研究:电商实时分析场景的落地

为了更直观地展示云原生数据立方体的效果,我们以电商实时用户行为分析场景为例,介绍其落地过程。

5.1 背景

某电商平台需要实时分析用户行为数据(如点击、收藏、加购、购买),支持以下查询:

  • 实时监控:“当前小时华北地区手机品类的点击量Top10”;
  • 趋势分析:“过去24小时内,新用户的购买转化率变化”;
  • 个性化推荐:“根据用户的浏览记录,推荐相似商品”。

传统方案使用Apache Kylin部署在固定集群中,存在以下问题:

  • 实时查询延迟高(超过10秒);
  • 大促期间资源不足,查询失败率达20%;
  • 平时资源利用率低(只有30%)。

5.2 解决方案

选择Presto Cube部署在Kubernetes上,实现弹性伸缩:

  1. 容器化:将Presto Coordinator、Worker、Metadata Store容器化;
  2. 部署:用Deployment部署Coordinator和Worker,用StatefulSet部署Metadata Store;
  3. 弹性伸缩:用HPA根据查询队列长度伸缩Worker(最小3个,最大50个);
  4. 存储优化:将用户行为数据存储在S3(Parquet格式),用Presto的本地缓存加速查询;
  5. 监控:用Prometheus+Grafana监控查询延迟、资源利用率,用Alertmanager设置报警。

5.3 结果

  • 查询延迟:从10秒降到2秒(实时查询);
  • 资源利用率:从30%提高到70%(平时);
  • 查询失败率:从20%降到0%(大促期间);
  • 伸缩效率:从手动30分钟到自动2分钟(峰值时扩容50个Worker)。

5.4 反思

  • 伸缩策略优化:初始的HPA伸缩策略设置为“CPU利用率超过70%扩容”,但大促期间CPU利用率上升较慢,导致扩容延迟。后来调整为“查询队列长度超过10扩容”,伸缩更及时;
  • 缓存优化:初始的缓存大小设置为10GB,缓存命中率只有50%。后来增加到20GB,缓存命中率提升到80%,查询延迟进一步降低;
  • 多租户隔离:平台有多个业务线(如手机、电脑、家电),需要隔离各自的数据立方体实例。后来用Namespace和资源配额实现了多租户隔离,避免了资源冲突。

六、结论与展望

6.1 结论

云原生数据立方体是数据立方体技术与云原生架构的完美结合,它解决了传统数据立方体部署的痛点,带来了以下价值:

  • 弹性:根据负载动态调整资源,避免资源浪费;
  • 高效:实时查询延迟低,支持高并发;
  • 易维护:容器化组件易升级,滚动更新零 downtime;
  • 可扩展:支持多租户,适应业务增长。

6.2 行动号召

如果你正在使用传统数据立方体部署,不妨试试基于Kubernetes的云原生方案。你可以从以下步骤开始:

  1. 选择适合自己场景的数据立方体工具(如Presto Cube、Apache Kylin);
  2. 容器化组件,部署到Kubernetes;
  3. 配置弹性伸缩(HPA或KEDA);
  4. 优化资源、存储、网络。

欢迎在评论区分享你的经验或问题,我们一起讨论!

6.3 展望未来

云原生数据立方体的未来发展方向包括:

  • Serverless化:结合Knative实现更细粒度的伸缩(如按查询请求伸缩);
  • AI优化:用机器学习预测负载,提前扩容,减少伸缩延迟;
  • 多引擎融合:支持Presto、Kylin、ClickHouse等多引擎融合,根据查询类型自动选择最优引擎;
  • 边缘部署:将数据立方体部署在边缘节点(如5G基站),支持低延迟的实时分析(如智能工厂的设备监控)。

七、附加部分

7.1 参考文献

  • Kubernetes官方文档:https://kubernetes.io/docs/
  • Presto官方文档:https://prestodb.io/docs/current/
  • Apache Kylin官方文档:https://kylin.apache.org/docs/
  • 《云原生应用架构》:作者:周阳
  • 《数据立方体技术》:作者:王珊

7.2 作者简介

我是张三,一名资深云原生工程师,专注于数据架构和Kubernetes领域。曾在某大型电商公司负责数据立方体的云原生改造,拥有丰富的实战经验。欢迎关注我的博客(https://zhangsan.dev),或在GitHub(https://github.com/zhangsan)上交流。

声明:本文中的代码示例均为简化版,实际生产环境需要根据具体情况调整。

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐