Sqoop常用命令

Sqoop基本使用

安装

需配置目录
添Jar包

列出所有数据库

1
sqoop list- s --connect jdbc:mysql://192.168.0.106:3306/ --username root --password root

导入到HDFS

1
2
3
4
5
6
7
8
9
sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/51jobpy \
--username root \
--password "root" \
--table table1 \
--target-dir /sqoopdata1 \
--delete-target-dir \
--fields-terminated-by '`' \
--m 1

导入到Hive

1
2
3
4
5
6
7
8
9
sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/51jobpy \
--username root \
--password root \
--table table1 \
--hive-import \
--m 1 \
--fields-terminated-by '`' \
--hive-database test;

数据的子集

1
2
--where <condition>
"where"子句的一个子集。它执行在各自的数据库服务器相应的SQL查询,并将结果存储在HDFS的目标目录。

Hive导出到mysql

1
2
3
4
5
6
7
Sqoop export \
--connect jdbc:mysql://127.0.0.1:3306/dbname \
--username mysql \
--password 123456 \
--table student \
--hcatalog-database sopdm(hive上的) \
--hcatalog-table student(hive上的)

HDFS导出到mysql

1
2
3
4
5
6
7
sqoop export \
--connect jdbc:mysql://192.168.0.106:3306/userdb \
--username root \
--password 123456 \
--table emp_out \
--export-dir /sqoop/emp \
--input-fields-terminated-by ','

常用指令

sql to hadoop

https://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html

命令&参数详解

刚才列举了一些Sqoop的常用命令,对于不同的命令,有不同的参数,让我们来一一列举说明。

首先来我们来介绍一下公用的参数,所谓公用参数,就是大多数命令都支持的参数。

公用参数:数据库连接

序号 参数 说明
1 –connect 连接关系型数据库的URL
2 –connection-manager 指定要使用的连接管理类
3 –driver Hadoop根目录
4 –help 打印帮助信息
5 –password 连接数据库的密码
6 –username 连接数据库的用户名
7 –verbose 在控制台打印出详细信息

公用参数:import

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

公用参数:export

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

公用参数:hive

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

小总结

1 Sqoop参数

/ opt /模块/ sqoop / bin / sqoop导入\

-连接\

- 用户名 \

-密码\

–target-dir \

–delete-target-dir \

–num-mappers \

–fields终止于\

–query“ $ 2”’和$ CONDITIONS;’

2 Sqoop导入导出Null存储一致性问题

Hive中的Null在其中以“ \ N”来存储,而MySQL中的Null在实质上就是Null,为了保证数据相互一致。在导出数据时采用–input-null-string和–input- null-non-string两个参数。导入数据时采用–null-string和–null-non-string。

3 Sqoop数据导出一致性问题

场景1:如Sqoop在导出到Mysql时,使用4个Map任务,过程中有2个任务失败,那时候MySQL中存储了另外两个Map任务导入的数据,此时老板正好看到了这个报表数据。而开发工程师发现任务失败后,会调试问题并最终将全部数据正确的引入MySQL,那后面的老板再次看报表数据,发现本次看到的数据与之前的替代,这在生产环境是容许的。

官网:
http : //http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html

由于Sqoop将导出过程分解为多个事务,因此失败的导出作业可能会导致将部分数据提交到数据库。在某些情况下,这可能进一步导致后续作业因插入冲突而失败,而在其他情况下,则可能导致数据重复。您可以通过–staging-table选项指定暂存表来解决此问题,该选项用作用于暂存导出数据的辅助表。最后,已分阶段处理的数据将在单个事务中移至目标表。

–staging-表方式

sqoop export –connect jdbc:mysql://192.168.137.10:3306 / user_behavior –username root –password 123456 –table app_cource_study_report –columns watch_video_cnt,complete_video_cnt,dt-以“ \ t”结尾的字段-export-dir“ /user/hive/warehouse/tmp.db/app_cource_study_analysis_${day}” –登台表app_cource_study_report_tmp –clear-staging-table –input-null-string’\ N’

4 Sqoop长期运行的任务是什么

只有Map阶段,没有Reduce阶段的任务。而是4个MapTask。

5 Sqoop一天导入多少数据

100万日活=》 10万订单,1人10条,每天1g左右业务数据

Sqoop每天将1G的数据量导入到数仓。

6 Sqoop数据导出的时候一次执行多长期

每天晚上00:30开始执行,Sqoop任务一般情况40 -50分钟的都有。取决于数据量(11:11,6:18等活动在1个小时左右)。

7 Sqoop在导入数据的时候数据倾斜

https://blog.csdn.net/lizhiguo18/article/details/103969906

Sqoop抽数的并行化主要涉及到两个参数:num-mappers:启动N个map来并行导入数据,分成4个;拆分为:按照并列来切分表的工作单元。

通过ROWNUM()生成一个严格的均匀分布的细分,然后指定为分割分段

8 Sqoop数据导出Parquet(项目中遇到的问题)

Ads层数据用Sqoop往MySql中导入数据的时候,如果用了orc(Parquet)不能导入,需转化成文本格式

(1)创建临时表,把Parquet中表数据导入到临时表,把临时表转换到目标表用于可视化

(2)Sqoop里面有参数,可以直接把Parquet转换为text

(3)ads层建表的时候就不要建Parquet表

NULL

使用sqoop命令从mysql导入hdfs中。

sqoop import
–connect jdbc:mysql://localhost:3306/sqoop
–username root
–password root
–table student
–null-string ‘@@@’
–null-non-string ‘###’

备注:

–null-string含义是 string类型的字段,当Value是NULL,替换成指定的字符,该例子中为@@@

–null-non-string 含义是非string类型的字段,当Value是NULL,替换成指定字符,该例子中为###

–input-null-string ‘\N’ –input-null-non-string ‘\N’