Sqoop基本使用
安装
需配置目录
添Jar包
列出所有数据库
1 | sqoop list- s --connect jdbc:mysql://192.168.0.106:3306/ --username root --password root |
导入到HDFS
1 | sqoop import \ |
导入到Hive
1 | sqoop import \ |
数据的子集
1 | --where <condition> |
Hive导出到mysql
1 | Sqoop export \ |
HDFS导出到mysql
1 | sqoop export \ |
常用指令
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’