云原生数据立方体:基于Kubernetes的部署方案
数据立方体和云原生,以及它们的结合点。CPU利用率是通用指标,但对于数据立方体来说,查询队列长度或查询延迟更能反映负载情况。我们可以用Prometheus收集Presto的自定义指标,再通过将指标暴露给Kubernetes HPA。
云原生数据立方体:基于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 先决条件
在开始之前,你需要准备以下环境和知识:
- 环境准备:
- Kubernetes集群(生产级推荐EKS/GKE/AKS,测试用Minikube);
- 容器 registry(如Docker Hub、Harbor);
- 分布式存储(如AWS S3、阿里云OSS、Ceph,用于存储数据湖中的原始数据);
- 监控工具(如Prometheus+Grafana,用于监控资源和查询性能)。
- 知识储备:
- Kubernetes基础(Pod、Deployment、StatefulSet、Service、PV/PVC);
- 容器化技术(Dockerfile编写、镜像构建);
- 数据立方体工具(如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-config、presto-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:配置弹性伸缩
弹性伸缩是云原生数据立方体的核心优势,我们需要配置HPA或KEDA来实现动态伸缩。
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上,实现弹性伸缩:
- 容器化:将Presto Coordinator、Worker、Metadata Store容器化;
- 部署:用Deployment部署Coordinator和Worker,用StatefulSet部署Metadata Store;
- 弹性伸缩:用HPA根据查询队列长度伸缩Worker(最小3个,最大50个);
- 存储优化:将用户行为数据存储在S3(Parquet格式),用Presto的本地缓存加速查询;
- 监控:用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的云原生方案。你可以从以下步骤开始:
- 选择适合自己场景的数据立方体工具(如Presto Cube、Apache Kylin);
- 容器化组件,部署到Kubernetes;
- 配置弹性伸缩(HPA或KEDA);
- 优化资源、存储、网络。
欢迎在评论区分享你的经验或问题,我们一起讨论!
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)上交流。
声明:本文中的代码示例均为简化版,实际生产环境需要根据具体情况调整。
昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐



所有评论(0)