ClickHouse(11)ClickHouse合并树MergeTree家族表引擎之SummingMergeTree详细解析

目录
  • 建表语法
  • 数据处理
    • 汇总的通用规则
    • AggregateFunction 列中的汇总
    • 嵌套结构数据的处理
  • 资料分享
  • 参考文章

SummingMergeTree引擎继承自MergeTree。区别在于,当合并SummingMergeTree表的数据片段时,ClickHouse会把所有具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值。如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度。

一般SummingMergeTree和MergeTree一起使用。例如,在准备做报告的时候,将完整的数据存储在MergeTree表中,并且使用SummingMergeTree来存储聚合数据。这种方法可以避免因为使用不正确的主键组合方式而丢失有价值的数据。

建表语法

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = SummingMergeTree([columns])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

创建SummingMergeTree表的参数中,与MergeTree不同的是[columns]。columns包含了将要被汇总的列的列名的元组。属于可选参数。所选的列必须是数值类型,并且不可位于主键中。

如果没有指定columns,ClickHouse会把所有不在主键中的数值类型的列都进行汇总。

其他的参数与MergeTree表是一致。

MergeTree表引擎的解析可以参考ClickHouse(09)ClickHouse合并树MergeTree家族表引擎之MergeTree详细解析

-- 建表
CREATE TABLE summtt
(
    key UInt32,
    value UInt32
)
ENGINE = SummingMergeTree()
ORDER BY key;

-- 插入数据
INSERT INTO summtt Values(1,1),(1,2),(2,1);

-- 查询数据
-- ClickHouse可能不会完整的汇总所有行,因此在查询中使用了聚合函数sum和GROUP BY子句。
-- ClickHouse定期合并插入的数据片段,并在这个时候对所有具有相同主键的行中的列进行汇总,将这些行替换为包含汇总数据的一行记录。
SELECT key, sum(value) FROM summtt GROUP BY key;

-- 查询结果
┌─key─┬─sum(value)─┐
│   2 │          1 │
│   1 │          3 │
└─────┴────────────┘

数据处理

当数据被插入到表中时,他们将被原样保存。ClickHouse定期合并插入的数据片段,并在这个时候对所有具有相同主键的行中的列进行汇总,将这些行替换为包含汇总数据的一行记录。

ClickHouse会按片段合并数据,以至于不同的数据片段中会包含具有相同主键的行,即单个汇总片段将会是不完整的。因此,聚合函数sum()和GROUP BY子句应该在(SELECT)查询语句中被使用,如上面的例子。

汇总的通用规则

  • 列中数值类型的值会被汇总,进行sum操作。这些列的集合在参数columns中被定义。
  • 如果用于汇总的所有列中的值均为0,则该行会被删除。
  • 如果列不在主键中且无法被汇总,则会在现有的值中任选一个。
  • 主键所在的列中的值不会被汇总。

AggregateFunction 列中的汇总

对于AggregateFunction类型的列,ClickHouse根据对应函数表现为AggregatingMergeTree引擎的聚合。

嵌套结构数据的处理

表中可以具有以特殊方式处理的嵌套数据结构。

如果嵌套表的名称以 Map 结尾,并且包含至少两个符合以下条件的列:

  • 第一列是数值类型(Int,Date,DateTime),称之为key,
  • 其他的列是可计算的(Int,Float32/64),称之为(values...),

然后这个嵌套表会被解释为一个key=>(values...)的映射,当合并它们的行时,两个数据集中的元素会被根据key合并为相应的(values...)的汇总值。如下面的例子。

[(1, 100)] + [(2, 150)] -> [(1, 100), (2, 150)]
[(1, 100)] + [(1, 150)] -> [(1, 250)]
[(1, 100)] + [(1, 150), (2, 150)] -> [(1, 250), (2, 150)]
[(1, 100), (2, 150)] + [(1, -100)] -> [(2, 150)]

请求数据时,使用sumMap(key,value)函数来对Map进行聚合。对于嵌套数据结构,你无需在列的元组中指定列以进行汇总。

资料分享

ClickHouse经典中文文档分享

参考文章

  • ClickHouse(01)什么是ClickHouse,ClickHouse适用于什么场景
  • ClickHouse(02)ClickHouse架构设计介绍概述与ClickHouse数据分片设计
  • ClickHouse(03)ClickHouse怎么安装和部署
  • ClickHouse(04)如何搭建ClickHouse集群
  • ClickHouse(05)ClickHouse数据类型详解
  • ClickHouse(06)ClickHouse建表语句DDL详细解析
  • ClickHouse(07)ClickHouse数据库引擎解析
  • ClickHouse(08)ClickHouse表引擎概况
  • ClickHouse(09)ClickHouse合并树MergeTree家族表引擎之MergeTree详细解析
  • ClickHouse(10)ClickHouse合并树MergeTree家族表引擎之ReplacingMergeTree详细解析
  • ClickHouse(11)ClickHouse合并树MergeTree家族表引擎之SummingMergeTree详细解析

本文来自博客园,作者:张飞的猪,转载请注明原文链接:http://www.cnblogs.com/the-pig-of-zf/p/17056317.html

公众号:张飞的猪大数据分享,不定期分享大数据学习的总结和相关资料,欢迎关注。

个人网站"张飞的猪编程工作室"链接: http://zhangfeidezhu.com

本文转载于网络 如有侵权请联系删除

相关文章

  • Linux的相对路径和绝对路径、cd命令、创建和删除目录、rm命令

    相对路径和绝对路径:相对路径就是相对当前所在目录来说的路径,绝对路径就是相对/(根)目录来说的路径。相对路径不以/开头,绝对路径以/开头,./abc是相对路径(./表示当前路径),/abc是绝对路径。但是:~/abcd/123/是一个绝对路径,因为~符号表示的是用户的家目录,所以这个是绝对路径。 例如ls命令后面跟的这个路径是相对于root目录的:绝对路径:pwd可以查看当前在哪个目录下:echo$PWD也可以查看当前在哪个目录下:whoami用于查看当前用户的名字:id可以查看uid等:cd命令: cd是changedirectory的缩写,就是改变目录的意思,可以使用这个命令进入文件目录:  cd如果不加任何参数的话,就会进入到用户的家目录下,如果你当前用户是root,那么就会进入到root目录下: cd后面加目录名就可以进入哪个目录下:cd-命令可以回到上一次所在的目录下:cd~命令可以进入到当前用户的家目录下,和cd的意义是一致的:cd.进入当前目录:cd..进入到上一层目录:创建和删除目录: mkdir是makedirectory的缩写,这个命令是用来创建一个目录的: dat

  • SAP Spartacus layout设计原理

    layout包含sections,sections包含slot.文件路径:C:\Code\SPA\spartacus\projects\storefrontlib\src\recipes\config\b2c-layout-config.tsLayout,section和slot的定义都在b2c-layout-config.ts里:import{LayoutConfig}from'../../layout/config/layout-config'; exportconstb2cLayoutConfig:LayoutConfig={ //deferredLoading:{ //strategy:DeferLoadingStrategy.DEFER, //intersectionMargin:'50px', //}, layoutSlots:{ header:{ lg:{ slots:[ 'SiteContext', 'SiteLinks', 'SiteLogo', 'Sear

  • 从0到1开发测试平台(十二)首页面home的编写

    前言后端和前端的基础架构都已经搭建完成,为了相对容易理解,上手快,小白也能上手,而且本身就是公司内部系统,也没太大必要做的很完美,所以在我们初版系统的架构里很多东西都简化了,比如注册中心,网关代理,配置中心,负载均衡,授权认证,用户权限控制到页面按钮,消息队列,缓存,elk等都未引入我们初版系统的架构里。如果有时间后面会讲下JmeterEngine相关api的使用、android原生应用mvp及mvvc架构搭建及React-native构建android项目。我们这篇文章就是关于home页面的编写实现,对于home页面比较主要的两个组件就是container和menu了,其中container较为简单,menu一般要配合后台的权限校验来决定展示的内容,由于我们没做权限控制功能,menu菜单显示直接写死了,所以也不复杂了。 |在components目录下新建Home组件<template> <div> Home </div> </template> <script> exportdefault{ } </script&

  • 清除IE10下input的(X)和密码输入框的眼睛图标

    当我们做一个简单的输入框的时候,浏览器会给我们提供一些我们其实不需要的便捷方式,例如下面的这个:还有下面这个:点击X的时候可以清除输入的文本,点击小眼睛的时候可以看到密码;效果如下:其实我用到的时候还是觉得IE..嗯...很人性化,直到项目里面要求不准看到的时候我才发觉我想的太天真,赶紧给我滚,想去掉但是去不掉,哎,可能IE和老罗是一个脾气,功能你可以不要,但是我必须要做,嗯,想法不错,最后我还是成功的被你圈粉了...好吧跑远了,我们回到正题,真去掉呢?很简单的,两行代码搞定,上代码:<!DOCTYPEhtml> <html> <head> <metacharset="UTF-8"> <title></title> </head> <style> input::-ms-clear{display:none;} input::-ms-reveal{display:none;} </style> <body> 文本:<

  • python套路-高级特性之生成器

    先看几个例子。例子一:生成一个1~10的整数列表list=[1,2,3,4,5,6,7,8,9,10]复制或者,list=range(1,11)复制例子二:生成一个1~10的每个整数的平方数的列表list=[] fornuminrange(1,11): list.append(num*num)复制虽然确实是实现了预期的需求,但是需要通过多行代码才能实现,过程非常繁琐,一点都不pythonic。为了实现类似需求,python提供了一些高级特性来简化,就是列表推导式。列表推导式列表推导式(ListComprehensions)是python内置的非常简单且强大的可以用来轻松创建列表(List)的方法。例子三:用列表推导式创建1~10的所有整数的平方数的列表>>>list=[num*numfornuminrange(1,11)] >>>list [1,4,9,16,25,36,49,64,81,100]复制可见,列表推导式的书写规则是,生成的元素放在语句前面,紧跟着的是for循环。而且,在列表推导式的循环后面加上条件判断。列子四:创建1~10的所有偶数平方

  • 【DB笔试面试688】在Oracle中,跟踪会话执行语句的方法有哪几种?

    ♣题目部分在Oracle中,跟踪会话执行语句的方法有哪几种?♣答案部分 因为TRACE的目标范围不同,所以导致必须使用不同的方法。若作用于数据库全局的,则改初始化参数。若只作用于当前会话的,则就用ALTERSESSION命令。若作用于其它会话的,则就用DBMS_SYSTEM包。① SQL_TRACE参数设置:非常传统的方法SQL_TRACE可以作为初始化参数在全局启用,也可以通过命令行方式在具体会话启用。在参数文件(PFILE/SPFILE)中指定:SQL_TRACE=TRUE或ALTERSYSTEMSETSQL_TRACE=TRUE;。通过在全局启用SQL_TRACE可以跟踪到所有后台进程及所有用户进程的活动,通过跟踪文件的实时变化,可以清晰地看到各个进程之间的紧密协调。需要注意的是,在全局启用SQL_TRACE会产生大量trace文件,很容易耗尽磁盘空间,这通常会导致比较严重的性能问题,所以在生产环境中要谨慎使用,并且及时关闭。在大多数时候使用SQL_TRACE跟踪的都是当前会话的进程。通过跟踪当前进程可以发现当前操作的后台数据库递归活动,这在研究数据库新特性时尤其有效,在研究SQ

  • 从三大神经网络,测试对比TensorFlow、MXNet、CNTK、Theano四个框架

    选自datasciencecentral机器之心编译参与:蒋思源本文比较了Keras支持的主流深度学习框架性能,包括TensorFlow、CNTK、MXNet和Theano,作者希望通过使用同一模型和不同的Keras后端,而测试不同框架在不同类型任务中的性能。本文通过五个任务分别测试了MLP、CNN和RNN模型,机器之心不仅对该试验进行了介绍,同时还使用Keras(TensorFlow后端)在MNIST数据集上试运行了CNN。如果我们对Keras在数据科学和深度学习方面的流行还有疑问,那么考虑一下所有的主流云平台和深度学习框架的支持情况就能发现它的强大之处。目前,Keras官方版已经支持谷歌的TensorFlow、微软的CNTK、蒙特利尔大学的Theano,此外,AWS去年就宣布Keras将支持ApacheMXNet,上个月发布的MXNet0.11就新增CoreML和Kerasv1.2的支持。不过到目前为止MXNet好像只支持Kerasv1.2.2而不是最新版2.0.5。尽管我们可以使用任何Keras所支持的后端部署模型,但开发者和方案架构师应该了解Keras作为各深度学习库的高级AP

  • 技术干货:前端图形化技术简介(上)

    Canvas与SVG前端图形化技术,主要包括Canvas绘图和SVG绘图两类。Canvas早在十几年前就被火狐浏览器引入。Canvas通过Canvas.getContext(2d/3d)获得绘图上下文,采用绘制路径、填充路径、描边路径等操作绘制像素图片,并带有一定的矩阵旋转和偏移功能,总体与传统绘图流程一致。经过几年的发展,Canvas具备了3D上下文接口,其背后的WebGL,实际是OpenGL-ES的一个子集,可使用GPU渲染内容。实际上,通过改变视觉场的perspective,我们可以在3D的场景中获得一个伪2D的视角,实现2D的图形绘制的GPU加速。前几年这种方式甚为流行,但是苦于兼容性的问题,未被大量推广。SVG图像是一种矢量图,采用XML方式标记和绘制。由于SVG是一种ML,所以操作、调试都非常容易,并且可以直接交互。与Canvas相比,SVG的最大不同在于:它不但是View,而且也是Model,算是一个真正的ViewModel。所以,SVG的体积与数据量级有直接关系,而Canvas所形成的图片体积只与尺寸有关,是一个恒定值。所以当我们面临一个未知场景的时候,使用SVG或Ca

  • 业务代码的救星——Java 对象转换框架 MapStruct 妙用

    简介 在业务项目的开发中,我们经常需要将Java对象进行转换,比如从将外部微服务得到的对象转换为本域的业务对象domainobject,将domainobject转为数据持久层的dataobject,将domainobject转换为DTO以便返回给外部调用方等。在转换时大部分属性都是相同的,只有少部分的不同,如果手工编写转换代码,会很繁琐。这时我们可以通过一些对象转换框架来更方便的做这件事情。 这样的对象转换框架有不少,比较有名的有ModelMapper和MapStruct。它们所使用的实现技术不同,ModelMapper是基于反射的,通过反射来查找实体对象的字段,并读取或写入值,这样的方式实现原理简单,但性能很差。与ModelMapper框架不同的是,MapStruct是基于编译阶段代码生成的,生成的转换代码在运行的时候跟一般的代码一样,没有额外的性能损失。本文重点介绍MapStruct。 业务场景 假设现在有这么个场景,从数据库查询出来了一个user对象(包含id,用户名,密码,手机号,邮箱,角色这些字段)和一个对应的角色对象role(包含id,角色名,角色描述这些字段),现在在c

  • 015、动态导入模块py文件

      结构层级如下:   aa.py文件如下: defaa(): print("aa") aa_var="我是aa.py"复制   bb.py文件如下: defbb(): print("bb") bb_var="我是bb.py"复制   run_test.py文件如下: importimportlib module_name='a_computer.case_data.preset_data.aa'#模块名的字符串 aa_py=importlib.import_module(module_name)#导入的就是需要导入的那个metaclass aa_py.aa() print(aa_py.aa_var) module_name='e_ComplexTest.case_0001_DPD2135A_StressTest.data.bb'#模块名的字符串 bb_py=importlib.import_module(module_name)#导入的就是需要导入的那个metaclass bb_py.bb() print(bb_py.

  • 两个文本文件某一单列的交集

    1.txt有一列,不都在2.txt里2.txt有几列,第一列的值里可能有1.txt的值,中英文大小写各种符号都可能有除了#。列分隔符是#。awk-F'[#]''BEGIN{IGNORECASE=1}NR==FNR{a[NR]=$1}NR>FNR{for(varina){if(a[var]==$1){printa[var];break;}}}'1.txt2.txt 解释如下:-F'[#]'指定分隔符BEGIN语句忽略了英文大小写NR==FNR意味着在读第一个文件。NR是从1的第一行一口气数到2的最后一行。而FNR是从每个文件的头数到尾,下个文件重新开始数。所以第一个文件这俩值相等,到第二个文件NR就大了。for(varina)是awk里遍历数组的独门方式。a[var]是值,var是下标变量。awk用的是字符串做下标,即便是数字,也会自动转换成字符串。有时可以用巧妙的 a[$1]=$1如果这列的字符串不重复的话就有资格做下标啦。break一旦有匹配的就跳出来不再废话了   Niushop电商系统 开牛店的第一选择 性价比之王 Niushop电商系

  • shell 快速移动,快捷操作

    ctr+h往后删除一字符 ctr+d往前删除一字符 ctr+b光标往前 ctr+f往后ctr+u删除到最前ctr+K删除到最后ctr+a光标到最前ctr+e光标到最后ctr+p往上一条历史命令ctr+n往下一条命令    

  • 不是技术牛人,如何拿到国内IT巨头的Offer

    不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰。看看这些牛人,NOI金牌,开源社区名人,三年级开始写Basic...在跪拜之余我们不禁要想,和这些牛人比,作为绝大部分技术屌丝的同学们,是否真的与国内IT巨头遥不可及呢? 当你打开这个帖子的时候,我已经默认你是此文的目标读者,也就是想进入国内一流互联网企业的非牛人应届生。 你不需要拿NOI的奖,无需是开源社区名人,也用不着发过牛逼的SCI论文。(没错,笔者就是这样的技术屌丝) 请记住,校园招聘,应聘的绝大部分人都只是才出象牙塔的毛头小子。企业需要的是你们的潜力与激情。牛人总是凤毛麟角的。程序员笔试面试的经验贴、经验书不计其数。本文不会教你如何具体的解题,但是会告诉你,你距离你的梦想究竟有多远,以及如何去缩短这个距离。笔者仅仅以自己的亲身经验为依据,将国内IT巨头按Offer到手难度降序排列,大致分为如下3个梯队:T1:百度,阿里,腾讯,...T2:网易,迅雷,完美时空,360,金山,...T3:华为,中兴,联发科,...Tx:垄断类IT国企。如中国移动,...T1主要是BAT三巨头。他们对学生的技术能力与综

  • 微信公众号 chinaxdt 的 解压密码 mima

      关于密码:解压密码获取方式第一步关注微信号“chinaxdt”第二步发送信息“mima”即可获取自动回复解压密码 这个 chinaxdt的微信公众号已经失效,所以大家也不用去加了,密码我这告诉大家。 资源解压密码为:www.ndi.com.cn   赶快去解压你已经幸苦下载的资源吧  

  • 设计原则

    类应该对扩展开发,对修改关闭。 为了交互对象之间的松耦合设计而努力。 针对接口编程,不针对实现编程。 多用组合,少用继承。 抽象。 封装变化。 找出程序中会变化的方面,然后将其和固定不变的方面分离

  • Ubuntu20.04出现段错误核心已转储问题解决方案

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 作为一个半路出家的linuc用户,coredump这个问题太让人抓狂了,网上找了好多都是不全面,不适应或者看不懂;现在终于解决了,记录一下防止以后出现还是无解,同时也分享给大家,希望大家能少踩一些坑。 1.什么是段错误 coredump又叫核心转储,当程序运行过程中发生异常,程序异常退出时,由操作系统把程序当前的内存状况存储在一个core文件中,叫coredump.(linux中如果内存越界会收到SIGSEGV信号,然后就会coredump)。产生段错误的原因大致上有三类:访问不存在的内存地址、访问系统保护的内存地址和访问只读的内存地址。 2.解决方案 网上的资料虽然比较乱,但是也提供了一个解决问题的思路: (1)设置core文件,找到段错误生成的core文件 (2)利用core文件,使用GDB测试找到问题所在 3.解决过程 先看问题: 3.1生成Core文件 3.1.1使用ulimit-a命令查看core文件大小限制 可以看到corefilesize的大小为0,文件根本装不进,需要使用ulimit-cunlimited修改这个文

  • php计算坐标距离

    publicfunctiongetDistance($lng1,$lat1,$lng2,$lat2) { $EARTH_RADIUS=6378.137; $radLat1=$this->rad($lat1); $radLat2=$this->rad($lat2); $a=$radLat1-$radLat2; $b=$this->rad($lng1)-$this->rad($lng2); $s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2))); $s=$s*$EARTH_RADIUS*1000; if($s<1000)returnround($s,2).'米'; if($s>=1000)returnround($s/1000,2).'公里'; } privatefunctionrad($d) { return$d*M_PI/180.0; }复制   ╰︶﹉⋛⋋⊱⋋๑๑⋌⊰⋌⋚﹉︶╯

  • ICPC2020上海站F Fountains 状压

    题意:给定长为\(n\)的序列,定义区间\([l,r]\)的权值\(C(l,r)\)为\([l,r]\)中所有元素的和,现在试选择\(k\)个区间\([l_i,r_i](1\leql_i\leqr_i\leqn)\),使得 $$\sum_{1\leqL\leqR\leqn}[C(L,R)-\max_{L\leql_i\leqr_i\leqR}C(l_i,r_i)]$$最小,对\(k=1,2,3...,n*(n+1)/2\)作出回答,且\(n\leq9\) 不妨假定已经选择\(k\)个区间,考虑怎么使得权值和最小 显然,将\(k\)个区间按权值大小从大到小排序,所有的\([L,R]\)区间会按此顺序选择第一个被它包含的区间\([l_i,r_i]\) 换而言之,即将\(k\)个区间从大到小排序后,依次考虑,在仍未选择的区间\([L,R]\)中,所有能选择\([l_i,r_i]\)的区间一定会选择此区间 可以\(dp\),状态为已经选择了\(k\)个区间,及仍未选择的区间 仍未选择的区间可以通过\((r_1,r_2,...,r_n)\)表示,其中\(r_i\)表示\([i,i],[i,i+

  • dsu on tree 树上启发式合并 学习笔记

    近几天跟着dreagonm大佬学习了\(dsu\on\tree\),来总结一下: \(dsu\on\tree\),也就是树上启发式合并,是用来处理一类离线的树上询问问题(比如子树内的颜色种数)的不二法宝。它不仅好想好写,还有着\(O(nlogn)\)的优秀时间复杂度(划重点)。 结合一道例题来讲吧: CF600ELomsatgelral 题目大意: 一棵树有\(n(n\leqslant10^5)\)个结点,每个结点都是一种颜色,每个颜色有一个编号,求树中每个子树的最多的颜色编号的和,对于每个结点都输出答案。 首先我们考虑暴力怎么做:首先\(dfs\)每一个结点,用一个\(cnt\)数组,记录在当前子树中各个颜色出现的次数,遍历子树并更新\(cnt\)数组和答案,最后清空数组。 这样的复杂度是\(O(n^2)\)的,显然过不去。仔细想一下上面暴力的过程,我们会发现其实在清除的时候,最后一棵子树是没必要清的,我们可以把它对\(cnt\)数组的贡献一直传上去。于是我们想到了如果人为地使重儿子是最后一棵子树的话,岂不美哉。于是我们在\(dfs\)时最后访问重儿子就行了,然后复杂度就被优化到\(

  • 白菜刷LeetCode记-240.Search a 2D Matrix II

    今天是一道中等题目,题目如下:   第一种想到的办法是遍历每一行,每一行使用二分查找的方法进行搜索,代码如下: /** *@param{number[][]}matrix *@param{number}target *@return{boolean} */ varsearchMatrix=function(matrix,target){ letm=matrix.length; letn=m>0?matrix[0].length:0; if(n<=0)returnfalse; for(leti=0;i<m;i++){ letlp=0,rp=n-1; while(lp<=rp){ letmid=parseInt((lp+rp)/2); if(target<matrix[i][mid]){ rp=mid-1; } if(target>matrix[i][mid]){ lp=mid+1; } if(target==matrix[i][mid]){ returntrue; } } } returnfalse; };复制 但是是否有

  • Linux定时任务Crontab命令详解

    linux系统则是由cron(crond)这个系统服务来控制的。Linux系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另外,由于使用者自己也可以设置计划任务,所以,Linux系统也提供了使用者控制计划任务的命令:crontab命令。 一、crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。 Linux下的任务调度分为两类,系统任务调度和用户任务调度。 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。 /etc/crontab文件包括下面几行: cat/etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=HOME=/ #run-parts 51

相关推荐

推荐阅读