一、概述
Sqoop是一款开源的数据导入导出工具,可以将传统的关系型数据库导出至HDFS,也可以将HDFS中的数据导出至关系型数据库。
官网: http://sqoop.apache.org/
原理:在Hadoop生态体系中,计算基本依赖于MR,那么Sqoop也是如此,Sqoop就是将Sqoop语句翻译成MR程序,来实现一个数据导入和导出的操作。那就不难理解到Sqoop就是一个对于InpuFormat和OutputFormat进行特殊定制的MR程序。
二、Sqoop安装
2.1 下载
官方下载地址:http://www.apache.org/dyn/closer.lua/sqoop/1.4.7
2.2 解压
上传至Linux 服务器,解压在相关位置即可。
2.3 修改配置文件
将conf目录下的sqoop-env.template.sh改名
mv sqoop-env-template.sh sqoop-env.sh
vi sqoop-env.sh
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/home/hadoop/hadoop-2.8.4
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/home/hadoop/hadoop-2.8.4
#set the path to where bin/hbase is available
#export HBASE_HOME=/home/hadoop/hadoop-2.8.4
#Set the path to where bin/hive is available
export HIVE_HOME=/home/hive/hive-1.2.2
#Set the path for where zookeper config dir is
#export ZOOCFGDIR=
2.4 拷贝JDBC驱动
将Mysql或者其他使用到的数据的JDBC驱动拷贝到Sqoop根目录下lib目录。
3.5 验证启动
sqoop-version
预期的输出:
15/12/17 14:52:32 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
Sqoop 1.4.6 git commit id 5b34accaca7de251fc91161733f906af2eddbe83
Compiled by abe on Fri Aug 1 11:19:26 PDT 2015
./sqoop-list-databases --connect jdbc:mysql://192.168.134.1:3306 --username root --password yhm1211.
预期输出:
18/10/23 17:09:44 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
18/10/23 17:09:44 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
18/10/23 17:09:45 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
information_schema
hive
mysql
performance_schema
shortvideo
test
三、使用
3.1 导出数据
导入数据使用export关键字,指的就是从大数据集群导入至传统的关系型数据库
3.1.1 HDFS 到RDBMS
这里以 MySQL 为例
准备数据
准备数据需要在Mysql中建立新表
DROP TABLE IF EXISTS `logs`;
CREATE TABLE `logs` (
`uuid` varchar(255) NOT NULL,
`userid` varchar(255) DEFAULT NULL,
`fromUrl` varchar(255) DEFAULT NULL,
`dateString` varchar(255) DEFAULT NULL,
`timeString` varchar(255) DEFAULT NULL,
`ipAddress` varchar(255) DEFAULT NULL,
`browserName` varchar(255) DEFAULT NULL,
`pcSystemNameOrmobileBrandName` varchar(255) DEFAULT NULL,
`systemVersion` varchar(255) DEFAULT NULL,
`language` varchar(255) DEFAULT NULL,
`cityName` varchar(255) DEFAULT NULL,
PRIMARY KEY (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
数据导出
这里数据是使用MR进行清洗后得到的数据
sqoop export \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--export-dir /clean01 \
--input-fields-terminated-by ' ' \
--m 1
3.2 导入数据
导入数据使用import关键字,指的就是从传统的关系型数据库导入至大数据集群
3.2.1 RDBMS 到 HDFS
准备数据
数据库中还是上述文档中创建的logs。将logs中的数据导入至HDFS
导入数据
(1)全部导入
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--target-dir /sqoop_test/clean01 \
--num-mappers 1 \
--fields-terminated-by " " \
(2)条件导入
通过手动指定查询条件导入数据 ,在查询语句中必须包含$CONDITIONS关键字
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--target-dir /sqoop_test/clean03 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by " " \
--query 'select * from logs where $CONDITIONS limit 1,5'
(3)导入指令列
其实和手动输入查询条件时一样的效果 注意: 多列之间使用逗号进行分割
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--target-dir /sqoop_test/clean05 \
--num-mappers 1 \
--fields-terminated-by " " \
--columns userid,cityName
3.2.2 RDBMS 到 Hive
准备数据
还是上述建表语句
导入数据
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--num-mappers 1 \
--hive-import \
--fields-terminated-by " " \
--hive-overwrite \
--hive-database default \
--hive-table logs \
--delete-target-dir
填坑三部曲
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-APNwyP6t-1593839446284)(assets/1561101710156.png)]
解决办法: cp /home/hive/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar /home/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/lib/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1dvJ4GYF-1593839446287)(assets/1561101745739.png)]
解决办法: cp /home/hive/apache-hive-1.2.1-bin/lib/hive-exec-1.2.1.jar /home/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/lib/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sHGNg56O-1593839446290)(assets/1561101798068.png)]
这里可以看出当前使用hive中logs是带有分区的,但是在导入的时候没有去指定具体是哪个分区,所以问题就在这里。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1bUrtR64-1593839446292)(assets/1561101986300.png)]
从 sqoop import --help 给出帮助指令可以看到sqoop也提供了相关的解决方案,那只需要在上述语句中加入相关字段即可:–hive-partition-key day|–hive-partition-value 19-06-20
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--num-mappers 1 \
--hive-import \
--fields-terminated-by " " \
--hive-overwrite \
--hive-database default \
--hive-table logs \
--delete-target-dir \
--hive-partition-key day \
--hive-partition-value 19-06-20
3.2.3 RDBMS 到 HBase
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--columns "uuid,userid,fromurl" \
--column-family "log_basic" \
--hbase-create-table \
--hbase-row-key "uuid" \
--hbase-table "logs" \
--num-mappers 1 \
--split-by uuid
很幸运,使用Sqoop1.4.7中可以在HBase1.2.4中自动建立相关表
四、常见参数详解
4.1 顶级命令列举
来源 sqoop-help
命令 | 说明 |
---|---|
codegen | 数据生成Java并打包 |
create-hive-table | 获取数据库中某张表 |
eval | 查看 SQL 执行结果 |
export | 将集群数据导出 |
help | 打印 sqoop 帮助信息 |
import | 将数据导入到集群 |
import-all-tables | 导入某个数据库下所有表到 HDFS 中 |
import-mainframe | 将数据集从大型机服务器导入到HDFS |
job | 用来生成一个 sqoop的任务,生成后,该任务并不执行,除非使用命令执行该任务。 |
list-databases | 列出所有数据库名 |
list-tables | 列出某个数据库下所有表 |
merge | 将 HDFS 中不同目录下面的数据合在一起,并存放在指定的目录中 |
metastore | 记录 sqoop job 的元数据信息,如果不启动 metastore 实例,则默认的元数据存储目录为:~/.sqoop,如果要更改存储目录,可以 在 配 置 文 件sqoop-site.xml中进行更改。 |
version | 打印 sqoop 版本信息 |
4.2 顶级命令详解
export是导出至RDBMS
4.2.1 共用参数:数据库
序号 | 参数 | 说明 |
---|---|---|
1 | –connect | 连接关系型数据库的 URL |
2 | –connection-manager | 指定要使用的连接管理类 |
3 | –driver | Hadoop 根目录 |
4 | –help | 打印帮助信息 |
5 | –password | 连接数据库的密码 |
6 | –username | 连接数据库的用户名 |
7 | –verbose | 在控制台打印出详细信息 |
4.2.2 共用参数: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 | 给带有双引号或单引号的字段值前后加上指定字符 |
4.2.3 共用参数:export
序号 | 参数 | 说明 |
---|---|---|
1 | –input-enclosed-by | 对字段值前后加上指定字符 |
2 | –input-escaped-by | 对含有转移符的字段做转义处理 |
3 | –input-fields-terminated-by | 字段之间的分隔符 |
4 | –input-lines-terminated-by | 行之间的分隔符 |
5 | –input-optionally-enclosed-by | 给带有双引号或单引号的字段前后加上指定字符 |
4.2.4 共用参数: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 |
4.3 次级参数详解
次级参数值得就是使用导出或者导入时使用的相关参数,均可使用–help来获得
4.3.1 import
import导入命令在上述文档中已经提到过,在这里就不再列举基本的操作,而是对数据进行增量操作
增量导入
首先是增量导入数据至Hive,但是指的注意的是现在不能指定hive相关的参数,说白了就是使用导入HDFS的方式导入hive,在此基础上加上增量导入相关参数
准备数据
开始导入
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table user01 \
--hive-import
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--target-dir /user/hive/warehouse/logs/day=19-06-20 \
--num-mappers 1 \
--fields-terminated-by " " \
--incremental append \
--check-column uuid \
-m 1
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--target-dir /user/hive/warehouse/logs/day=19-06-20 \
--num-mappers 1 \
--fields-terminated-by " " \
--append \
-m 1
给自己加个油,给明天一个笑脸