大数据NiFi(二十):实时同步MySQL数据到Hive

news2025/1/12 6:46:46

文章目录

实时同步MySQL数据到Hive

一、开启MySQL的binlog日志

1、登录mysql查看MySQL是否开启binlog日志

2 、开启mysql binlog日志

3、重启mysql 服务,重新查看binlog日志情况

二、​​​​​​​​​​​​​​配置“CaptureChangeMySQL”处理器

1、创建“CaptureChangeMySQL”处理器

2、配置“DistributeMapCacheServer”控制服务

3、配置“SCHEDULING”

4、配置“PROPERTIES”

5、启动MySQL,创建表“test2”测试“CaptureChangeMySQL”处理器

三、​​​​​​​​​​​​​​配置“RouteOnAttribute”处理器

1、创建“RouteOnAttribute”处理器

2、配置“PROPERTIES”自定义属性

3、连接“CaptureChangeMySQL”处理器与“RouteOnAttribute”处理器

四、配置“EvaluatejsonPath”处理器

1、配置“EvaluatejsonPath”的“PROPERTIES”属性

2、连接“RouteOnAttribute”处理器和“EvaluatejsonPath”处理器

五、​​​​​​​​​​​​​​配置“ReplaceText”处理器

1、配置“RelaceText”处理器“PROPERTIES”属性

2、连接“EvaluatejsonPath”处理器与“ReplaceText”处理器

六、​​​​​​​​​​​​​​配置Hive 支持HiveServer2

1、在Hive服务端配置hive-site.xml

2、在每台Hadoop 节点配置core-site.xml

3、重启HDFS ,Hive ,在Hive服务端启动Metastore和HiveServer2服务

4、在客户端通过beeline连接Hive

七、配置“PutHiveQL”处理器

1、创建“PutHiveQL”处理器

2、 配置“PROPERTIES”

3、连接“ReplaceText”处理器与“PutHiveQL”处理器并设置关系

八、​​​​​​​​​​​​​​运行测试

1、在Hive中创建表“test2”

2、启动NiFi处理数据流程,向MySQL中写入数据,查看Hive中表数据


实时同步MySQL数据到Hive

案例:将mysql中新增的数据实时同步到Hive中。

以上案例需要用到的处理器有:“CaptureChangeMySQL”、“RouteOnAttribute”、“EvaluateJsonPath”、“ReplaceText”、“PutHiveQL”。

首先通过“CaptureChangeMySQL”读取MySQL中数据的变化(需要开启MySQL binlog日志),将Binlog中变化的数据同步到“RouteOnAttribute”处理器,通过此处理器获取上游数据属性,获取对应binlog操作类型,再将想要处理的数据路由到“EvaluateJsonPath”处理器,该处理器可以将json格式的binlog数据解析,通过自定义json 表达式获取json数据中的属性放入FlowFile属性,将FlowFile通过“ReplaceText”处理器获取上游FowFile属性,动态拼接sql替换所有的FlowFile内容,将拼接好的sql组成FlowFile路由到“PutHiveQL”将数据写入到Hive表。

一、开启MySQL的binlog日志

mysql-binlog是MySQL数据库的二进制日志,记录了所有的DDL和DML(除了数据查询语句)语句信息。一般来说开启二进制日志大概会有1%的性能损耗。这里需要开启MySQL的binlog日志方便后期使用“CaptureChangeMySQL”处理器来获取MySQL中的CDC事件。MySQL的版本最好是5.7版本之上。

1、登录mysql查看MySQL是否开启binlog日志

[root@node2 ~]# mysql -u root -p123456
mysql> show variables like 'log_%';

2 、开启mysql binlog日志

在/etc/my.cnf文件中[mysqld]下写入以下内容:

[mysqld]
#随机指定一个不能和其他集群中机器重名的字符串
server-id=123
#配置binlog日志目录,配置后会自动开启binlog日志,并写入该目录
log-bin=/var/lib/mysql/mysql-bin

3、重启mysql 服务,重新查看binlog日志情况

[root@node2 ~]# service mysqld restart
[root@node2 ~]# mysql -u root -p123456
mysql> show variables like 'log_%';

二、​​​​​​​​​​​​​​配置“CaptureChangeMySQL”处理器

“CaptureChangeMySQL”主要是从MySQL数据库捕获CDC(Change Data Capture)事件。CDC事件包括INSERT,UPDATE,DELETE操作,事件按操作发生时的顺序输出为单独的FlowFile文件。

关于“CaptureChangeMySQL”处理器的“Properties”主要配置的说明如下:

配置项

默认值

允许值

描述

MySQL Hosts

(MySQL 节点)

MySQL集群节点相对应的主机名/端口项的列表。多个节点使用逗号分隔,格式为:host1:port、host2:port…,处理器将尝试按顺序连接到列表中的主机。如果一个节点关闭,并且群集启用了故障转移,那么处理器将连接到活动节点。

MySQL Driver Class Name

(MySQL驱动名称)

com.mysql.jdbc.Driver

MySQL数据库驱动程序类的类名。

MySQL Driver Location(s)

(MySQL驱动的位置)

包含MySQL驱动程序包及其依赖项的文件/文件夹和/或url的逗号分隔列表(如果有),例如"/var/tmp/mysql-connector-java-5.1.38-bin.jar文件"。

Username

(用户名)

访问MySQL集群的用户名。

Password

(密码)

访问MySQL集群的密码。

Database/Schema Name Pattern

(匹配数据库/Schema)

用于根据CDC事件列表匹配数据库(或模式,具体取决于RDBMS类型)的正则表达式。正则表达式必须与存储在RDBMS中的数据库名称匹配。如果未设置属性,则数据库名称将不会用于筛选CDC事件。

Table Name Pattern

(匹配表)

用于匹配影响匹配表的CDC事件的正则表达式(regex)。regex必须与存储在数据库中的表名匹配。如果未设置属性,则不会根据表名筛选任何事件。

Max Wait Time

(最大连接等待时长)

30 seconds

允许建立连接的最长时间,零表示实际上没有限制。

Distributed Map Cache Client

(分布式缓存客户端)

指定用于保存处理器所需的各种表、列等信息的分布式映射缓存客户端控制器服务。如果未指定,则生成的事件将不包括列类型或名称等信息。

Retrieve All Records

(检索所有记录)

true

▪true

▪false

指定是否获取所有可用的CDC事件,而不考虑当前的binlog文件名或位置。

如果处理器状态中存在binlog文件名和位置值,则忽略此属性的值。

这允许4种不同的配置:

1).如果处理器State中存在binlog数据,则State用来确定开始位置,并忽略Retrieve All Records的值。(目前NiFi版本测试有问题)

2).如果处理器State中不存在binlog数据,此值设置为true意味着从头开始读取Binlog 数据。

3).如果处理器State中不存在binlog数据,并且没有指定binlog文件名和位置,此值设置为false意味着从binlog尾部开始读取数据。

4).如果处理器State中不存在binlog数据,并指定binlog文件名和位置,此值设置为false意味着从指定binlog尾部开始读取数据。

Include Begin/Commit Events

(包含开始/提交事件)

false

▪true

▪false

指定是否发出与二进制日志中的开始或提交事件相对应的事件。如果下游流中需要开始/提交事件,则设置为true,否则设置为false,这将抑制这些事件的生成并可以提高流性能。

Include DDL Events

(标准表/列名)

false

▪true

▪false

指定是否发出与数据定义语言(DDL)事件对应的事件,如ALTER TABLE、TRUNCATE TABLE。如果下游流中需要DDL事件,则设置为true,否则设置为false。为false时这将抑制这些事件的生成,并可以提高流性能。

配置步骤如下:

1、创建“CaptureChangeMySQL”处理器

 

2、配置“DistributeMapCacheServer”控制服务

监控mysql变化需要设置“DistributedMapCacheClient”控制服务,其对应的Server中存储处理器所需的各种表、列等信息,所以这里需要首先配置“DistributeMapCacheServer”控制服务。

 

3、配置“SCHEDULING”

由于这里使用“CaptureChangeMySQL”处理器监控“MySQL”中的数据,所以设置调度访问周期为“10s”,防止一直监听MySQL binlog数据,带来性能消耗。

 

4、配置“PROPERTIES”

在“CaptureChangeMySQL”处理器中配置“PROPERTIES”,配置如下:

  • MySQL Host : 192.168.179.5:3306
  • MySQL Driver Class Name:com.mysql.jdbc.Driver
  • MySQL Driver Location(s):/root/test/mysql-connector-java-5.1.47.jar

注意:这里需要在每台NiFi节点上创建对应目录,上传mysql驱动包。

https://download.csdn.net/download/xiaoweite1/87490406

“PROPERTIES”配置如下:

 此外,在“PROPERTIES”中还需要配置“Distributed Map Cache Client”控制服务,来读取“DistributeMapCacheServer”控制服务中的缓存数据:

另外,这里我们只是监控表“test2”对应的CDC事件,这里设置匹配表名为“test2”,最终“PROPERTIES”的配置如下:

注意:以上“Table Name Pattern”这里配置对应的Value值为:test2,也可以不配置,不配置会监控所有MySQL表的变化对应的binlog事件。当后面向Hive表中插入新增和更新数据时,对应MySQL中的元数据表也会变化,也会监控到对应的binlog事件。为了避免后期出现监控到其他表的binlog日志,这里建议配置上“test2”。

5、启动MySQL,创建表“test2”测试“CaptureChangeMySQL”处理器

登录mysql ,使用“mynifi”库,创建表“test2”。暂时设置“CaptureChangeMySQL”处理器“success”事件自动终止并启动,向表中插入对应的数据查看“CaptureChangeMySQL”处理器能否正常监控事件。

在mysql中创建对应的表:

use mynifi;
create table test2 (id int,name varchar(255),age int);

 启动“CaptureChangeMySQL”处理器:

向表“test2”中插入以下数据:

insert into test2 values (1,"zs",18);
update test2 set name = "ls" where id = 1;
delete from test2 where id = 1;

可以在“CaptureChangeMySQL”处理器中右键“View data provenance”查看捕获到的“insert”、“update”、“delete”事件:

注意问题:在配置好“CaptureChangeMySQL”处理器启动后,当MySQL中有数据插入、修改、删除时当前处理器会读取MySql binlog日志,并在当前处理器中记录读取binlog的位置状态。正常来说这里关闭“CaptureChangeMySQL”处理器后再次启动,会接着保存的binlog位置继续读取(可以参照“PROPERTIES”属性中“Retrieve All Records”配置说明),但是经过测试,此NiFi版本出现以下错误(无效的binlog位置,目测是一个版本bug错误):

所以在之后的测试中,我们可以将“CaptureChangeMysql”处理器读取binlog的状态清空,然后再次启动即可,这里会重复读取MySQL之前已经检测到的新增、修改、删除数据。

清空“CaptureChangeMysql”读取binlog状态:

三、​​​​​​​​​​​​​​配置“RouteOnAttribute”处理器

“RouteOnAttribute”是根据FlowFile的属性使用属性表达式进行数据路由。

关于“RouteOnAttribute”处理器的“Properties”主要配置的说明如下:

配置项

默认值

描述

Routing Strategy(路由策略)

Route to Property name

指定在计算表达式语言时如何使用哪个关系。

有如下几个关系可选择:

▪Route to Property name

FlowFile的副本将被路由到对应的表达式计算结果为'true'的每个关系。

▪Route to 'matched' if all match

要求所有用户定义的表达式求值都为'true',才认为FlowFile是匹配的。

▪Route to 'matched' if any matches

至少有一个用户定义的表达式求值为'true',才能认为FlowFile是匹配的。

注意:该处理器允许用户自定义属性并指定该属性的匹配表达式。属性与动态属性指定的属性表达式相匹配的FileFlow,映射到动态属性上。

配置如下:

1、创建“RouteOnAttribute”处理器

2、配置“PROPERTIES”自定义属性

注意:以上自定义的属性中update、insert、delete对应的json 表达式写法为:${cdc.event.type:equals('delete')},代表匹配对应类型的FlowFile,“cdc.event.type”是上游FlowFile中的属性,“equales”是对应的方法,“delete”使用单引号引起,表示匹配的CDC事件。

3、连接“CaptureChangeMySQL”处理器与“RouteOnAttribute”处理器

四、配置“EvaluatejsonPath”处理器

“EvaluatejsonPath”处理器将根据上游“RouteOnAttribute”匹配的事件将内容映射成FlowFile属性,方便后期拼接SQL获取数据,上游匹配到的FlowFile中的数据格式为:

EvaluatejsonPath”处理器配置如下:

1、配置“EvaluatejsonPath”的“PROPERTIES”属性

2、连接“RouteOnAttribute”处理器和“EvaluatejsonPath”处理器

连接关系中,我们这里只关注“insert”和“update”的数据,后期获取对应的属性将插入和更新的数据插入到Hive表中,对于“delete”的数据可以路由到其他关系中,例如需要将删除数据插入到另外的Hive表中,可以再设置个分支处理。这里我们将“delete”和“failure”的数据设置自动终止关系。

设置“RouteOnAttribute”处理器其他匹配路由关系为自动终止:

 

五、​​​​​​​​​​​​​​配置“ReplaceText”处理器

“ReplaceText”处理器可以获取“EvaluatejsonPath”转换后FlowFile中的属性来替换原有数据组成一个“insert into ... values (... ...)”语句,方便后续将数据插入到Hive中。“ReplaceText”处理器的配置如下:

1、配置“RelaceText”处理器“PROPERTIES”属性

在“Replacement Value”中配置“insert into ${tablename} values (${id},'${name}',${age})”

注意:

以上获取的tablename名称为“test2”,后面这个sql是要将数据插入到Hive中的,所以这里在Hive中也应该创建“test2”的表名称,或者将表名称写成固定表,后期在Hive中创建对应的表即可。

另外,需要注意${name}在插入Hive中时对应的列为字符串,这里需要加上单引号。

2、连接“EvaluatejsonPath”处理器与“ReplaceText”处理器

配置“EvaluatjsonPath”处理器“failure”和“unmatch”路由关系为自动终止。

 

六、​​​​​​​​​​​​​​配置Hive 支持HiveServer2

访问Hive有两种方式:HiveServer2和Hive Client,Hive Client需要Hive和Hadoop的jar包,配置环境。HiveServer2使得连接Hive的Client从Yarn和HDFS集群中独立出来,不需要每个几点都配置Hive和Hadoop的jar包和一系列环境。

NiFi连接Hive就是使用了HiveServer2方式连接,所以这里需要配置HiveServer2。

配置HiveServer2步骤如下:

1、在Hive服务端配置hive-site.xml

#在Hive 服务端 $HIVE_HOME/etc/hive-site.xml中配置:
<!-- 配置hiveserver2 -->
<property>
	 <name>hive.server2.thrift.port</name>
	 <value>10000</value>
</property>
<property>
	<name>hive.server2.thrift.bind.host</name>
	<value>192.168.179.4</value>
</property>

2、在每台Hadoop 节点配置core-site.xml

<!-- 配置代理访问用户 -->
<property>     
	<name>hadoop.proxyuser.root.hosts</name>     
	<value>*</value>
 </property> 
<property>     
	<name>hadoop.proxyuser.root.groups</name>    
    <value>*</value> 
</property>

3、重启HDFS ,Hive ,在Hive服务端启动Metastore和HiveServer2服务

nohup hive --service metastore >> ./nohup.out 2>&1 &
nohup hive --service hiveserver2 >> ./nohup.out 2>&1 &

4、在客户端通过beeline连接Hive

[root@node3 test]# beeline
beeline> !connect jdbc:hive2://node1:10000 root
Enter password for jdbc:hive2://node1:10000: 没有密码直接跳过即可
0: jdbc:hive2://node1:10000> show tables;
+------------------------------------+
|              tab_name              |
+------------------------------------+
| personinfo                         |
| test2                              |
+------------------------------------+

以上配置完成后,还需要将配置好的core-site.xml文件发送到各个NiFi节点对应的路径/root/test下替换原有的core-site.xml文件。之后重启NiFi集群,各个NiFi节点上执行命令:

service nifi restart

七、配置“PutHiveQL”处理器

“PutHiveQL”主要执行HiveQL的DDL/DML命令,传入给该处理器的FlowFile内容是要执行的HiveQL命令。HiveQL命令可以使用“?”来指定参数,这种情况下,参数必须存在于FlowFile的属性中,命名约定为hiveql.args.N.type和hiveql.args.N.value,其中N为正整数。

关于“PutHiveQL”处理器的“Properties”主要配置的说明如下:

配置项

默认值

允许值

描述

Hive Database Connection Pooling Servic

(Hive数据库连接池服务)

Hive Controller服务,用于获取与Hive数据库的连接。

Batch Size

(批次大小)

100

一批次读取FlowFile的个数。

Character Set

(编码)

UTF-8

指定数据的编码格式。

Statement Delimiter

(语句分隔符)

;

语句分隔符,用于分隔多个语句脚本中的SQL语句。

Rollback On Failure

(失败时回滚)

false

▪true

▪false

指定如何处理错误。默认false指的是如果在处理FlowFile时发生错误,则FlowFile将根据错误类型路由到“failure”或“retry”关系,处理器继续处理下一个FlowFile。

相反,可以设置为true回滚当前已处理的FlowFile,并立即停止进一步的处理。如果设置为true启用,失败的FlowFiles将停留在输入关系中并会反复处理,直到成功处理或通过其他方式将其删除为止。

可以设置足够大的“Yield Duration”避免重试次数过多。

“PutHiveQL”处理器的配置如下:

1、创建“PutHiveQL”处理器

2、 配置“PROPERTIES”

点击之后,配置“HiveConnectionPool”控制服务:

注意以上需要配置:

  • “Database Connection URL” :这里是Hive的HiveServer2启动的节点,也就是服务端节点。“jdbc:hive2://192.168.179.4:10000”
  • “Hive Configuration Resources”:“/root/test/hive-site.xml,/root/test/core-site.xml,/root/test/hdfs-site.xml”,这里需要将以上各个文件在NiFi集群各个节点对应位置准备好。
  • “Database User”:root,这里防止操作Hive对应的HDFS时权限问题。

配置完成后,需要启用对应的“HiveConnectionPool”控制服务:

最终配置“PROPERTIES”为:

 

3、连接“ReplaceText”处理器与“PutHiveQL”处理器并设置关系

设置“ReplaceText”处理器“failure”路由关系为自动终止:

设置“PutHiveQL”处理器路由关系为自动终止:

八、​​​​​​​​​​​​​​运行测试

1、在Hive中创建表“test2”

动HDFS,启动Hive服务端和客户端,创建表“test2”

create table test2 (id int,name string,age int )row format delimited fields terminated by '\t';

 

2、启动NiFi处理数据流程,向MySQL中写入数据,查看Hive中表数据

首先清空“CaptureChangeMySQL”处理器的状态,单独启动“CaptureChangeMySQL”处理器,清空重新消费的数据(以上主要就是避免此版本NiFi bug问题),启动当前案例中其他NiFi处理器。

然后向MySQL中插入以下数据:

insert into test2 values (1,"zs",18);
update test2 set name = "ls" where id = 1;
delete from test2 where id = 1;

NiFi页面:

Hive表test2中的结果: 

 


  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA企业级开发 1.4 Spring_采用Java配置类管理Bean

文章目录一、采用Java配置类管理Bean&#xff08;一&#xff09;打开项目&#xff08;二&#xff09;创建子包&#xff08;三&#xff09;创建杀龙任务类&#xff08;四&#xff09;创建勇敢骑士类&#xff08;五&#xff09;创建Spring配置类&#xff08;六&#xff09;创建测…

STM32单片机之温湿度检测系统(DTH11、OLED、LCD1602)

LCD1602LCD1602引脚第 1 脚: VSS 为电源地 第 2 脚: VDD 接 5V 正电源 第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱&#xff0c;接地时对比度最高&#xff0c;对比度过高时会产生“鬼影”&#xff0c;使用时可以通过一个 10K 的电位器调整对比度。 第 4 脚&…

Windows下命令执行绕过技巧总结(渗透测试专用)

一、连接符1、双引号不要求双引号闭合举例&#xff1a;"who"a"mi" //闭合的 "who"a"mi //不闭合的2、圆括号必须在两边&#xff0c;不能包括中间的字符。举例&#xff1a;((whoami))3、^符号&#xff08;转译符号&#xff09;不可以在结尾&…

Rasa 3.x 学习系列-摆脱意图:一种新的对话模式

Rasa 3.x 学习系列-摆脱意图:一种新的对话模式 在2019年的一篇文章中,Alan Nichol写道 :是时候摆脱意图了。一年后,Rasa发布了Rasa中的第一个无意图(或“端到端”)对话模型。现在,我们宣布迈出了一个重要的步伐,将LLM的强大功能带入Rasa的对话管理中。 首先,意图非常…

YOLOV5s+Shufflenetv2+VOC数据集+迁移学习

前言&#xff1a;更改YOLOV5的backbone网络为 Shufflenetv2&#xff0c;便于达到轻量化的目的 1. 试运行YOLOv5 b站推土机 2. VOC数据集处理 3. 更改轻量级网络 参考魔改yolov5 3.1 在common.py末尾加入以下代码 #添加轻量化模块Shufflenetv2 # ------------------------…

人工智能-机器视觉篇搞定(笔记)

考书目《人工智能之机器视觉》–程晨 1.从计算机读取一张图片显示 ##获取图片 import cv2 imcv2.imread("im.jpg") cv2.imshow("my",im) cv2.waitKey() cv2.destroyAllWindows()2.显示视频帧 import cv2 #cap cv2.VideoCapture("video.mp4")获…

shell脚本入门

实习的时候第一个月的考核就是如何部署一个云资源&#xff0c;当时走的捷径&#xff08;杠杠的搜索能力hhhh&#xff09;找到了一个shell脚本一键部署&#xff0c;后来被leader问起来就如实说了&#xff0c;leader问有没有看懂shell脚本中的逻辑……&#xff08;没有&#xff0…

代码随想录第四十二天| ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

01背包问题 模型详解 描述 在一个容量有限的 背包里装若干物品&#xff0c;这些物品重量不同&#xff0c;价值不同。如何装使这些背包内物品价值最大。 &#xff08;1&#xff09;如果物品可以分割&#xff0c;直接用贪心算法&#xff0c;首先装价值密度最大的物品 &#xff…

acwing3485最大异或和(trie树,贪心)

给定一个非负整数数列 a&#xff0c;初始长度为 N。 请在所有长度不超过 M 的连续子数组中&#xff0c;找出子数组异或和的最大值。 子数组的异或和即为子数组中所有元素按位异或得到的结果。 注意&#xff1a;子数组可以为空。 输入格式 第一行包含两个整数 N,M。 第二行…

【数字IC基础】黑盒验证、白盒验证、 灰盒验证

文章目录 一、黑盒验证二、白盒验证三、灰盒验证一、黑盒验证 1、黑盒验证:大多数基于仿真的验证环境都是黑盒验证;2、不需要知道设计的内部结构和特性,只需要在输入端口打激励,观察输出即可;3、验证工程师学习设计的规格,然后编写验证环境中的 drivers, monitors, check…

如何提高机器人专业课讲师的收入

先放一些总结&#xff1a;为什么我是不合格的高校机器人工程专业讲师&#xff1f;2020不合格肯定收入不会提升&#xff0c;甚至失业风险会非常高的。为何所做的课程努力几乎全部失败呢&#xff1f;→机器人工程类← 2022不能一次次失败&#xff0c;因为只有自己会为失败买单&am…

【经典蓝牙】蓝牙 A2DP协议分析

A2DP 介绍 A2DP(Advanced Audio Distribution Profile)是蓝牙高音质音频传输协议&#xff0c; 用于传输单声道&#xff0c; 双声道音乐&#xff08;一般在 A2DP 中用于 stereo 双声道&#xff09; &#xff0c; 典型应用为蓝牙耳机。 A2DP旨在通过蓝牙连接传输高质量的立体声音…

【教程】Notion笔记多平台设置中文显示

这个笔记软件界面挺好看&#xff0c;惊艳到了。 目录 网页版 桌面端 Windows版 Mac端 安卓端 网页版 直接安装这个插件即可&#xff0c;Chrome/Edge适用&#xff1a;Notion中文版 桌面端 都要去这个github下载语言包&#xff0c;用于替换文件&#xff1a;https://github.c…

智能家居项目(五)测试串口功能

目录 一、写一个单独测试串口的demo 二、直接运行上一篇智能家居的代码 一、写一个单独测试串口的demo 1、TTL串口与树莓派的连接方式 &#xff08;1&#xff09;TTL的RXD和TXD针脚连接到树莓的TXD和RXD上&#xff08;T–>R R–>T&#xff09;&#xff0c;交叉连&…

ChatGPT是如何训练得到的?通俗讲解

首先声明喔&#xff0c;我是没有任何人工智能基础的小白&#xff0c;不会涉及算法和底层原理。 我依照我自己的简易理解&#xff0c;总结出了ChatGPT是怎么训练得到的&#xff0c;非计算机专业的同学也应该能看懂。看完后训练自己的min-ChatGPT应该没问题 希望大牛如果看到这…

ACSC 2023 比赛复现

Admin Dashboard 在 index.php 中可以看到需要访问者是 admin 权限&#xff0c;才可以看到 flag。 report.php 中可以让 admin bot 访问我们输入的 url&#xff0c;那么也就是说可以访问 addadmin.php 添加用户。 在 addadmin.php 中可以添加 admin 用户&#xff0c;但是需…

git的使用(终端输入指令)下

文章目录前言1、git 分支创建分支查看分支切换分支合并分支删除分支2.提交到远程仓库远程提交链接一下自己仓库总结前言 上章链接 &#xff1a;git的使用&#xff08;终端输入指令&#xff09;上 我们接着上着来说 上章把 git 的 功能实现了一部分&#xff0c;本章我们接着上文…

Hive入门学习

文章目录1.概述1.1 hive与hadoop的关系1.2 映射信息记录1.3 hive架构图Hive组件2.Hive数据模型2.1 Table2.2 Partition2.3 Buckets3.元数据相关名词3.1 Metadata3.2 Metastore3.3 metastore三种配置方式3.3.1 内嵌模式3.3.2 本地模式3.3.3 远程模式1.概述 Apach hive 是一款建…

并发编程-学习总结(上)

目录 1、线程基础 1.1、线程实现方法 1.2、如何正确停止线程 1.3、Java线程的六种状态 1.4、wait/notify/notifyAll注意事项 1.4.1、为什么 wait 、notify、notifyAll必须在 synchronized 保护的同步代码中使用&#xff1f; 1.4.2、为什么 wait/notify/notifyAll 被定义…

浅谈QWebChannel、QWebChannelAbstractTransport、QWebSocketServer、QWebSocket用法及之间关系

1.前言在现实业务中&#xff0c;经常遇到这样的需求&#xff1a;一端采用web形式开发的&#xff0c;如&#xff1a;客户端采用html、javascript、nodejs开发&#xff1b;而另一端采用C开发&#xff0c;如&#xff1a;Qt开发的服务端。web页面端需和Qt开发的服务端进行通信、数据…