容器的底层技术:CGroup和NameSpace

无论是容器,还是虚拟机,都依赖于内核中的技术,虚拟机依赖的是 KVM,容器依赖的是 namespace 和 cgroup 对进程进行隔离和资源限制。

容器实现封闭的环境主要要靠两种技术,一种是看起来是隔离的技术,称为namespace(命名空间)。在每个 namespace 中的应用看到的,都是不同的 IP 地址、用户空间、进程 ID 等。另一种是用起来是隔离的技术,称为cgroup(资源限制),即明明整台机器有很多的 CPU、内存,但是一个应用只能用其中的一部分。

CGroup

Docker 提供了这样的功能。Docker 可以限制对于 CPU 的使用,我们可以分几种的方式。

  • Docker 允许用户为每个容器设置一个数字,代表容器的 CPU share,默认情况下每个容器的 share 是 1024。这个数值是相对的,本身并不能代表任何确定的意义。当主机上有多个容器运行时,每个容器占用的 CPU 时间比例为它的 share 在总额中的比例。Docker 为容器设置 CPU share 的参数是 -c --cpu-shares。
  • Docker 提供了 --cpus 参数可以限定容器能使用的 CPU 核数。
  • Docker 可以通过 --cpuset 参数让容器只运行在某些核上

Docker 也能够限制容器内存使用量,下面是一些具体的参数。

  • -m --memory:容器能使用的最大内存大小。
  • –memory-swap:容器能够使用的 swap 大小。
  • –memory-swappiness:默认情况下,主机可以把容器使用的匿名页 swap 出来,你可以设置一个 0-100 之间的值,代表允许 swap 出来的比例。
  • –memory-reservation:设置一个内存使用的 soft limit,如果 docker 发现主机内存不足,会执行 OOM (Out of Memory) 操作。这个值必须小于 --memory 设置的值。
  • –kernel-memory:容器能够使用的 kernel memory 大小。
  • –oom-kill-disable:是否运行 OOM (Out of Memory) 的时候杀死容器。只有设置了 -m,才可以把这个选项设置为 false,否则容器会耗尽主机内存,而且导致主机应用被杀死。

这就是用起来隔离的效果。

容器里面不包含内核,是共享宿主机的内核的。对比虚拟机,虚拟机在 qemu 进程里面是有客户机内核的,应用运行在客户机的用户态。

2a155c6e3436fd772c23465ad6d885ba.jpeg

namespace

隔离

为了隔离不同类型的资源,Linux 内核里面实现了以下几种不同类型的 namespace。

  • UTS,对应的宏为 CLONE_NEWUTS,表示不同的 namespace 可以配置不同的 hostname。
  • User,对应的宏为 CLONE_NEWUSER,表示不同的 namespace 可以配置不同的用户和组。
  • Mount,对应的宏为 CLONE_NEWNS,表示不同的 namespace 的文件系统挂载点是隔离的
  • PID,对应的宏为 CLONE_NEWPID,表示不同的 namespace 有完全独立的 pid,也即一个 namespace 的进程和另一个 namespace 的进程,pid 可以是一样的,但是代表不同的进程。
  • Network,对应的宏为 CLONE_NEWNET,表示不同的 namespace 有独立的网络协议栈。

这些宏可以在代码里进行使用。

还有个最新的   Cgroup namespace。对cgroup视图进行隔离的手段。

Linux 在很早的版本中就实现了部分的 namespace,比如内核 2.4 就实现了 mount namespace。大多数的 namespace 支持是在内核 2.6 中完成的,比如 IPC、Network、PID、和 UTS。还有个别的 namespace 比较特殊,比如 User,从内核 2.6 就开始实现了,但在内核 3.8 中才宣布完成。在内核 4.6 中才添加了 Cgroup namespace

查看namespace

先使用docker启动一个ng

docker run -p 8080:80 -d nginx:1.14-alpine
[root@paas-m-k8s-node-5 ~]# docker ps | grep nginx
afcc1b255416 nginx:1.14-alpine "nginx -g 'daemon of…" 18 seconds ago Up 17 seconds 0.0.0.0:8080->80/tcp angry_gates

使用 docker inspect 命令。可以看到容器在主机上的进程号Pid

docker inspect afcc1b255416
···
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 31704,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-10-12T05:26:02.315208578Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
···


因为,根本上来讲,容器也不过是主机上的一个进程。所以通过ps也可以查看ng的进程

# ps -ef | grep nginx
root 31704 31687 0 13:26 ? 00:00:00 nginx: master process nginx -g daemon off;
100 31752 31704 0 13:26 ? 00:00:00 nginx: worker process


可以看到,进程号都是31704。然后ng的worker进行的pid是31752。

在主机上到/proc/pid/ns 目录里面,可以看到这两个进程的6种namaspace

# ls -l /proc/31704/ns
总用量 0
lrwxrwxrwx 1 root root 0 10月 12 13:31 ipc -> ipc:[4026533228]
lrwxrwxrwx 1 root root 0 10月 12 13:31 mnt -> mnt:[4026533226]
lrwxrwxrwx 1 root root 0 10月 12 13:26 net -> net:[4026533231]
lrwxrwxrwx 1 root root 0 10月 12 13:31 pid -> pid:[4026533229]
lrwxrwxrwx 1 root root 0 10月 12 13:31 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 10月 12 13:31 uts -> uts:[4026533227]


再看看31752的

# ls -l /proc/31752/ns
总用量 0
lrwxrwxrwx 1 100 101 0 10月 12 13:32 ipc -> ipc:[4026533228]
lrwxrwxrwx 1 100 101 0 10月 12 13:32 mnt -> mnt:[4026533226]
lrwxrwxrwx 1 100 101 0 10月 12 13:32 net -> net:[4026533231]
lrwxrwxrwx 1 100 101 0 10月 12 13:32 pid -> pid:[4026533229]
lrwxrwxrwx 1 100 101 0 10月 12 13:32 user -> user:[4026531837]
lrwxrwxrwx 1 100 101 0 10月 12 13:32 uts -> uts:[4026533227]


可以看到他们属于同一个namespace

进入namespace

nsenter指令,可以用来运行一个进程,进入指定的 namespace。

# nsenter --target 31704 --mount --uts --ipc --net --pid -- env --ignore-environment -- /bin/sh


进入 nginx 所在容器的 namespace。现在执行ipaddr 和ps看到的就是nginx容器的相关信息

/ # ipaddr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
370: eth0@if371: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ # ps aux
PID USER TIME COMMAND
1 root 0:00 nginx: master process nginx -g daemon off;
6 nginx 0:00 nginx: worker process
8 root 0:00 /bin/sh
11 root 0:00 ps aux


创建namespace

unshare指令,它会离开当前的 namespace,创建且加入新的 namespace

在进入的命令空间中执行

/ # unshare --mount --ipc --pid --net --mount-proc=/proc --fork /bin/sh
/ # ps aux
PID USER TIME COMMAND
1 root 0:00 /bin/sh
2 root 0:00 ps aux
/ # ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0


进去了一个新的namespace。所以之前的ng进程和主机的eth0都看不到了。

# ls -l /proc/31704/ns
总用量 0
lrwxrwxrwx 1 root root 0 10月 12 13:31 ipc -> ipc:[4026533228]
lrwxrwxrwx 1 root root 0 10月 12 13:31 mnt -> mnt:[4026533226]
lrwxrwxrwx 1 root root 0 10月 12 13:26 net -> net:[4026533231]
lrwxrwxrwx 1 root root 0 10月 12 13:31 pid -> pid:[4026533229]
lrwxrwxrwx 1 root root 0 10月 12 13:31 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 10月 12 13:31 uts -> uts:[4026533227]


操作 namespace的函数

还可以通过函数操作 namespace

clone

clone函数可以创建一个新的进程,并把它放到新的 namespace 中。里面有一个参数 flags,可以设置为 CLONE_NEWUTS、CLONE_NEWUSER、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWNET。 会将 clone 出来的新进程放到新的 namespace 中。

setns

用于将当前进程加入到已有的 namespace 中

unshare

使当前进程退出当前的 namespace,并加入到新创建的 namespace。

clone 和 unshare 的区别是,unshare 是使当前进程加入新的 namespace;clone 是创建一个新的子进程,然后让子进程加入新的 namespace,而当前进程保持不变。

查看CGroup

c就是控制。全称是 Control Group。

cgroups 定义了下面的一系列子系统,每个子系统用于控制某一类资源。

  • cpu 子系统,主要限制进程的 cpu 使用率。
  • cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
  • cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
  • memory 子系统,可以限制进程的 memory 使用量。
  • blkio 子系统,可以限制进程的块设备 io。
  • devices 子系统,可以控制进程能够访问某些设备。
  • net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
  • freezer 子系统,可以挂起或者恢复 cgroups 中的进程。

在 Linux 上,为了操作 Cgroup,有一个专门的 Cgroup 文件系统,我们运行 mount 命令可以查看。

# mount -t cgroup
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)


在/sys/fs/cgroup/下

# ll /sys/fs/cgroup/cpu,cpuacct
总用量 0
-rw-r--r-- 1 root root 0 7月 7 10:09 cgroup.clone_children
--w--w--w- 1 root root 0 7月 7 10:09 cgroup.event_control
-rw-r--r-- 1 root root 0 7月 7 10:09 cgroup.procs
-r--r--r-- 1 root root 0 7月 7 10:09 cgroup.sane_behavior
-r--r--r-- 1 root root 0 7月 7 10:09 cpuacct.stat
-rw-r--r-- 1 root root 0 7月 7 10:09 cpuacct.usage
-r--r--r-- 1 root root 0 7月 7 10:09 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 7月 7 10:09 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 7月 7 10:09 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 7月 7 10:09 cpu.rt_period_us
-rw-r--r-- 1 root root 0 7月 7 10:09 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 7月 7 10:09 cpu.shares
-r--r--r-- 1 root root 0 7月 7 10:09 cpu.stat
drwxr-xr-x 3 root root 0 7月 19 16:23 docker
drwxr-xr-x 5 root root 0 7月 15 16:37 kubepods
-rw-r--r-- 1 root root 0 7月 7 10:09 notify_on_release
-rw-r--r-- 1 root root 0 7月 7 10:09 release_agent
drwxr-xr-x 204 root root 0 10月 12 13:20 system.slice
-rw-r--r-- 1 root root 0 7月 7 10:09 tasks


里面有个docker。容器的资源控制在这里面。

[root@paas-m-k8s-node-5 cpu,cpuacct]# cd docker/
[root@paas-m-k8s-node-5 docker]# ll
总用量 0
drwxr-xr-x 2 root root 0 10月 12 13:26 afcc1b255416ebf7b3303904e5aee41afd281073fe00d5eb065dd9f73e31269b
-rw-r--r-- 1 root root 0 7月 19 16:19 cgroup.clone_children
--w--w--w- 1 root root 0 7月 19 16:19 cgroup.event_control
-rw-r--r-- 1 root root 0 7月 19 16:19 cgroup.procs
-r--r--r-- 1 root root 0 7月 19 16:19 cpuacct.stat
-rw-r--r-- 1 root root 0 7月 19 16:19 cpuacct.usage
-r--r--r-- 1 root root 0 7月 19 16:19 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 7月 19 16:19 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 7月 19 16:19 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 7月 19 16:19 cpu.rt_period_us
-rw-r--r-- 1 root root 0 7月 19 16:19 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 7月 19 16:19 cpu.shares
-r--r--r-- 1 root root 0 7月 19 16:19 cpu.stat
-rw-r--r-- 1 root root 0 7月 19 16:19 notify_on_release
-rw-r--r-- 1 root root 0 7月 19 16:19 tasks
[root@paas-m-k8s-node-5 docker]# docker ps | grep nginx
afcc1b255416 nginx:1.14-alpine "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:8080->80/tcp angry_gates


里面有个afcc1b255416开头的文件夹,其实就是我们前面启动的nginx的docker id。里面存这这个容器的资源控制。

[root@paas-m-k8s-node-5 afcc1b255416ebf7b3303904e5aee41afd281073fe00d5eb065dd9f73e31269b]# ll
总用量 0
-rw-r--r-- 1 root root 0 10月 12 13:26 cgroup.clone_children
--w--w--w- 1 root root 0 10月 12 13:26 cgroup.event_control
-rw-r--r-- 1 root root 0 10月 12 13:26 cgroup.procs
-r--r--r-- 1 root root 0 10月 12 13:26 cpuacct.stat
-rw-r--r-- 1 root root 0 10月 12 13:26 cpuacct.usage
-r--r--r-- 1 root root 0 10月 12 13:26 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 10月 12 13:26 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 10月 12 13:26 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 10月 12 13:26 cpu.rt_period_us
-rw-r--r-- 1 root root 0 10月 12 13:26 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 10月 12 13:26 cpu.shares
-r--r--r-- 1 root root 0 10月 12 13:26 cpu.stat
-rw-r--r-- 1 root root 0 10月 12 13:26 notify_on_release
-rw-r--r-- 1 root root 0 10月 12 13:26 tasks


可以cat查看

cpu.cfs_period_us 是运行周期,cpu.cfs_quota_us 是在周期内这些进程占用多少时间。

还有个关键点是在task文件里

里面放了这个cgroup控制组能控制哪个进程的pid

[root@paas-m-k8s-master-1 172e8d6f1bc755e1bc6ca3a25d10d847a1efa81df4c651f0bb7d36653a32976c]# cat tasks
21706


这个也就是容器进程pid

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/517959.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

闻风丧胆的算法(二)

&#x1f308;个人主页&#xff1a;Rookie Maker &#x1f525; 系列专栏&#xff1a;算法 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于IT的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x1f601; 喜欢的小…

在linux下conda 创建虚拟环境失败的解决方法

报错内容一&#xff1a; Solving environment: failed CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://conda.anaconda.org/conda-forge/noarch/repodata.json> Elapsed: - An HTTP error occurred when trying to retrieve this URL. HTTP errors are…

Redis面试题28道

1、什么是类加载器&#xff0c;类加载器有哪些&#xff1f; 1、什么是类加载器&#xff1f; 类加载器负责加载所有的类&#xff0c;其为所有被载入内存的类生成一个 java.lang.Class 实例对象。 2、类加载器有哪些&#xff1f; JVM 有三种类加载器&#xff1a; &#xff08…

二分答案 蓝桥杯 2022 省A 青蛙过河

有些地方需要解释&#xff1a; 1.从学校到家和从家到学校&#xff0c;跳跃都是一样的&#xff0c;直接看作2*x次过河就可以。 2.对于一个跳跃能力 y&#xff0c;青蛙能跳过河 2x 次&#xff0c;当且仅当对于每个长度为 y 的区间&#xff0c;这个区间内 h 的和都大于等于…

一文彻底搞懂synchronized实现原理

文章目录 1. synchronized 是什么2. synchronized 可以实现的锁3. synchronized 使用4. synchronized 底层原理4.1 作用于同步代码块4.2 作用于方法 1. synchronized 是什么 synchronized 是 Java 中实现线程同步的关键字&#xff0c;用于保护共享资源的访问&#xff0c;确保在…

TCP/IP协议、HTTP协议和FTP协议等网络协议包简介

文章目录 一、常见的网络协议二、TCP/IP协议1、TCP/IP协议模型被划分为四个层次2、TCP/IP五层模型3、TCP/IP七层模型 三、FTP网络协议四、Http网络协议1、Http网络协议简介2、Http网络协议的内容3、HTTP请求协议包组成4、HTTP响应协议包组成 一、常见的网络协议 常见的网络协议…

如何打包一个手机软件

目录 前言&#xff1a; 准备工具&#xff1a; 创建项目&#xff1a; 打包程序&#xff1a; 前言&#xff1a; 我们平时手机上使用的程序&#xff0c;或者电脑上使用的程序都可以由Web程序打包而来的&#xff0c;而打包不是一个.html文件也不是一个.js文件而是一个大型的文…

【AAOS车载系统+AOSP14系统攻城狮入门实战课】:正式上线了(二百零三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Blender怎么样启动默认移动和Cavity效果

在使用Blender的过程中&#xff0c;有一些特殊的技巧很重要。 比如默认地设置blender打开时&#xff0c;就是移动物体&#xff0c;这样怎么样设置的呢&#xff1f; 需要在界面里打开下面的菜单: 这样就找到默认设置的地方&#xff0c;把下面的移动勾选起来&#xff0c;这样点…

使用注意力机制的 LSTM 彻底改变时间序列预测

目录 一、说明二、LSTM 和注意力机制简介三、为什么要将 LSTM 与时间序列注意力相结合&#xff1f;四、模型架构训练与评估 五、验证六、计算指标七、结论 一、说明 在时间序列预测领域&#xff0c;对更准确、更高效的模型的追求始终存在。深度学习的应用为该领域的重大进步铺…

深度学习pytorch实战第P2周:CIFAR10彩色图片识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 零、引言&#xff08;温故而知新&#xff…

C++算法 —— 前缀和

一、【模版】前缀和 1.链接 【模板】前缀和_牛客题霸_牛客网 (nowcoder.com) 2.描述 3.思路 前缀和的思想其实就是一种简单的动态规划&#xff0c;以i位置记录从头位置到i位置的和&#xff0c;然后间接的求一段连续区间的数组和&#xff0c;时间复杂度是O&#xff08;n&…

基于多模态单细胞数据构建共表达网络-MuSeGNN

本篇来自于MuSe-GNN: Learning Unified Gene Representation From Multimodal Biological Graph Data的补充材料。主要目的是从多模态数据中构建共表达网络。作者概述了使用CS-CORE&#xff0c;scTransform和SPARK-X进行预处理步骤和网络构建的算法细节。 目前存在大量用于图谱…

ESP32 引脚分配

请注意&#xff0c;以下引脚分配参考适用于流行的 30 引脚ESP32 devkit v1开发板。 仅输入引脚 GPIO34~39是GPIs–仅输入的管脚。这些引脚没有内部上拉或下拉电阻。它们不能用作输出&#xff0c;因此只能将这些管脚用作输入&#xff1a;GPIO 34、GPIO 35、GPIO 36、GPIO 39 S…

利用nginx-http-flv-module实现三种直播

目录 一、说明 二、目标 三、实现 四、直播地址 一、说明 此文在《流媒体服务器的搭建(支持hls)》《搭建nginx-http-flv-module直播系统》之后编写,很多详细内容需要参考它。 流媒体服务器的搭建(支持hls)

【解读Kubernetes架构】全面指南,带你掌握Kubernetes的设计原理与构成!

了解 Kubernetes 架构&#xff1a;综合指南 前言一、什么是 Kubernetes 架构&#xff1f;1.1、控制平面1.2、工作节点 二、Kubernetes 控制平面组件2.1、kube-api服务器2.2、etcd2.3、kube-scheduler2.4、Kube 控制器管理器2.5、云控制器管理器 &#xff08;CCM&#xff09; 三…

Web APIs简介 Dom

JS的组成 API API 是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节 简单理解&#xff1a;API是给程序员提供的一种工具&#xff0c;以便能更轻松的实现…

车载电子电器架构 —— 工程EOL诊断

车载电子电器架构 —— 工程EOL诊断 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

数据的统计描述

data.info() 提供了关于数据框的简要摘要&#xff0c;包括&#xff1a; 索引类型数据列的数量非空值的数量&#xff08;针对每列&#xff09;每列的数据类型&#xff08;例如&#xff0c;int64, float64, object等&#xff09;内存使用情况提供了哪些列可能包含缺失值&#xff…

flink on yarn

前言 Apache Flink&#xff0c;作为大数据处理领域的璀璨明星&#xff0c;以其独特的流处理和批处理一体化模型&#xff0c;成为众多企业和开发者的首选。它不仅能够在处理无界数据流时展现出卓越的实时性能&#xff0c;还能在有界数据批处理上达到高效稳定的效果。本文将简要…