0x00 教程内容
- Sqoop的下载与解压
- Sqoop的配置及校验
- Sqoop的入门案例
说明:
1、Sqoop版本有1和2,这里教程是1版本
2、因为Sqoop其实跑的就是MapReduce作业,所以需要确保HDFS、YARN有没有安装配置成功
3、此教程演示导入MySQL数据到HDFS,所以需先安装好MySQL
0x01 Sqoop的下载与解压
1. 下载
a. 网站
http://www.apache.org/dyn/closer.lua/sqoop/1.4.7
b. 其他镜像下载
http://mirrors.hust.edu.cn/apache/sqoop/1.4.7/
c. 这里统一下载(版本没有特别要求hadoop-2.6.0适用于2.7.x)
sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
2. 解压
a. 上传安装包到master,并解压到~/bigdata
0x02 Sqoop的配置及校验
1. 配置Sqoop环境变量
a. 配置Sqoop环境变量
vi ~/.bash_profile
添加内容:
export SQOOP_HOME=/home/hadoop-sny/bigdata/sqoop-1.4.7.bin__hadoop-2.6.0 PATH=$PATH:$SQOOP_HOME/bin
使环境变量生效
source ~/.bash_profile
2. 校验Sqoop
a. 将Mysql的JDBC驱动jar包上传到$SQOOP_HOME/lib
目录
b. 查看版本号(有则表示成功,警告信息可以忽略,还没有启动相关的组件而已)
sqoop version
c. 查看帮助列表(具体命令的帮助可再加命令,如:sqoop help list-databases
)
sqoop help
d. 通过Sqoop列出Mysql的数据库(命令可以参考上面help的提示)
前提:需要安装好Mysql(我安装在master机器,账号密码都是:root)
sqoop list-databases --connect jdbc:mysql://master:3306 --username root --password root
0x03 Sqoop的入门案例之MySQL到HDFS
1. 准备MySQL数据
a. 为了演示,我在MySQL里新建一张演示表:sny_teacher
CREATE TABLE `sny_teacher` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '教师表id', `username` varchar(50) NOT NULL COMMENT '用户名', `password` varchar(50) NOT NULL COMMENT '用户密码,MD5加密', `email` varchar(50) DEFAULT NULL COMMENT 'email', `wechat` varchar(50) DEFAULT NULL COMMENT '微信', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL COMMENT '最后一次更新时间', PRIMARY KEY (`id`), UNIQUE KEY `user_name_unique` (`username`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;
b. 插入几条数据
INSERT INTO `sny_teacher` VALUES ('1', 'shaonaiyi', '427338237BD929443EC5D48E24FD2B1A', 'shaonaiyi@163.com', 'shaonaiyi888', '2019-09-06 16:56:45', '2019-09-07 19:27:36'), ('2', 'shaonaier', '427338237BD929443EC5D48E24FD2B1A', 'shaonaier@163.com', 'shaonaier888', '2019-09-06 16:56:46', '2019-09-07 19:27:37');
2. 导入MySQL数据到HDFS
a. 启动HDFS和YARN(start-dfs.sh
、start-yarn.sh
)
b. 将Mysql中的sny_teacher
表数据导入到HDFS中
sqoop import --connect jdbc:mysql://master:3306/sny --username root --password root --table sny_teacher
没有报错,但是我们没有指定导入数据到哪里,也没有其他的限制,均是使用默认的。
3. 校验是否导入成功
a. 查看HDFS上的数据
hadoop fs -ls /user/hadoop-sny/
hadoop fs -ls /user/hadoop-sny/sny_teacher
其实数据是默认放到了/user/用户名/表名这个路径下面的。
b. 继续查看里面的内容
hadoop fs -cat /user/hadoop-sny/sny_teacher/part-m-00000
hadoop fs -cat /user/hadoop-sny/sny_teacher/part-m-00001
4. 彩蛋之实现导入HDFS数据到Hive
a. 启动Hive客户端
hive
b. 在Hive中新建对应MySQL表sny_teacher
的Hive表
CREATE DATABASE IF NOT EXISTS sny; USE sny; DROP TABLE IF EXISTS sny_teacher; CREATE TABLE sny_teacher( id INT, username STRING, password STRING, email STRING, wechat STRING, create_time STRING, update_time STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; LOAD DATA INPATH 'hdfs://master:9999/user/hadoop-sny/sny_teacher' OVERWRITE INTO TABLE sny_teacher;
执行完此步骤,其实已经没有 hdfs://master:9999/user/hadoop-sny/sny_teacher
此文件夹了。
0x04 Sqoop的入门案例之HDFS到MySQL
1. 准备HDFS数据
a. 因为刚刚将/user/hadoop-sny/sny_teacher是文件夹和数据都删除了,所以需要再导入一份进来
sqoop import --connect jdbc:mysql://master:3306/sny --username root --password root --table sny_teacher
2. 新建MySQL对应表
b. 在MySQL中新建sny_teacher1表,用于等下将HDFS上的数据导入到此表中:
CREATE TABLE `sny_teacher1` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '教师表id', `username` varchar(50) NOT NULL COMMENT '用户名', `password` varchar(50) NOT NULL COMMENT '用户密码,MD5加密', `email` varchar(50) DEFAULT NULL COMMENT 'email', `wechat` varchar(50) DEFAULT NULL COMMENT '微信', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL COMMENT '最后一次更新时间', PRIMARY KEY (`id`), UNIQUE KEY `user_name_unique` (`username`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;
3. 从HDFS导出数据到MySQL
a. 从MySQL导出数据到HDFS上,默认是以逗号进行分割,所以此处是使用逗号
sqoop export --connect jdbc:mysql://master:3306/sny \ --username root --password root \ --table sny_teacher1 --m 1 \ --export-dir /user/hadoop-sny/sny_teacher/ \ --input-fields-terminated-by ','
0x05 Sqoop的入门案例之Hive到MySQL
1. 创建MySQL表
CREATE TABLE `sny_teacher2` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '教师表id', `username` varchar(50) NOT NULL COMMENT '用户名', `password` varchar(50) NOT NULL COMMENT '用户密码,MD5加密', `email` varchar(50) DEFAULT NULL COMMENT 'email', `wechat` varchar(50) DEFAULT NULL COMMENT '微信', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL COMMENT '最后一次更新时间', PRIMARY KEY (`id`), UNIQUE KEY `user_name_unique` (`username`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;
2. 导出Hive表中的数据到MySQL
a. Hive的默认存储路径为/user/hive/warehouse/sny.db/sny_teacher
sqoop export --connect jdbc:mysql://master:3306/sny \ --username root --password root \ --table sny_teacher2 --m 1 \ --export-dir /user/hive/warehouse/sny.db/sny_teacher \ --input-fields-terminated-by ','
其实,导完后,Hive中还是有数据的。
0xFF 总结
更多教程,可参考:使用Sqoop导出MySQL数据到Hive(实战案例)
Sqoop1导入表数据命令的参数可以输入:sqoop help import 查看
如根据id进行分区:
sqoop import --connect jdbc:mysql://master:3306/movie --username root --password root --table movie --split-by id
还有其他参数,如:--target-dir、--warehouse-dir等等
在MySQL中添加几条数据,然后重新执行命令,以进行增量导入,如:sqoop import --connect jdbc:mysql://master:3306/sny --username root --password root --table sny_teacher --split-by id --check-column id --last-value 2 --incremental append
--check-column 核实数据类型 --last-value 上一次导入数据检查列的最大值 --incremental 增量导入的模式