教程目录
- 0x00 教程内容
- 0x01 Sqoop的下载与解压
- 0x02 Sqoop的配置及校验
- 0x03 Sqoop的入门案例之MySQL到HDFS
- 0x04 Sqoop的入门案例之HDFS到MySQL
- 0x05 Sqoop的入门案例之Hive到MySQL
- 0xFF 总结
0x00 教程内容
- Sqoop的下载与解压
- Sqoop的配置及校验
- Sqoop的入门案例
说明:
1、Sqoop版本有1和2,这里教程是1版本
2、因为Sqoop其实跑的就是MapReduce作业,所以需要确保HDFS、YARN有没有安装配置成功
3、此教程演示导入MySQL数据到HDFS,所以需先安装好MySQL
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
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
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
此文件夹了。
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 增量导入的模式
作者简介:邵奈一
全栈工程师、市场洞察者、专栏编辑
| 公众号 | 微信 | 微博 | CSDN | 简书 |
福利:
邵奈一的技术博客导航
邵奈一 原创不易,如转载请标明出处。