Sqoop的安装和使用
概述
Sqoop是一款开源的数据导入导出工具,可以将传统的关系型数据库导出至HDFS,也可以将HDFS中的数据导出至关系型数据库。
原理
:在Hadoop生态体系中,计算基本依赖于MR,那么Sqoop也是如此,Sqoop就是将Sqoop语句翻译成MR程序,来实现一个数据导入和导出的操作。那就不难理解到Sqoop就是一个对于InpuFormat和OutputFormat进行特殊定制的MR程序。
安装
下载
官方下载地址:http://www.apache.org/dyn/closer.lua/sqoop/1.4.7
解压
上传至Linux 服务器,解压在相关位置即可。
修改配置文件
将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=
拷贝JDBC驱动
将Mysql或者其他使用到的数据的JDBC驱动拷贝到Sqoop根目录下lib目录。
验证启动
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
使用
导出数据
导入数据使用export关键字,指的就是从大数据集群导入至传统的关系型数据库
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
导入数据
导入数据使用import关键字,指的就是从传统的关系型数据库导入至大数据集群
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
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
填坑三部曲
解决办法: 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/
解决办法: 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/
这里可以看出当前使用hive中logs是带有分区的,但是在导入的时候没有去指定具体是哪个分区,所以问题就在这里。
从 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
hive到mysql
sqoop export \
--connect "jdbc:mysql://192.168.134.151:3306/logs?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password yhm1211. \
--table logs \
--export-dir /user/hive/warehouse/logs/day=18-10-18 \
--input-fields-terminated-by ' ' \
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
Mysql编码问题
在使用Sqoop导出数据的过程中,特别是从Linux到Win的数据库的过程中,很容易出现编码不一致的问题。
使用下面的文档将数据库编码更改为统一编码。
使用Sqoop1.4.7中可以在HBase1.2.4中自动建立相关表
一、mysql中的编码
mysql> show variables like 'collation_%';
mysql> show variables like 'character_set_%';
缺省是latin1编码,会导致中文乱码。
修改库的编码:
mysql> alter database db_name character set utf8;
修改表的编码:
mysql> ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
可以在mysql中设置编码,单个设置
mysql> set character_set_connection=utf8;
mysql> set character_set_database=utf8;
mysql> set character_set_results=utf8;
mysql> set character_set_server=utf8;
但重启后会失效。
可以修改配置文件:
[root@Hadoop48 ~]# vi /etc/my.cnf
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8
character_set_server=utf8
init_connect='SET NAMES utf8'
重启mysql,这样确保缺省编码是utf8
连接命令
?useUnicode=true&characterEncoding=UTF-8
常见参数详解
https://blog.youkuaiyun.com/myrainblues/article/details/43673129
https://blog.youkuaiyun.com/wtzhm/article/details/81810159
顶级命令列举
来源 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版本信息 |
顶级命令详解
export是导出至RDBMS
- 共用参数:数据库
参数 | 说明 |
---|---|
–connect | 连接关系型数据库的 URL |
–connection-manager | 指定要使用的连接管理类 |
–driver | Hadoop根目录 |
–help | 打印帮助信息 |
–password | 连接数据库密码 |
–username | 连接数据库的用户名 |
–verbose | 在控制台打印出详情信息 |
- 共用参数:import
参数 | 说明 |
---|---|
–enclosed-by | 给字段值前加上指定的字符 |
–escaped-by | 对字段中的双引号加转义符 |
–fields-terminated-by | 设定每个字段是以什么符号作为结束,默认为逗号 |
–lines-terminated-by | 设定每行记录之间的分隔符,默认是\n |
–mysql-delimiters | Mysql 默认的分隔符设置,字段之间以逗号分隔,行之间以\n 分隔,默认转义符是\,字段值以单引号包裹 |
–optionally-enclosed-by | 给带有双引号或单引号的字段值前后加上指定字符 |
- 共用参数:export
参数 | 说明 |
---|---|
–input-enclosed-by | 对字段值前后加上指定字符 |
–input-escaped-by | 对含有转移符的字段做转义处理 |
–input-fields-terminated-by | 字段之间的分隔符 |
–input-lines-terminated-by | 行之间的分隔符 |
–input-optionally-enclosed-by | 给带有双引号或单引号的字段前后加上指定字符 |
- 共用参数:hive
参数 | 说明 |
---|---|
–hive-delims-replacement | 用自定义的字符串替换掉数据中的\r\n和\013 \010等字符 |
–hive-drop-import-delims | 在导入数据到 hive 时,去掉数据中的\r\n\013\010 这样的字符 |
–map-column-hive | 生成 hive 表时,可以更改生成字段的数据类型 |
–hive-partition-key | 创建分区,后面直接跟分区名,分区字段的默认类型为string |
–hive-partition-value | 导入数据时,指定某个分区的值 |
–hive-home
| hive 的安装目录,可以通过该参数覆盖之前默认配置的目录 |
–hive-import | 将数据从关系数据库中导入到 hive 表中 |
–hive-overwrite | 覆盖掉在 hive 表中已经存在的数据 |
–create-hive-table | 默认是 false,即,如果目标表已经存在了,那么创建任务失败 |
–hive-table | 后面接要创建的 hive 表,默认使用 MySQL 的表名 |
次级参数详解
次级参数值得就是使用导出或者导入时使用的相关参数,均可使用–help来获得
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