statefulset有状态应用管理
statefulset介绍
StatefulSet(有状态集,缩写为sts)常用于部署有状态的且需要有序启动的应用程序,比如在进行SpringCloud项目容器化时,Eureka的部署是比较适合用StatefulSet部署方式的,可以给每个Eureka实例创建一个唯一且固定的标识符,并且每个Eureka实例无需配置多余的Service,其余Spring Boot应用可以直接通过Eureka的Headless Service即可进行注册。
Eureka的statefulset的资源名称是eureka,
eureka-0 eureka-1 eureka-2
Service:headless service,没有ClusterIP eureka-svc
Eureka-0.eureka-svc.NAMESPACE_NAME eureka-1.eureka-svc
StatefulSet的基本概念
StatefulSet主要用于管理有状态应用程序的工作负载API对象。比如在生产环境中,可以部署ElasticSearch集群、MongoDB集群或者需要持久化的RabbitMQ集群、Redis集群、Kafka集群和ZooKeeper集群等。
和Deployment类似,一个StatefulSet也同样管理着基于相同容器规范的Pod。不同的是,StatefulSet为每个Pod维护了一个粘性标识。这些Pod是根据相同的规范创建的,但是不可互换,每个Pod都有一个持久的标识符,在重新调度时也会保留,一般格式为StatefulSetName-Number。比如定义一个名字是Redis-Sentinel的StatefulSet,指定创建三个Pod,那么创建出来的Pod名字就为Redis-Sentinel-0、Redis-Sentinel-1、Redis-Sentinel-2。而StatefulSet创建的Pod一般使用Headless Service(无头服务)进行通信,和普通的Service的区别在于Headless Service没有ClusterIP,它使用的是Endpoint进行互相通信,Headless一般的格式为:
statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local。
说明:
serviceName为Headless Service的名字,创建StatefulSet时,必须指定Headless Service名称;
0..N-1为Pod所在的序号,从0开始到N-1;
statefulSetName为StatefulSet的名字;
namespace为服务所在的命名空间;
.cluster.local为Cluster Domain(集群域)
假如公司某个项目需要在Kubernetes中部署一个主从模式的Redis,此时使用StatefulSet部署就极为合适,因为StatefulSet启动时,只有当前一个容器完全启动时,后一个容器才会被调度,并且每个容器的标识符是固定的,那么就可以通过标识符来断定当前Pod的角色
StatefulSet注意事项
一般StatefulSet用于有以下一个或者多个需求的应用程序:
需要稳定的独一无二的网络标识符。
需要持久化数据。
需要有序的、优雅的部署和扩展。
需要有序的自动滚动更新。
如果应用程序不需要任何稳定的标识符或者有序的部署、删除或者扩展,应该使用无状态的控制器部署应用程序,比如Deployment或者ReplicaSet。
StatefulSet是Kubernetes 1.9版本之前的beta资源,在1.5版本之前的任何Kubernetes版本都没有。
Pod所用的存储必须由PersistentVolume Provisioner(持久化卷配置器)根据请求配置StorageClass,或者由管理员预先配置,当然也可以不配置存储。
为了确保数据安全,删除和缩放StatefulSet不会删除与StatefulSet关联的卷,可以手动选择性地删除PVC和PV(关于PV和PVC请参考2.2.12节)。
StatefulSet目前使用Headless Service(无头服务)负责Pod的网络身份和通信,需要提前创建此服务。
删除一个StatefulSet时,不保证对Pod的终止,要在StatefulSet中实现Pod的有序和正常终止,可以在删除之前将StatefulSet的副本缩减为0
定义一个StatefulSet资源文件
定义一个简单的StatefulSet的示例如下:
Cat StatefulSet-1.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None #这里可以有IP,也可以无IP,推荐无IP,也就是 无头service
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.2
ports:
- containerPort: 80
name: web
此示例没有添加存储配置,后面的章节会单独讲解存储相关的知识点
创建一个StatefulSet
# 创建一个sts
[root@k8s-m01 yaml-file]# kubectl create -f StatefulSet-1.yaml #-n namespace_name
service/nginx created
statefulset.apps/web created
[root@k8s-m01 yaml-file]# kubectl get sts
NAME READY AGE
web 2/2 3s
[root@k8s-m01 yaml-file]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 73s
web-1 1/1 Running 0 72s
[root@k8s-m01 yaml-file]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 192.168.0.1 <none> 443/TCP 37d
nginx ClusterIP None <none> 80/TCP 2m59s
# <<--没有ClusterIP的service 简称 '无头service'
无头service
演示案例:
cat sts-busybox.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- name: busybox
image: busybox:1.28
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always
#启动进入 busybox ping StatefulSet的web节点,理解如何解析无头service
[root@k8s-m01 yaml-file]# kubectl exec -it busybox -- sh
#nslookup解析
/ # nslookup web-0.nginx
Server: 192.168.0.10
Address 1: 192.168.0.10 kube-dns.kube-system.svc.cluster.local
Name: web-0.nginx
Address 1: 172.16.57.124 web-0.nginx.default.svc.cluster.local
可以看到 可以直接ping通 service的名字
缩容扩容StatefulSet
[root@k8s-m01 yaml-file]# kubectl scale --replicas=3 sts web
statefulset.apps/web scaled
[root@k8s-m01 yaml-file]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-55bbd66bbd-6n9jl 1/1 Running 0 9h
nginx-55bbd66bbd-9gxhf 1/1 Running 0 9h
web-0 1/1 Running 0 6m54s
web-1 1/1 Running 0 6m53s
web-2 1/1 Running 0 4s
[root@k8s-m01 yaml-file]# kubectl scale --replicas=2 sts web
statefulset.apps/web scaled
[root@k8s-m01 yaml-file]# kubectl get pod -o wide|grep web
web-0 1/1 Running 0 29m 172.16.57.124 k8s-n02
web-1 1/1 Running 0 29m 172.17.207.167 k8s-n01
#查看sts标签
[root@k8s-m01 yaml-file]# kubectl get pod --show-labels |grep web
web-0 1/1 Running 0 30m app=nginx,controller-revision-hash=web-6949d64dc8,statefulset.kubernetes.io/pod-name=web-0
web-1 1/1 Running 0 30m app=nginx,controller-revision-hash=web-6949d64dc8,statefulset.kubernetes.io/pod-name=web-1
#过滤标签,找到属于某个标签下的pod
[root@k8s-m01 yaml-file]# kubectl get pod -l controller-revision-hash=web-6949d64dc8
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 32m
web-1 1/1 Running 0 32m
#查看扩缩容过程:
#执行命令监视pod变化动态
kubectl get pod -l controller-revision-hash=web-6949d64dc8 -w
#扩容sts
[root@k8s-m01 ~]# kubectl scale --replicas=5 statefulset web
statefulset.apps/web scaled
#检查状态:
[root@k8s-m01 yaml-file]# kubectl get pod -l controller-revision-hash=web-6949d64dc8 -w
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 42m
web-1 1/1 Running 0 42m
web-2 0/1 Pending 0 0s
web-2 0/1 Pending 0 0s
web-2 0/1 ContainerCreating 0 0s
web-2 1/1 Running 0 2s
web-3 0/1 Pending 0 0s
web-3 0/1 Pending 0 0s
web-3 0/1 ContainerCreating 0 0s
web-3 1/1 Running 0 1s
web-4 0/1 Pending 0 0s
web-4 0/1 Pending 0 0s
web-4 0/1 ContainerCreating 0 0s
web-4 1/1 Running 0 1s
可以看到扩容时,web序号呈现递增更新
#缩容sts
[root@k8s-m01 ~]# kubectl scale --replicas=3 statefulset web
statefulset.apps/web scaled
[root@k8s-m01 yaml-file]# kubectl get pod -l controller-revision-hash=web-6949d64dc8 -w
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 46m
web-1 1/1 Running 0 46m
web-2 1/1 Running 0 115s
web-3 1/1 Running 0 113s
web-4 1/1 Running 0 112s
web-4 1/1 Terminating 0 2m1s
web-4 0/1 Terminating 0 2m1s
web-4 0/1 Terminating 0 2m2s
web-4 0/1 Terminating 0 2m2s
web-3 1/1 Terminating 0 2m3s
web-3 0/1 Terminating 0 2m4s
web-3 0/1 Terminating 0 2m4s
web-3 0/1 Terminating 0 2m4s
可以看到缩容时,web序号呈现倒序缩减
#删除sts查看流程
[root@k8s-m01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 53m
web-1 1/1 Running 0 53m
web-2 1/1 Running 0 21s
[root@k8s-m01 ~]# kubectl delete pod web-2
pod "web-2" deleted
[root@k8s-m01 yaml-file]# kubectl get pod -l controller-revision-hash=web-6949d64dc8 -w
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 53m
web-1 1/1 Running 0 53m
web-2 1/1 Running 0 13s
web-2 1/1 Terminating 0 31s
web-2 0/1 Terminating 0 31s
web-2 0/1 Terminating 0 31s
web-2 0/1 Terminating 0 31s
web-2 0/1 Pending 0 0s
web-2 0/1 Pending 0 0s
web-2 0/1 ContainerCreating 0 0s
web-2 1/1 Running 0 2s
# sts 会保证副本数达到期望值,删除一个副本后会重新拉起一个新的副本
[root@k8s-m01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 55m
web-1 1/1 Running 0 55m
web-2 1/1 Running 0 87s #<=== 重新拉起的新副本
注意:
StatefulSet的pod也会被命名为 pod的name
[root@k8s-m01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 55m
web-1 1/1 Running 0 55m
web-2 1/1 Running 0 87s
[root@k8s-m01 ~]# kubectl exec -it web-0 -- sh
# hostname
web-0
StatefulSet更新策略
1. RollingUpdate 更新策略
#监视 statefulset
kubectl get pod -l statefulset.kubernetes.io/pod-name
#修改nginx版本让它进行滚动更新
[root@k8s-m01 ~]# kubectl edit sts web
#默认更新策略RollingUpdate
updateStrategy:
rollingUpdate:
partition: 0 #不更新小于 N 的副本
type: RollingUpdate
#检查更新过程
[root@k8s-m01 ~]# kubectl get pod -l statefulset.kubernetes.io/pod-name -w
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 8m44s
web-1 1/1 Running 0 8m47s
web-2 1/1 Running 0 8m50s
web-2 1/1 Terminating 0 9m26s
web-2 0/1 Terminating 0 9m27s
web-2 0/1 Terminating 0 9m27s
web-2 0/1 Terminating 0 9m27s
web-2 0/1 Pending 0 0s
web-2 0/1 Pending 0 0s
web-2 0/1 ContainerCreating 0 0s
web-2 1/1 Running 0 2s
web-1 1/1 Terminating 0 9m26s
web-1 0/1 Terminating 0 9m27s
web-1 0/1 Terminating 0 9m27s
web-1 0/1 Terminating 0 9m27s
web-1 0/1 Pending 0 0s
web-1 0/1 Pending 0 0s
web-1 0/1 ContainerCreating 0 0s
web-1 1/1 Running 0 1s
web-0 1/1 Terminating 0 9m25s
web-0 0/1 Terminating 0 9m26s
web-0 0/1 Terminating 0 9m26s
web-0 0/1 Terminating 0 9m26s
web-0 0/1 Pending 0 0s
web-0 0/1 Pending 0 0s
web-0 0/1 ContainerCreating 0 0s
web-0 1/1 Running 0 1s
#可以看到更新过程会先从 web-2 更新,倒序更新
2. Ondelete 更新策略 [适用于灰度发布]
[root@k8s-m01 yaml-file]# kubectl edit sts web
修改:
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
改为:
updateStrategy:
type: OnDelete #修改为OnDelete更新模式并保存,该更新策略是,删除时才会进行更新
#检查策略更新过程
开启一个窗口进行监视pod过程
# kubectl get pod -l statefulset.kubernetes.io/pod-name -w
#此时修改一个镜像版本,看是否像之前一样会被更新
- image: nginx:1.15.1 修改为 - image: nginx:1.15.3
#这时候另一个窗口完全没有变化
#删除pod查看窗口变化:
[root@k8s-m01 yaml-file]# kubectl get pod -l statefulset.kubernetes.io/pod-name
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 8m31s
web-1 1/1 Running 0 8m34s
web-2 1/1 Running 0 8m37s
[root@k8s-m01 yaml-file]# kubectl delete pod web-0
pod "web-0" deleted
#另一个窗口的变化:
[root@k8s-m01 ~]# kubectl get pod -l statefulset.kubernetes.io/pod-name -w
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 11m
web-1 1/1 Running 0 11m
web-2 1/1 Running 0 12m
web-0 1/1 Terminating 0 15m
web-0 0/1 Terminating 0 15m
web-0 0/1 Terminating 0 15m
web-0 0/1 Terminating 0 15m
web-0 0/1 Pending 0 0s
web-0 0/1 Pending 0 0s
web-0 0/1 ContainerCreating 0 0s
web-0 1/1 Running 0 1s
可以看到这时候web-0已经开始发生变化,这时候检查该pod版本是否被更新:
[root@k8s-m01 yaml-file]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-0 1/1 Running 0 64s 172.17.207.176 k8s-n01 <none> <none> #<--被更新
web-1 1/1 Running 0 16m 172.17.207.174 k8s-n01 <none> <none>
web-2 1/1 Running 0 16m 172.16.57.68 k8s-n02 <none> <none>
#检查版本:
kubectl get pod web-0 -o yaml|grep image #也可以用这个命令来看版本
[root@k8s-m01 yaml-file]# kubectl exec -it web-0 -- sh
# nginx -v
nginx version: nginx/1.15.3
[root@k8s-m01 yaml-file]# kubectl exec -it web-1 -- sh
# nginx -v
nginx version: nginx/1.15.2
[root@k8s-m01 yaml-file]# kubectl exec -it web-2 -- sh
# nginx -v
nginx version: nginx/1.15.2
结论:
OnDelete策略只会在pod被删除时进行更新版本,该方法在进行灰度发布时效果较好
yaml中参数 partition含义 #分段更新配置
updateStrategy
rollingUpdate:
partition: 2 #副本大于设置的值时进行更新,也就是分段更新,这里是大于2的副本更新
type: RollingUpdate
partition: 2 #不更新小于 N 的副本
案例:
修改当前statefulset配置添加更新参数:
kubectl edit sts web
找到:
updateStrategy:
type: OnDelete
修改为:
updateStrategy:
type: RollingUpdate
rollingUpdate:
partition: 2
顺便修改镜像版本:
- image: nginx:1.15.3 修改为 - image: nginx:1.15.2
新开窗口监视变化
kubectl get pod -l statefulset.kubernetes.io/pod-name -w
修改镜像版本进行更新测试 partition: 2 参数
#这里可以看到 保留2个副本后,只有web-2进行了自动更新,web-0 web-1都没有更新
[root@k8s-m01 ~]# kubectl get pod -l statefulset.kubernetes.io/pod-name -w
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 21m
web-1 1/1 Running 0 22m
web-2 1/1 Running 0 21m
web-2 1/1 Terminating 0 22m
web-2 0/1 Terminating 0 22m
web-2 0/1 Terminating 0 22m
web-2 0/1 Terminating 0 22m
web-2 0/1 Pending 0 0s
web-2 0/1 Pending 0 0s
web-2 0/1 ContainerCreating 0 0s
web-2 1/1 Running 0 1s
#检查更新结果:
[root@k8s-m01 yaml-file]# kubectl get pod -l statefulset.kubernetes.io/pod-name -o yaml|grep image
- image: nginx:1.15.3
imagePullPolicy: IfNotPresent
image: nginx:1.15.3
imageID: docker-pullable://nginx@sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3
- image: nginx:1.15.3
imagePullPolicy: IfNotPresent
image: nginx:1.15.3
imageID: docker-pullable://nginx@sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
image: nginx:1.15.2
imageID: docker-pullable://nginx@sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424
可以看到只有一个nginx进行了更新到了 1.15.2
这就是 partition 参数的作用,在进行灰度发布时作用较大
statefulset删除
statefulset删除分为两种
级联删除[默认]
删除statefulset时删除pod
非级联删除
删除statefulset时不删除pod
级联删除:
默认级联删除时 会删除statefulset和pod
[root@k8s-m01 yaml-file]# kubectl delete sts web
statefulset.apps "web" deleted
[root@k8s-m01 yaml-file]# kubectl delete svc nginx
service "nginx" deleted
[root@k8s-m01 yaml-file]# kubectl get pod -l statefulset.kubernetes.io/pod-name
No resources found in default namespace. #删除后 web这个sts pod 已经没了
非级联删除:
[root@k8s-m01 yaml-file]# kubectl create -f StatefulSet-1.yaml
service/nginx created
statefulset.apps/web created
[root@k8s-m01 yaml-file]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 7m
web-1 1/1 Running 0 5m
非级联删除:
[root@k8s-m01 yaml-file]# kubectl delete sts web --cascade=orphan
statefulset.apps "web" deleted
检查:
[root@k8s-m01 yaml-file]# kubectl get sts
No resources found in default namespace.
#此时这些pod会变成 孤儿pod,可以删除并不会被重建
[root@k8s-m01 yaml-file]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 7m
web-1 1/1 Running 0 5m
非级联删除时,删除了sts 但是pod并未被删除
#kubernetes 1.24以前版本参数 --cascade=false
#kubernetes 1.24以后版本参数 --cascade=orphan
statefulset有状态应用管理的更多相关文章
- k8s入坑之路(15)kubernetes共享存储与StatefulSet有状态
共享存储 docker默认是无状态,当有状态服务时需要用到共享存储 为什么需要共享存储: 1.最常见有状态服务,本地存储有些程序会把文件保存在服务器目录中,如果容器重新启停则会丢失. 2.如果使用vo ...
- Java并发框架——同步状态的管理
整个AQS框架核心功能都是围绕着其32位整型属性state进行,一般可以说它表示锁的数量,对同步状态的控制可以实现不同的同步工具,例如闭锁.信号量.栅栏等等.为了保证可见性此变量被声明为volatil ...
- Terraform状态State管理,让变更有记录
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 简介 最近工作中用到了Terraform,权当学习记录一下,希望能帮助到其它人. Terraform系列文章如下: Ter ...
- Kubernetes有状态应用管理——PetSet
目录贴:Kubernetes学习系列 1.介绍 在Kubernetes中,大多数的Pod管理都是基于无状态.一次性的理念.例如Replication Controller,它只是简单的保证可提供服务的 ...
- Kubernetes基础:查看状态、管理服务
目标 了解Kubernetes Pod 了解Kubernetes Node 学习如何调试部署问题 了解如何通过Service暴露应用 Kubernetes Pods 在Kubernetes中创建一个D ...
- linux系统状态查看/管理相关命令
系统状态查看命令: w 查看用户 top 系统进程监控 uptime 查看某台服务器运行了多久 htop 更加先进的交互式监控工具(需要安装) iotop 监控并实时显示磁盘IO输入和输出和程序进程( ...
- flux,redux,vuex状态集管理工具之间的区别
一:redux和flux的区别 1)redux是flux中的一个实现 2))在redux中我们只能定义一个store,在flux中我们可以定义多个 3)在redux中,store和dispatch都放 ...
- Java并发编程(01):线程的创建方式,状态周期管理
本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...
- ViewPager部分源码分析二:FragmentManager对Fragment状态的管理完成ViewPager的child添加或移出
ViewPager维护child代码流程: 注:PagerAdapter 使用的是FragmentPagerAdapter类或者它的子类. viewPager.populate(): void pop ...
- Master的注册机制和状态改变管理解密
本课主题 Master 接收 Worker, Driver, Application 注册 Master 处理 Driver 狀态变换 Master 处理 Executor 狀态变换 Master 接 ...
随机推荐
- 如何用vsftpd实现用户不同权限:只能下载,可上传,管理权限等 [仅供参考未亲测]
如何用vsftpd实现用户不同权限:只能下载,可上传,管理权限等 2007-01-29 10:20:09 分类: LINUX 前提条件: 必须安装包:vsftpd-2.0.1-5 ...
- 重新整理.net core 计1400篇[三] (.net core 如何源代码调试和查看源码 )
前言 本来这里是写源代码的,因为vs没有那么容易调试查看到源代码,所以先把调试源代码和查看源代码弄完. 正文 需要修改一些vs配置,这个vs也是有要求的,要vs2017. 那么你还需要加载远程符号. ...
- 多python版本的库安装和导库
同时安装多python版本的,使用pip安装python的库,以及导出python库列表及版本,使用导出的库列表批量进行新环境的库安装. 1.同时安装python2和python3时,要进行pip安装 ...
- 【vue】纯前端图形验证码实现
[vue]纯前端图形验证码实现 感觉人不能在SQL里面淹死,得看看别的东西了 因为是上班摸鱼偷摸搞的,所以人比较懒,很多东西也懒得修修改改,直接放在一个html文件下了 页面如下 js的生成图形逻辑是 ...
- FasterViT:英伟达提出分层注意力,构造高吞吐CNN-ViT混合网络 | ICLR 2024
论文设计了新的CNN-ViT混合神经网络FasterViT,重点关注计算机视觉应用的图像吞吐能力.FasterViT结合CNN的局部特征学习的特性和ViT的全局建模特性,引入分层注意力(HAT)方法在 ...
- 力扣141(Java)-环形链表(简单)
题目: 给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,评测系统内部使用整数 pos ...
- 力扣1113(MySQL)-报告的记录(简单)
题目: 动作表:Actions 此表没有主键,所以可能会有重复的行. action 字段是 ENUM 类型的,包含:('view', 'like', 'reaction', 'comment', 'r ...
- 跃居AppStore第一!X-Engine如何支撑钉钉数据量激增
钉钉作为国内领先的企业IM工具,在中国有超过亿级别的用户.随着新型冠状病毒肺炎疫情的爆发,大量的企业员工选择了soho模式,企业办公协同工具的需求瞬间爆发. 钉钉作为中国企业办公IM的首选应用,不仅具 ...
- Delta Lake基础介绍(商业版)
简介:介绍 Lakehouse 搜索引擎的设计思想,探讨其如何使用缓存,辅助数据结构,存储格式,动态文件剪枝,以及 vectorized execution 达到优越的处理性能. 作者:李洁杏,Da ...
- AI圈内卷?天池团聚请来专家集体“问诊”
简介: 近期杭州云栖大会上出现了一个"数据博物馆",最吸引眼球的"展品",竟是行业大规模开源数据集.不仅数量多达上百个,还覆盖零售.文娱.工业.医疗.自然科学 ...