【大数据】Apache NiFi 数据同步流程实践
Apache NiFi 数据同步流程实践
- 1.环境
- 2.Apache NIFI 部署
- 2.1 获取安装包
- 2.2 部署 Apache NIFI
- 3.NIFI 在手,跟我走!
- 3.1 准备表结构和数据
- 3.2 新建一个 Process Group
- 3.3 新建一个 GenerateTableFetch 组件
- 3.4 配置 GenerateTableFetch 组件
- 3.5 配置 DBCPConnectionPool 服务
- 3.6 配置 GenerateTableFetch 组件 RelationShip
- 3.7 配置 ExecuteSQLRecord 组件
- 3.8 配置 PutDatabaseRecord 组件
- 3.9 运行整个数据处理流程
- 3.10 查看运行结果
- 3.11 持续运行
- 3.12 GenerateTableFetch 监听增量字段
- 4.总结
初衷:对于一些新接触 Apache NIFI 的小伙伴来说,他们急于想体验 NIFI,恨不得直接找到一篇文章,照着做就直接能够解决目前遇到的需求或者问题,回想当初的我,也是这个心态。其实这样的心态是不对的。好多加入 NIFI 学习群的新手同学都会有这个问题,一些基本的概念和知识点都没有掌握,然后提出了一堆很初级的问题,对于这些问题,我们可能已经回答了几十上百次,厌倦了,所以大家一般会说 “你先去看文档吧!”。其实,对于一个新手,直接看文档,也是一脸懵。所以在这里,我带领新手的你,新建一个同步的流程,并尽可能在新建流程的同时,穿插一些基本概念。跟随本文一起操作或者只是看看,最后你可能就找到了入门的感觉了。
1.环境
- Apache NiFi:
1.11.4
单节点 - Linux:
CentOS Linux release 7.5.1804
,16G 内存,48G 存储,虚拟机 - DB:
MySQL
2.Apache NIFI 部署
2.1 获取安装包
-
我是直接编译的
1.11.4
的源码获取的安装包,将zip
包上传到 Linux,解压即可。 -
通过官方网站下载对应的 NIFI 安装包:https://nifi.apache.org/download.html
-
通过国内镜像来下载最新发布的 NIFI 安装包:
- 北理镜像(http://mirror.bit.edu.cn/apache/nifi/)
- 清华镜像(https://mirrors.tuna.tsinghua.edu.cn/apache/nifi/)
如果不是编译源码,建议使用国内镜像去下载,一般直接下载 zip
包就可以了,加入最新版本时 1.11.4
,那就下载 nifi-1.11.4-bin.zip
。
2.2 部署 Apache NIFI
-
上传 Apache NIFI 包到 Linux 上,解压安装包;或者将你的本地作为服务器,直接解压
zip
包。 -
在解压的目录下,找到
conf
目录,编辑bootstrap.conf
文件,修改 NIFI 的内存配置,默认的值比较小,比如这里我改成启动2g
,最大10g
。
java.arg.2=-Xms2g
java.arg.3=-Xmx10g
- 在解压的目录下,找到
bin
目录,可以看到里面有一些脚本。- Linux 或者 Mac,使用
nifi.sh start
启动 NIFI,nifi.sh stop
停止 NIFI,nifi.sh restart
重启 NIFI。 - Windows 下,直接双击
run-nifi.bat
即可,退出的时候关闭运行窗口就可以了。
- Linux 或者 Mac,使用
dump-nifi.bat
nifi-env.bat
nifi-env.sh
nifi.sh
run-nifi.bat
status-nifi.bat
- 在解压的目录下,找到
log
目录,当看到类似于下面的内容时,NIFI 就启动成功了
2020-05-27 14:26:02,844 INFO [main] o.eclipse.jetty.server.AbstractConnector Started ServerConnector@58516c91{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
2020-05-27 14:26:02,845 INFO [main] org.eclipse.jetty.server.Server Started @151563ms
2020-05-27 14:26:02,900 INFO [main] org.apache.nifi.nar.NarAutoLoader Starting NAR Auto-Loader for directory ./extensions ...
2020-05-27 14:26:02,901 INFO [main] org.apache.nifi.nar.NarAutoLoader NAR Auto-Loader started
2020-05-27 14:26:02,902 INFO [main] org.apache.nifi.web.server.JettyServer NiFi has started. The UI is available at the following URLs:
2020-05-27 14:26:02,903 INFO [main] org.apache.nifi.web.server.JettyServer http://******:8080/nifi
2020-05-27 14:26:02,903 INFO [main] org.apache.nifi.web.server.JettyServer http://127.0.0.1:8080/nifi
2020-05-27 14:26:02,906 INFO [main] org.apache.nifi.BootstrapListener Successfully initiated communication with Bootstrap
2020-05-27 14:26:02,907 INFO [main] org.apache.nifi.NiFi Controller initialization took 65344195582 nanoseconds (65 seconds).
2020-05-27 14:27:58,182 INFO [Write-Ahead Local State Provider Maintenance] org.wali.MinimalLockingWriteAheadLog org.wali.MinimalLockingWriteAheadLog@2407f1a8 checkpointed with 0 Records and 0 Swap Files in 27 milliseconds (Stop-the-world time = 4 milliseconds, Clear Edit Logs time = 4 millis), max Transaction ID -1
3.NIFI 在手,跟我走!
在浏览器输入 http://127.0.0.1:8080/nifi
,进入 Apache NIFI 的交互界面。我们看到背景是网格式的,通常我习惯把它叫做设计页面,在这个设计页面上,我们可以通过拖拉拽的形式设计 DataFlow。
3.1 准备表结构和数据
我在 MySQL 里新建了两张表,一个叫 source
来源表,一个叫 target
目标表。两张表的结构是一样的,其中 increase
设计成自动递增的,这样 increase
是一个增量字段。
增量字段顾名思义,数据库表里每次新来的数据的这个增量字段的值,都比上一次的大,严格意义上增量字段是递增且不重复的(区别于将时间戳字段作为增量字段,通常业务里的时间戳字段都不是严格意义上的增量字段)。
现在 source
表里还没有数据,这里我随意在 NIFI 里拉了两个组件往 source
表里写数据,你不用关心这里的处理,我只是在准备来源表的数据,你可以使用任何方式向 source
表里写数据。
最终我一共向 source
表里写了 253001 253001 253001 条数据。
3.2 新建一个 Process Group
在 NIFI 交互界面的顶层,有一排的可拖拽按钮,按照如下图示,拖拽一个 Process Group 出来。
我们给这个 Process Group 起一个名字叫 体验流程,在这里你可以简单的理解 Process Group 是一个组,在这个组里面可以设计你的流程,甚至设计其他的组。
双击体验流程这个 Process Group,我们会进入一个新的空白的设计页面。
3.3 新建一个 GenerateTableFetch 组件
进入到体验流程这个 Process Group 后,如下图所示,我们左键点顶层第一个按钮,按住左键向空白页面拖拽,会弹出一个 Add Processor
的对话框。
在这个对话框里,我们找到 GenerateTableFetch
这个组件。
简单说一下
GenerateTableFetch
这个组件,它的作用就是根据指定的表和表字段(通常是一个增量字段),生成一批 SQL 语句,这些 SQL 是分页的(或者说分片的),这样一张有很多数据的一张表,我们就可以通过多个 SQL 分批的查询出来,这样会更高效。如果直接去全表扫描一张大表,有可能会等待很长时间,有可能会因为数据太多发生一些异常,这都不是我们想看到的。
双击 GenerateTableFetch
这个组件,这个组件就会出现在我们的设计页面上了。双击这个 GenerateTableFetch
组件或者鼠标右键选择 Configure
,会弹出 Configure Processor
对话框。
Configure Processor
对话框有四个页签,这里我简单说明一下,不必纠结没有提及的那些配置究竟是什么意思。其他没有提及的配置你就当成是高级应用,不明白这些配置并不影响本文的阅读。
- SETTINGS:可以配置
Terminate
哪些 RelationShip,Terminate
你可以简单理解为我们忽略、不在意这个 RelationShip。
RelationShip:每一个 Processor 处理完数据得到的结果,一般会将他们传输出去,RelationShip 就是他们传输的方向。具体哪部分数据传输到哪个方向,由具体的程序代码决定。每个组件的 RelationShip 可能都不一样,具体的含义需要查看各个组件的详细说明文档,你可以右键组件,选择
View usage
来查看这个组件具体的用法。这里我们要注意一点就是,每个组件的所有 RelationShip 都应该有所指向(下面会提到将一个组件连接到另一个组件,组件中间会有一个Connection
的东西,这个Connection
会包含一个或多个 RelationShip,那么这样的 RelationShip 就是有所指向的。另外Terminate
也算是有所指向)。
-
SCHEDUING:配置调度的地方,可用的调度的策略(
Scheduling Strategy
)有两种,一个是Timer driven
,配置每多久执行一次调度。另一个是CRON driven
,可以配置比如每天在几点几分执行一次调度。具体的调度时间是在Run Schedule
里配置的。Concurrent Tasks
是说一次调度,这个组件最多可以同时启动多少个任务来处理数据。Execution
是针对集群的,你可以先不用理解,它是设置组件只在主节点运行还是在所有节点运行。 -
PROPERTIES:这个是每个组件的核心功能配置,每个组件的配置都是不一样的。
-
COMMENTS:注释,可以在里面添加一些描述信息。
3.4 配置 GenerateTableFetch 组件
SCHEDUING
页签,我们选择 Timer driven
,Run Schedule
配置成 5 s e c 5\ sec 5 sec,即每 5 5 5 秒调度一次。
PROPERTIES
页签,如下图,我们通过 Database Connection Pooling Service
新建了一个 DBCPConnectionPool
数据库连接池服务,Database Type
选择了 MySQL
,Table Name
配置填写了来源表名称 source
,Maximum-value Columns
我们配置了增量字段 increase
。
点击 Apply
后,回到设计页面,我们发现组件左上角是一个感叹号,感叹号你可以理解为这个组件还没有满足运行的条件,把鼠标停留在感叹号上会有提示信息。
通过提示信息我们看到两个问题,第一个是 DBCPConnectionPool
数据库连接池服务还不可用,另一个是当前的组件 success
和 failure
两个 RelationShip 还没有指向。
3.5 配置 DBCPConnectionPool 服务
如下图所示,鼠标右键点击空白页面,选择 Configure
,进入 Process Group
的配置页面。
进入 Process Group
的配置页面后,选择 CONTROLLER SERVICES
页签,我们可以看到我们之前建的 DBCPConnectionPool
数据库连接池服务。点击齿轮形状的配置按钮,如下图所示会弹出 Configure Controller Service
的对话框。
点击对话框的 PROPERTIES
页签,按如下图所示配置 MySQL 数据库的连接信息。
这里我们把本文的数据库连接列出来:
jdbc:mysql://ip:port/nifi?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&tinyInt1isBit=falsecom.mysql.jdbc.Driver驱动包需要自己去下载,然后添加到 NIFI 本机的某个地方
/data/nifi-1.11.4/jdbc/mysql-connector-java-5.1.46.jar
配置完毕后,点击 APPLY
,然后如下图,点击闪电符号按钮,启用 DBCPConnectionPool
数据库连接池服务。
3.6 配置 GenerateTableFetch 组件 RelationShip
回到设计页面,我们看到 GenerateTableFetch
这个组件黄色感叹号的提示信息关于 DBCPConnectionPool
的已经没有了,现在提示的是关于 RelationShip
的。
现在我们通过新建 GenerateTableFetch
同样的方式,在设计页面新增一个 ExecuteSQLRecord
组件,然后将鼠标停留在 GenerateTableFetch
组件上,会出现一个箭头,点击拉取这个箭头然后指向 ExecuteSQLRecord
。
指向的过程中会弹出 Create Connection
的配置页面,在里面的 For Relationships
勾选 success
(后期我们可以右键点击 Connection
进入配置页面)。
点击 ADD
后,再次回到设计页面。
我们看到 GenerateTableFetch
这个组件黄色感叹号的提示信息只剩下 failure
RelationShip 的了。
此时我们再次到 GenerateTableFetch
的配置页面,在 SETTINGS
页面的 Automatically Terminate Relationships
里勾选 failure
。
点击 APPLY
后,GenerateTableFetch
这个组件黄色感叹号就会消失了。
3.7 配置 ExecuteSQLRecord 组件
简单说一下 ExecuteSQLRecord
组件,执行上游传输过来的 SQL 语句,然后将查询结果以指定的数据格式输出到下游。
与配置 GenerateTableFetch
配置的操作流程都是大体相似的,这里不做重复性的叙述了,看过程图就可以了。
3.8 配置 PutDatabaseRecord 组件
我们在设计页面上新增一个 PutDatabaseRecord
组件,并做相应配置。
简单说一下 PutDatabaseRecord
组件,以指定格式读取上游的数据,然后将数据 insert
/ update
/ delete
到指定的数据库表。
3.9 运行整个数据处理流程
右键点击每个组件选择 start
或者点击空白出选择 start
。
可以看到已经有数据在流动被处理了。
写入数据总是比较慢的,这个时候我们可以适当的停止 PutDatabaseRecord
组件修改配置提高它的并发任务数(注意,只有 stop
这个组件,才可以对它进行配置)。
当我们再次运行 PutDatabaseRecord
组件,在设计页面会发现流程报错了(这并不是意外,这是我设计好展示给你们看的效果)。
我们可以看到 PutDatabaseRecord
的右上角有一个 8 8 8,并且 GenerateTableFetch
组件右上角有一个红色告警,将鼠标停留在红色告警,会有提示信息。看报错信息的意思是说 GenerateTableFetch
无法获取到数据库连接(DBCPConnectionPool
数据库连接池默认是 8 8 8 个连接,但这 8 8 8 个全被 PutDatabaseRecord
拿去用了,GenerateTableFetch
拿不到连接所以报错了)。
好了,上面的报错设计只是为了让你看到多任务时组件右上角会有任务数的提示,当发生异常时组件的右上角也会有红色告警信息。
3.10 查看运行结果
等待一段时间,流程中的数据都被处理完了(Connection
中没有数据了)。然后我们去查询 target
表里一共被同步了多少数据,结果一看,也是 253001 253001 253001 条。
3.11 持续运行
那么这就完了吗?不,我们这个流程不是一个一次性任务,它是持续的。如下图所示:
此时我们向 source
添加一条数据,它是第 253002 253002 253002 条。
添加完后观察我们正在运行的流程,发现原本组件上那些 In
、Out
已经为 0 0 0 的状态现在变成了 1 1 1,说明刚才有数据流过了。
然后我们去查看 target
表,发现第 253002 253002 253002 条数据已经被同步过来了。
3.12 GenerateTableFetch 监听增量字段
这里简单说一下 GenerateTableFetch
增量同步数据的原理,右键点击 GenerateTableFetch
,选择 View state
。
如下图,我们可以看到 Compontent State
这个对话框里记录了 increase
的值。
state
是 NIFI 提供的稳定、可靠的存储机制。它适合存储少量的数据,一般是一些状态信息。
GenerateTableFetch
利用 state
记录了每次扫描 source
表 increase
最大的值,然后在下一次扫描生成 SQL 时,会扫描那些 increase
值大于 state
中记录的行,相应的生成查询这些行数据的 SQL。这样就达到了增量抽取数据的目的。
4.总结
如果说你跟着本文一起操作或者仔细的阅读了整篇文章,那么我相信你已经入门 Apache NIFI 了 。
好吧,和你开玩笑的,你还没有入门。这篇文章只是简单带你(替你)体验了一把 Apache NIFI,如果想要入门,还需要更多的阅读和实践。
相关文章:

【大数据】Apache NiFi 数据同步流程实践
Apache NiFi 数据同步流程实践 1.环境2.Apache NIFI 部署2.1 获取安装包2.2 部署 Apache NIFI 3.NIFI 在手,跟我走!3.1 准备表结构和数据3.2 新建一个 Process Group3.3 新建一个 GenerateTableFetch 组件3.4 配置 GenerateTableFetch 组件3.5 配置 DBCP…...

git怎么使用 拉取代码
废话不多说 直接开干 Git 是一款十分实用的版本控制工具,非常方便地管理代码的变更。但是,在使用 Git 过程中,不可避免地会遇到一些问题。其中,删除分支是一个常见的问题。 查看引用历史记录: git reflog找到你删除的…...

Apple :苹果将在明年年底推出自己的 AI,预计将随 iOS 18 一起推出
本心、输入输出、结果 文章目录 Apple :苹果将在明年年底推出自己的 AI,预计将随 iOS 18 一起推出前言三星声称库克相关图片弘扬爱国精神 Apple :苹果将在明年年底推出自己的 AI,预计将随 iOS 18 一起推出 编辑:简简单…...

数据结构-双向链表
1.带头双向循环链表: 前面我们已经知道了链表的结构有8种,我们主要学习下面两种: 前面我们已经学习了无头单向非循环链表,今天我们来学习带头双向循环链表: 带头双向循环链表:结构最复杂,一般用…...

CV计算机视觉每日开源代码Paper with code速览-2023.11.6
精华置顶 墙裂推荐!小白如何1个月系统学习CV核心知识:链接 点击CV计算机视觉,关注更多CV干货 论文已打包,点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【点云3D目标检测】(NeurIPS2023)…...

GB28181学习(十五)——流传输方式
前言 基于GB/T28181-2022版本,实时流的传输方式包括3种: UDPTCP被动TCP主动 UDP 流程 注意: m字段指定传输方式为RTP/AVP; 抓包 SIP服务器发送INVITE请求; INVITE sip:xxx192.168.0.111:5060 SIP/2.0 Via: SIP…...

【Linux】:初识git || centos下安装git || 创建本地仓库 || 配置本地仓库 || 认识工作区/暂存区(索引)以及版本库
📮1.初识git Git 原理与使用 课程⽬标 • 技术⽬标:掌握Git企业级应⽤,深刻理解Git操作过程与操作原理,理解⼯作区,暂存区,版本库的含义 • 技术⽬标:掌握Git版本管理,⾃由进⾏版本回退、撤销、修改等Git操…...

Vue 3 中,watch 和 watchEffect 的区别
结论先行: watch 和 watchEffect 都是监听器,都是用来监听响应式数据的变化并执行相应操作。区别是: watch:需要指明要监听的数据,而且在回调函数中可以获取到属性变化的前后值; 适用于需要精确控制监视…...

鲜花展示服务预约小程序的效果如何
鲜花产品的市场需求度非常高,互联网深入各个行业,很多鲜花商家都会通过线上建立平台实现产品销售、获客引流、转化复购、生意增长等,当然除了搭建鲜花商城小程序外,对鲜花供应商及门店还有展示预约方面的需求。 通过【雨科】平台可…...

Linux下多个盘符乱的问题处理
参考文档: linux下man fstab命令查看帮助,有一段说明,可以使用UUID,或者LABEL 来绑定盘。这里使用UUID来绑定 Instead of giving the device explicitly, one may indicate the filesystem that is to be mounted by its UUID …...

uniapp小程序使用web-view组件页面分享后,点击没有home小房子解决办法
uniapp小程序使用web-view组件页面分享后,点击没有home小房子解决办法 小程序 :IOS 测试正常, 安卓 不显示home 微信小程序使用的是全局自定义导航,通过首页 banner 跳转到一个 web-view 页面,展示官网。 web-view 页…...

SLAM_语义SLAM相关论文
目录 1. 综述 2. 相关文章 Probabilistic Data Association for Semantic SLAM VSO:Visual Semantic Odometry 语义信息分割运动物体...

【技巧】并发读取Mysql数据保证读取到的数据不重复
【技巧】并发读取Mysql数据保证读取到的数据不重复 使用场景: 并发场景下, 保证不获取到重复的数据 思路: 先通过 MYSQL锁 去占位打标识,然后再去取数据 相当于几个人抢蛋糕, A先把蛋糕打上记号 蛋糕是A的, 然后再慢慢吃 表结构 表 t_userid name val used_flag 是否使用…...

Lavarel异步队列的使用
系统为window 启动队列: php artisan queue:listen设置队列类 .env文件需设置:QUEUE_CONNECTIONredis <?phpnamespace App\Jobs;use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Disp…...

JVM知识分享(PPT在资源里)
一、前言 1.自动内存管理 有句经典的话是这样说,Java与C之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要…...

整合Salesforce Org需要避免的3大风险
管理多个Salesforce实例是成长型企业可能遇到的场景,每个Salesforce实例都包含可能需要整合的关键业务数据和流程。 除了整合,组织可能会在不同的发展阶段采用Salesforce(例如CRM、服务、运营)。整合的最终结果是多个Salesforce实例被统一,并…...

viple进阶3:打印不同形状的三角形
(1)题目:打印实心的三角形(正三角) 第一步:观察图形。首行是1颗星,其余的每一行都比上一行多1颗星;其次,每一行的星号数和行数值相等,第一行有1颗星ÿ…...

pytest+yaml实现接口自动化框架
前言 httprunner 用 yaml 文件实现接口自动化框架很好用,最近在看 pytest 框架,于是参考 httprunner的用例格式,写了一个差不多的 pytest 版的简易框架 项目结构设计 项目结构完全符合 pytest 的项目结构,pytest 是查找 test_.…...

编译器使用优化后出现的busfault
遇到的问题: 未开优化是正常执行,打开优化,无法运行,定位到异常语句 //ADC_REG 是ADC结果寄存器地址 uint32 adc *(uint32 *)ADC_REG; uint32 temp adc&0xffff;未优化汇编代码 //uint32 adc *(uint32*)ADC_REG; MOVW R…...

rebase current onto selected作用
rebase current onto selected作用 "rebase current onto selected"是一个版本控制工具中的命令,通常用于将当前分支的修改合并到已选定的分支中,以保持代码库的整洁性和可维护性。 具体来说,这个命令会将当前分支的提交历史记录…...

深度学习入门
全连接批量归一化 目的是:只有一个学习率, 通过归一化,让所有的 x i x_i xi具有一样的分布,则对每个参数 w i w_i wi梯度的作用是相当的实现是:实际上是在全连接中增加了两个节点 γ \gamma γ, β \beta β 卷积…...

嵌入式图像处理机器视觉库YMCV使用
YMCV入门 一个可以免操作系统的机器视觉库,由c语言编写可以跑在单片机上。项目地址https://gitee.com/yao_mi/ymcv 使用的时候,可以参考他们的教程和demo,建议先看教程,上面有架构说明。 一个典型的应用就是渲染器,需…...

vscode设置pycharm中的项目路径和debug方法
真大佬在这 真大佬在这 必须给大佬star 命令行运行: export PYTHONPATH:pwd:/home/bennie/bennie/bennie_project/AI_Lab python main.py 当关闭此命令行时,临时路径会清除,可以将上述export的整条语句,加入~/.bashrc中 该命令中…...

10-27 maven概念
maven maven的概念模型: 项目对象模型(POM: Project object Model),一组标准集合: pom.xml 依赖管理系统(Dependency Management System) 项目生命周期(Project Lifecycle) 项目对象模型: 把项目当成一个对象,描述这个项目,使用p…...

SQL审计是什么意思?目的是什么?有什么好处?
很多刚入行的运维小伙伴对于SQL审计不是很了解,不知道其是什么意思?使用SQL审计的目的是什么?使用SQL审计的好处有哪些?这里我们大家就来一起聊聊,仅供参考哈! SQL审计是什么意思? 【回答】&…...

CSS 网页布局
网页布局有很多种方式,一般分为以下几个部分:头部区域、菜单导航区域、内容区域、底部区域: 1)、头部区域位于整个网页的顶部,一般用于设置网页的标题或者网页的logo。 <style> body { margin: 0; } /* 头部样…...

智慧燃气管网监测系统功能简要介绍
关键词:智慧燃气、智慧燃气管网、智慧燃气管网监测、智慧燃气管网监测系统、智慧燃气解决方案 燃气作为城市主要燃料,遍布整个城区,其安全运行直接关系到居民的生命安全,不可不重视。 智慧燃气中的GIS和SCADA系统,可…...

深度解析:如何开发一对一交友App的关键要素和流程
在数字化时代,人们越来越倾向于使用交友App来寻找自己的伴侣或交流朋友。而一对一交友App的开发成为了创业者们追逐的热门领域。本文将深入探讨一对一交友App开发的关键要素和流程,帮助您在竞争激烈的市场中脱颖而出。 关键要素:打造独特的用…...

ClickHouse 学习之从高级到监控以及备份(二)
第 一 部分 高级篇 第 1 章 Explain 查看执行计划 在 clickhouse 20.6 版本之前要查看 SQL 语句的执行计划需要设置日志级别为 trace 才能可以看到,并且只能真正执行 sql,在执行日志里面查看。在 20.6 版本引入了原生的执行计划的语法。在 20.6.3 版本成…...

「随笔」IT行业哪个方向比较好就业
一、IT行业就业的PEST分析 在当前的全球经济环境下,IT行业的发展迅速,就业前景广阔。以下从政治、经济、社会和科技四个维度对IT行业就业进行PEST分析。 1.1 政治(Political) 政府政策:近年来,各国政府都…...