Sqoop详解

news2024/9/27 9:21:47

目录

一、sqoop基本原理

1.1、何为Sqoop?

1.2、为什么需要用Sqoop?

1.3、关系图

 1.4、架构图

二、Sqoop可用命令

2.1、公用参数:数据库连接

2.2、公用参数:import

2.3、公用参数:export

 2.4、公用参数:hive

2.3、其他命令

三、Sqoop常用命令

3.1、RDBMS => HDFS (导入重点)

3.1.1、全表导入

3.1.2、查询导入--query

3.1.3、导入指定列 --columns

3.1.4、where语句过滤

3.1.5、①增量导入 append

3.1.5、②增量导入 lastmodified

 3.2、RDBMS => HBase

3.3、RDBMS => Hive

3.3.1、导入普通表

3.3.2、导入分区表

3.4、Hive/Hdfs => RDBMS

3.5、Sqoop Job


一、sqoop基本原理

1.1、何为Sqoop?


Sqoop(SQL-to-Hadoop)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导出到关系型数据库中。


1.2、为什么需要用Sqoop?

我们通常把有价值的数据存储在关系型数据库系统中,以行和列的形式存储数据,以便于用户读取和查询。但是当遇到海量数据时,我们需要把数据提取出来,通过MapReduce对数据进行加工,获得更符合我们需求的数据。数据的导入和导出本质上是Mapreduce程序,充分利用了MR的并行化和容错性。为了能够和HDFS系统之外的数据库系统进行数据交互,MapReduce程序需要使用外部API来访问数据,因此我们需要用到Sqoop。
 

1.3、关系图

在这里插入图片描述

 1.4、架构图

 在 mapreduce 中主要是对 inputformat 和 outputformat 进行定制。
Sqoop工具接收到客户端的shell命令或者Java api命令后,通过Sqoop中的任务翻译器(Task Translator)将命令转换为对应的MapReduce任务,而后将关系型数据库和Hadoop中的数据进行相互转移,进而完成数据的拷贝。
 

二、Sqoop可用命令

命令方法
codegen生成与数据库记录交互的代码
create-hive-table将表定义导入到Hive中
eval评估SQL语句并显示结果
export导出一个HDFS目录到一个数据库表
help可用命令列表
import将一个表从数据库导入到HDFS
import-all-tables从数据库导入表到HDFS
import-mainframe从大型机服务器导入数据集到HDFS
job使用已保存的工作
list-databases列出服务器上可用的数据库
list-tables列出数据库中可用的表
merge合并增量导入的结果
metastore运行一个独立的Sqoop转移
version显示版本信息

 对于不同的命令,有不同的参数,这里给大家列出来了一部分Sqoop操作时的常用参数,以供参考,需要深入学习的可以参看对应类的源代码,本文目前介绍常用的导入、导出的一些命令。

2.1、公用参数:数据库连接

参数说明
--connect连接关系型数据库的URL
--connection-manager指定要使用的连接管理类
--driverJDBC的driver class
--help打印帮助信息
--username连接数据库的用户名
--password连接数据库的密码
--verbose在控制台打印出详细信息

2.2、公用参数:import

参数说明
--enclosed-by给字段值前后加上指定的字符
--escaped-by对字段中的双引号加转义符
--fields-terminated-by设定每个字段是以什么符号作为结束,默认为逗号
--lines-terminated-by设定每行记录之间的分隔符,默认是\n
--mysql-delimitersMysql默认的分隔符设置,字段之间以逗号分隔,行之间以\n分隔,默认转义符是\,字段值以单引号包裹。
--optionally-enclosed-by给带有双引号或单引号的字段值前后加上指定字符。

2.3、公用参数:export

参数说明
--input-enclosed-by对字段值前后加上指定字符
--input-escaped-by对含有转移符的字段做转义处理
--input-fields-terminated-by字段之间的分隔符
--input-lines-terminated-by行之间的分隔符
--input-optionally-enclosed-by给带有双引号或单引号的字段前后加上指定字符

 2.4、公用参数:hive

参数说明
--hive-delims-replacement用自定义的字符串替换掉数据中的\r\n和\013 \010等字符
--hive-drop-import-delims在导入数据到hive时,去掉数据中的\r\n\013\010这样的字符
--map-column-hive < map>生成hive表时,可以更改生成字段的数据类型
--hive-partition-key创建分区,后面直接跟分区名,分区字段的默认类型为string
--hive-partition-value导入数据时,指定某个分区的值
--hive-homehive的安装目录,可以通过该参数覆盖之前默认配置的目录
--hive-import将数据从关系数据库中导入到hive表中
--hive-overwrite覆盖掉在hive表中已经存在的数据
--create-hive-table默认是false,即,如果目标表已经存在了,那么创建任务失败
--hive-table后面接要创建的hive表,默认使用MySQL的表名
--table指定关系数据库的表名

2.3、其他命令

命令含义
-m N指定启动N个map进程
--num-mappers N指定启动N个map进程
--query后跟查询的SQL语句
--incremental modemode:append或lastmodified
--check-column作为增量导入判断的列名
--split-by按照某一列来切分表的工作单元,不能与–autoreset-to-one-mapper连用
--last-value指定某一个值,用于标记增量导入的位置
--target-dir指定HDFS路径
--delete-target-dir若hdfs存放目录已存在,则自动删除

三、Sqoop常用命令

先在mysql中建一张表来使用

create table student(
    sid int primary key,
    sname varchar(16) not null,
    gender enum('女','男') not null default '男',
    age int not null
);
insert into student(sid,sname,gender,age) values
(1,'孙尚香','女',15),
(2,'貂蝉','女',16),
(3,'刘备','男',17),
(4,'孙二娘','女',16),
(5,'张飞','男',15),
(6,'关羽','男',18),

3.1、RDBMS => HDFS (导入重点)

3.1.1、全表导入

//single为自己虚拟机ip
sqoop import \
--connect jdbc:mysql://single:3306/sqoop_test \
--username root \
--password kb10 \
--table student \
--target-dir /sqooptest/table_all \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by ','
  • 登录web界面查看/sqooptest/table_all目录下,生成了数据结果
  • 或者使用hdfs命令查看数据结果

hdfs dfs -cat /sqooptest/table_all/part-m-00000

数据结果如下

1,孙尚香,女,15
2,貂蝉,女,16
3,刘备,男,17
4,孙二娘,女,16
5,张飞,男,15
6,关羽,男,18

3.1.2、查询导入--query

//single为虚拟机ip地址
sqoop import \
--connect jdbc:mysql://single:3306/sqoop_test \
--username root \
--password kb10 \
--target-dir /sqooptest/select_test \
--num-mappers 1 \
--query 'select sname,gender from student where $CONDITIONS'

where语句中必须有 $CONDITIONS,表示将查询结果带回。 如果query后使用的是双引号,则 $CONDITIONS前必须加转移符即 \$CONDITIONS,防止shell识别为自己的变量。

hdfs dfs -cat /sqooptest/select_test/part-m-00000

数据结果如下

孙尚香,女
貂蝉,女
刘备,男
孙二娘,女
张飞,男
关羽,男

3.1.3、导入指定列 --columns

sqoop import \
--connect jdbc:mysql://single:3306/sqoop_test \
--username root \
--password kb10 \
--table student \
--columns sid,sname,age \
--target-dir /sqooptest/column_test \
--num-mappers 1 \
--fields-terminated-by "|"

数据结果如下

1|孙尚香|15
2|貂蝉|16
3|刘备|17
4|孙二娘|16
5|张飞|15
6|关羽|18

3.1.4、where语句过滤

源表数据

sqoop import \
--connect jdbc:mysql://single:3306/sqoop_test \
--username root \
--password kb10 \
--table student \
--where "sid>=6" \
--target-dir /sqooptest/wheretest \
-m 2

得到了如下 “sid>=6” 的数据

[root@single ~]# hdfs dfs -cat /sqooptest/wheretest/*
6,关羽,男,18
7,云中君,男,19
8,百里玄策,男,20

3.1.5、①增量导入 append

sqoop import \
--connect jdbc:mysql://single:3306/sqoop_test \
--username root \
--password kb10 \
--query "select sid,sname,gender from student where \$CONDITIONS" \
--target-dir /sqooptest/add1 \
--split-by sid \
-m 2 \
--incremental append \
--check-column sid \
--last-value 0

–split-by 和 -m 结合实现numberReduceTasks并行

后面两句
–check-column sid
–last-value 0
结合使用的效果类似于where sid>0

MR过程中部分关键信息如下

--sid界限值是0-6
20/11/20 05:17:42 INFO tool.ImportTool: Incremental import based on column `sid`
20/11/20 05:17:42 INFO tool.ImportTool: Lower bound value: 0
20/11/20 05:17:42 INFO tool.ImportTool: Upper bound value: 6
--条件是where `sid` > 0 AND `sid` <= 6
20/11/20 05:17:48 INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(sid), MAX(sid) FROM (select sid,sname,gender from student where `sid` > 0 AND `sid` <= 6 AND  (1 = 1) ) AS t1
--指定了两个maptask
20/11/20 05:17:48 INFO mapreduce.JobSubmitter: number of splits:2
--提示last-value即sid是6
20/11/20 05:18:06 INFO tool.ImportTool:  --incremental append
20/11/20 05:18:06 INFO tool.ImportTool:   --check-column sid
20/11/20 05:18:06 INFO tool.ImportTool:   --last-value 6

数据结果如下:

1,孙尚香,女
2,貂蝉,女
3,刘备,男
4,孙二娘,女
5,张飞,男
6,关羽,男

此时往mysql中再添加几条数据,再进行一次增量导入

insert into student(sid,sname,gender,age) values(7,'云中君','男',19),(8,'百里玄策','男',20),(9,'裴擒虎','男',17);

再次执行增量导入语句

sqoop import \
--connect jdbc:mysql://single:3306/sqoop_test \
--username root \
--password kb10 \
--query "select sid,sname,gender,age from student where \$CONDITIONS" \
--target-dir /sqooptest/add1 \
-m 1 \
--incremental append \
--check-column sid \
--last-value 6
hdfs dfs -cat /sqooptest/add1/part-m-*

1,孙尚香,女
2,貂蝉,女
3,刘备,男
4,孙二娘,女
5,张飞,男
6,关羽,男
7,云中君,男,19
8,百里玄策,男,20
9,裴擒虎,男,17

3.1.5、②增量导入 lastmodified

先在mysql创建一张新表

create table orderinfo(
	oid int primary key,
	oName varchar(10) not null,
	oPrice double not null,
	oTime timestamp not null
);

insert into orderinfo(oid,oName,oPrice,oTime) values
(1,'爱疯12',6500.0,'2020-11-11 00:00:00'),
(2,'华为xpro',12000.0,'2020-10-1 12:52:33'),
(3,'行李箱',888.8,'2019-5-22 21:56:17'),
(4,'羽绒服',1100.0,'2018-3-7 14:22:31');

 将数据传到hdfs

sqoop import \
--connect jdbc:mysql://single:3306/sqoop_test \
--username root \
--password kb10 \
--table orderinfo \
--target-dir /sqooptest/lastmod \
-m 1

往mysql的orderinfo表中新插入几条数据,然后增量导入

insert into orderinfo(oid,oName,oPrice,oTime) values
(5,'帕拉梅拉',1333333.3,'2020-4-7 12:23:34'),
(6,'保温杯',86.5,'2017-3-5 22:52:16'),
(7,'枸杞',46.3,'2019-10-5 11:11:11'),
(8,'电动牙刷',350.0,'2019-9-9 12:21:41');

–incremental lastmodified修改和增加 此时搭配–check-column 必须为timestamp类型

使用lastmodified方式导入数据要指定增量数据是要–append(追加)还是要–merge-key(合并)

sqoop import \
--connect jdbc:mysql://single:3306/sqoop_test \
--username root \
--password kb10 \
--table orderinfo \
--target-dir /sqooptest/lastmod \
-m 1 \
--incremental lastmodified \
--check-column oTime \
--merge-key oid \
--last-value "2019-10-1 12:12:12"

数据结果如下

1,爱疯12,6500.0,2020-11-11 00:00:00.0
2,华为xpro,12000.0,2020-10-01 12:52:33.0
3,行李箱,888.8,2019-05-22 21:56:17.0
4,羽绒服,1100.0,2018-03-07 14:22:31.0
5,帕拉梅拉,1333333.3,2020-04-07 12:23:34.0
7,枸杞,46.3,2019-10-05 11:11:11.0

发现只添加了两条记录,因为序号为6和8的记录的时间不在–last-value的范围内

 3.2、RDBMS => HBase

先在hbase中建表

hbase(main):007:0> create 'sqooptest:sqstudent','stuinfo'

使用sqoop开始导入数据

sqoop import \
--connect jdbc:mysql://single:3306/sqoop_test \
--username root \
--password kb10 \
--table student \
--hbase-table sqooptest:sqstudent \
--column-family stuinfo \
--hbase-create-table \
--hbase-row-key sid

–column-family stuinfo
指定列族为stuinfo
–hbase-create-table
若表不存在,则自动创建
–hbase-row-key sid
指定行键为sid

 查看hbase表数据

hbase(main):008:0> scan 'sqooptest:sqstudent'
ROW                         COLUMN+CELL                                                                    
 1                          column=stuinfo:age, timestamp=1605958889301, value=15                          
 1                          column=stuinfo:gender, timestamp=1605958889301, value=\xE5\xA5\xB3             
 1                          column=stuinfo:sname, timestamp=1605958889301, value=\xE5\xAD\x99\xE5\xB0\x9A\x
                            E9\xA6\x99                                                                     
 2                          column=stuinfo:age, timestamp=1605958889301, value=16                          
 2                          column=stuinfo:gender, timestamp=1605958889301, value=\xE5\xA5\xB3             
 2                          column=stuinfo:sname, timestamp=1605958889301, value=\xE8\xB2\x82\xE8\x9D\x89  
...
...
...                                                     
 9                          column=stuinfo:age, timestamp=1605958892765, value=17                          
 9                          column=stuinfo:gender, timestamp=1605958892765, value=\xE7\x94\xB7             
 9                          column=stuinfo:sname, timestamp=1605958892765, value=\xE8\xA3\xB4\xE6\x93\x92\x
                            E8\x99\x8E                                                                     
9 row(s) in 0.1830 seconds

HBase中的数据没有数据类型,统一存储为字节码,是否显示具体的汉字只是前端显示问题,此处没有解决,因此gender和sname字段显示的都是字节码

3.3、RDBMS => Hive

3.3.1、导入普通表

将mysql中retail_db库下的orders表导入hive

sqoop import \
--connect jdbc:mysql://single:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--username root \
--password kb10 \
--table orders \
--hive-import \
--hive-database sqooptest \
--create-hive-table \
--hive-table orders \
--hive-overwrite \
-m 3

3.3.2、导入分区表

sqoop import \
--connect jdbc:mysql://single:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--username root \
--password kb10 \
--query "select order_id,order_status from orders where 
order_date>='2014-07-02' and order_date<'2014-07-03' and \$CONDITIONS" \
--hive-import \
--hive-database sqooptest \
--hive-table order_partition \
--hive-partition-key 'order_date' \
--hive-partition-value '2014-07-02' \
-m 1

3.4、Hive/Hdfs => RDBMS

先在mysql中建表

create table hiveTomysql(
	sid int primary key,
	sname varchar(5) not null,
	gender varchar(1) default '男',
	age int not null
);

我们把刚才在hive中创建的sqstudent表数据再导出到mysql中

sqoop export \
--connect jdbc:mysql://single:3306/sqoop_test \
--username root \
--password kb10 \
--table hiveTomysql \
--num-mappers 1 \
--export-dir /opt/software/hadoop/hive110/warehouse/sqstudent/part-m-00000 \
--input-fields-terminated-by ","

3.5、Sqoop Job

job参数说明

ArgumentDescription
–create JOB_NAME创建job参数
–delete JOB_NAME删除一个job
–exec JOB_NAME执行一个job
–help显示job帮助
–list显示job列表
–help显示job帮助
–meta-connect < jdbc-uri>用来连接metastore服务
–show JOB_NAME显示一个job的信息
–verbose打印命令运行时的详细信息

创建job
- -和import之间有个空格。这里–空格之后表示给job添加参数,而恰好import又不需要–,所以这个空格很容易被忽略。

sqoop job --create myjob \
-- import \
--connect jdbc:mysql://single:3306/sqoop_test \
--username root \
--password kb10 \
--table student \
--target-dir /sqooptest/myjob \
-m 1 \
--lines-terminated-by '\n' \
--null-string '\\N' \
--null-non-string '\\N'

查看job

sqoop job --list

显示job

sqoop job --show myjob

删除job

sqoop job --delete myjob

执行job

sqoop job --exec pwdjob

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

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

相关文章

MySQL数据库和表管理

MySQL数据库和表管理一、常用的数据类型1、int(N)2、float(m,d)3、char与varchar二、查看数据库结构1、查看当前服务中的数据库2、查看数据库中存在的表3、查看表结构三、SQL语句1、SQL语言规范2、SQL语言分类四、创建、删除数据库和表1、创建数据库2、创建表3、删除数据表4、删…

云医疗信息系统源码(云HIS)商业级全套源代码

云his系统源码&#xff0c;有演示 一个好的HIS系统&#xff0c;要具有开放性&#xff0c;便于扩展升级&#xff0c;增加新的功能模块&#xff0c;支撑好医院的业务的拓展&#xff0c;而且可以反过来给医院赋能&#xff0c;最终向更多的患者提供更好地服务。 私信了解更多&…

HTTPS加密流程

什么是HTTPSHTTPS是加密后的HTTP,相当于:HTTPS HTTP SSL/TLSHTTPS是基于"密钥"来实现的,客户端将发送的数据用密钥进行加密,服务器将收到的数据用密钥解密.对称加密和非对称加密对称加密是指:交互双方共同使用同一个密钥进行加密 或 解密.如下(图中的客户端和服务器…

还不会CAD批量打印图纸?学会这招再也不怕

各位工程师&#xff0c;相信大家在工作过程中&#xff0c;经常会遇到需要打印大量图纸文件的时候&#xff0c;那么多的图纸&#xff0c;一张张打印太麻烦&#xff0c;此时便需要用到CAD批量打印功能啦&#xff01;可是&#xff0c;总有些新手设计师不直达奥CAD批量打印&#xf…

Spring事务及传播机制

概念 在MySQL中介绍过&#xff0c;当同一时间出现一起读写数据的情况&#xff0c;可能会导致最终的结果出错&#xff0c;因此可以使用事务来提高隔离级别 而Spring中也可以实现事务 手动添加事务 使用SpringBoot中的DataSourceTransactionManager对象可以获取事务&#xff0…

计算机科学导论笔记(六)

目录 八、算法 8.1 概念 8.1.1 非正式定义 8.1.2 示例 8.1.3 定义动作 8.1.4 细化 8.1.5 泛化 8.2 三种结构 8.2.1 顺序 8.2.2 判断 8.2.3 循环 8.3 算法的表示 8.3.1 UML 8.3.2 伪代码 8.4 更正式的定义 8.5 基本算法 8.5.1 求和 8.5.2 求积 8.5.3 最大和最…

Egg:使用joi进行参数校验以及注册接口小demo

目录 前言&#xff1a; 准备工作&#xff1a; 前端代码&#xff1a; 后端目录截图&#xff1a; 1.获取参数 2.校验参数 3.查询数据库中是否已经存在该用户 4.用户入库 5.测试一哈 添加用户成功 同样的用户名再注册一遍 ​编辑总结&#xff1a; 前言&#xff1a; 在阅…

C#基础之基础语法(一)

总目录 文章目录总目录前言一、C#简述1 C#是什么&#xff1f;2 .Net平台3. C# 和.Net的关系4. 集成开发环境&#xff08;IDE&#xff09;二、控制台应用程序1. 常用代码2.注意事项三、基础语法1.编写C#代码注意事项2.C#注释2. 变量&标识符&关键字4. 变量&#xff0c;字…

unity 面试汇总

1、什么是协同程序&#xff1f;答&#xff1a;在主线程运行时同时开启另一段逻辑处理&#xff0c;来协助当前程序的执行。换句话说&#xff0c;开启协程就是开启一个可以与程序并行的逻辑。可以用来控制运动、序列以及对象的行为。2、Unity3D中的碰撞器和触发器的区别&#xff…

【C++进阶】四、AVL树(二)

目录 前言 一、AVL树的概念 二、AVL树节点的定义 三、AVL树的插入 四、AVL树的旋转 4.1 左单旋 4.2 右单旋 4.3 左右双旋 4.4 右左双旋 五、AVL树的验证 六、AVL树的性能 七、完整代码 前言 前面对 map/multimap/set/multiset 进行了简单的介绍&#xff0c;在其文…

2023年湖北武汉安全员C证报考条件是什么?考试题型是什么 启程别

2023年湖北武汉安全员C证报考条件是什么&#xff1f;考试题型是什么 启程别 武汉安全员C证报考条件&#xff1a; 1.注册地在本市的施工单位在职“三类人员”可申请参加安全生产考核&#xff1b; 2、职业道德良好&#xff0c;身体健康&#xff0c;年龄不超过60周岁&#xff08…

pdf多页合并为一页方法总结,你觉得哪个最好?

PDF格式的文件在现代办公中是不可或缺的&#xff0c;许多人在工作中需要频繁处理PDF文档。然而&#xff0c;当我们需要阅读多个PDF文件时&#xff0c;不断切换不同的文件并一个一个地打开查阅会非常麻烦。为了提高阅读效率&#xff0c;人们一般会将pdf多页合并为一页。那么&…

传输线的物理基础(四):传输线的驱动和返回路径

驱动一条传输线对于将信号发射到传输线的高速驱动器&#xff0c;传输线在传输时间内的输入阻抗将表现得像一个电阻&#xff0c;相当于线路的特性阻抗。鉴于此等效电路模型&#xff0c;我们可以构建驱动器和传输线的电路&#xff0c;并计算发射到传输线中的电压。等效电路如下图…

虹科分享 | 网络流量监控 | 数据包丢失101

什么是数据包&#xff1f; 数据包是二进制数据的基本单位&#xff0c;在网络连接的设备之间编号和传输&#xff0c;无论是在本地还是通过互联网。一旦数据包到达其目的地&#xff0c;它就会与其他数据包一起按编号重新组合&#xff0c;回到最初传输的较大消息中。 数据包是我们…

2022(二等奖)C2594江淮分水岭植被碳汇时空可视化系统

作品介绍 一、需求分析 1.1 设计背景 气候变化是全球性问题&#xff0c;随着二氧化碳排放的增加生物的生存与生命受到威胁。人类活动对自然界生态系统的破坏&#xff0c;不仅降低了地球生物圈的生产力&#xff0c;威胁到人类社会未来经济的发展&#xff0c;同时还破坏了陆地与…

WireShark如何抓包,各种协议(HTTP、ARP、ICMP)的过滤或分析,用WireShark实现TCP三次握手和四次挥手

WireShark一、开启WireShark的大门二、如何抓包 搜索关键字2.1 协议过滤2.2 IP过滤2.3 过滤端口2.4 过滤MAC地址2.5 过滤包长度2.6 HTTP模式过滤三、ARP协议分析四、WireShark之ICMP协议五、TCP三次握手与四次挥手5.1 TCP三次握手实验5.2 可视化看TCP三次握手5.3 TCP四次挥手5.…

【大数据处理与可视化】一 、大数据分析环境搭建(安装 Anaconda 3 开发环境)

【大数据处理与可视化】一 、大数据分析环境搭建&#xff08;安装 Anaconda 3 开发环境&#xff09;实验目的实验内容实验步骤一、下载Anaconda安装包二、安装Anaconda3三、验证Anaconda是否安装成功四、Jupyter Notebook的使用1. 启动Anaconda自带的Jupyter Notebook2. 在code…

Volatile关键字

Volatile关键字和JMM内存模型一JUC并发包API 包介绍二JMM&#xff08;Java Memory Model&#xff09;三 volatile关键字3.1.可⻅性3.1.1.问题演示3.1.1.1案例代码3.1.1.2.案例分析3.1.2.volatile 保证可见性演示3.1.2.1对number添加了volatile修饰3.1.2.2运⾏结果是&#xff1a…

Docker学习(二十一)构建 java 项目基础镜像

目录1.下载 JDK 包2.编写 Dockerfile3.构建镜像4.创建容器测试1.下载 JDK 包 JDK各版本官网下载地址&#xff1a; https://www.oracle.com/java/technologies/downloads/archive/#JavaSE 这里我们以 JDK 8u351 为例&#xff0c;点击 Java SE (8U211 and later)。 点击下载 jd…

Mysql问题:[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause

1 问题描述 使用Navicat连接到MySQL(版本&#xff1a;8.0.18)&#xff0c;执行查询&#xff1a; select * from t_user WHERE user_name admin查询结果没有问题&#xff0c;但是报错&#xff1a; [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY claus…