一.Sqoop简介
Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
二.Sqoop原理
将导入或导出命令翻译成mapduce程序来实现。在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。
三.下载安装
参照此进行安装。
四.Sqoop简单使用案例
4.1导入数据
在Sqoop中“导入”是指从非大数据集群(RDBMS)向大数据集群(HDFS\Hive\HBase)中传输数据,叫做:导入,即使用import关键字。与其相反称之为导出,即使用关键字“export”。
4.2从RDBMS到HDFS
确定Mysql服务开启正常;在Mysql数据库中新建一张表并插入数据。
Mysql建库建表
create database company;
create table company.staff(
id int(4) primary key not null auto_increment,
name varchar(255),
sex varchar(255));
插入测试数据
insert into company.staff(name,sex) values("Thcmas","Male");
insert into company.staff(name,sex) values(‘Catalina’,’ReMale’);
Mysql --> HDFS 注意:粘贴以下时把“#号”前面的空格以及“#号”后面的内容删掉。
1.全部导入
sqoop import \ # 启动sqoop命令 导入 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--table 表 \ # 即将导入的表名
--target-dir /路径名/路径名 \ # 导入的路径(没有HFDS会创建)
--delete-target-dir \ # 删除原先已有的表
--num-mappers 1 \ # map工作数(自己确定就行了)
--fields-terminated-by "\t" # 指定分隔符不指定会粘到一块
2.查询select导入
sqoop import \ # 启动sqoop导入 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--target-dir /路径名/路径名 \ # 导入的路径(没有HFDS会创建?)
--delete-target-dir \ # 删除原先已有的表
--num-mappers 1 \ # map工作数(自己确定就行了)
--fields-terminated-by "\t" # 指定分隔符
--query " 列1,列2,列3 from 表 where 列1 <=1 and \$CONDITIONS;" # 保证在多个map任务时保证数据顺序前后一致
3.指定columns导入
sqoop import \ # 启动sqoop导入 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--table 表 \ # 即将导入HDFS的表名
--columns 列1,列2 \ # 指定列名导出
--target-dir /路径名/路径名 \ # 导入的路径(没有HFDS会创建?)
--delete-target-dir \ # 删除原先已有的表
--num-mappers 1 \ # map工作数(自己确定就行了)
--fields-terminated-by "\t" # 指定分隔符
4.关键字where+columns筛选导入
sqoop import \ # 启动sqoop导入 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--table 表 \ # 即将导入HDFS的表名
--columns 列1,列2 \ # 指定列名导入
--where 列1条件 \ # 指定列条件进行导入
--target-dir /路径名/路径名 \ # 导入的路径(没有HFDS会创建?)
--delete-target-dir \ # 删除原先HDFS已有的表
--fields-terminated-by "\t" # 指定分隔符
--num-mappers 1 \ # map工作数(自己确定就行了)
Mysql --> HDFS --> Hive
sqoop import \ # 启动sqoop导入 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--table 表 \ # 即将导入HDFS的表名
--columns 列1,列2 \ # 指定列名导入
--where 列1条件 \ # 指定列条件进行导入
--hive-import \ # 又从HDFS导入hive
--hive-database 库\ # 导入的指定库名
--hive-table 表 \ # 将要导入的hive表
--hive-overwrite \ # 覆盖原先hive已有的表
--fields-terminated-by "\t" # 指定分隔
--num-mappers 1 \ # map工作数(自己确定就行了)这放后面好看点
RDBMS --> HDFS --> HBase
sqoop import \ # 启动sqoop导入 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--table 表 \ # 即将导入HDFS的表名
--columns 列1,列2 \ # 指定列名导入
--where 列1条件 \ # 指定列条件进行导入
--hbase-create-table \ # 是否创建表?
--hbase-table "表名" \ # 指定要导入的HBase中的表名
--column-family "hbase列族" \ # 指定要导入的HBase表的列族
--hbase-row-key "mysql列" \ # 指定mysql中的某一列作为HBase表中的rowkey
--split-by id \ # 指定mysql中的某一列作为分区导入。默认是主键
--num-mappers 1 \ # map工作数(自己确定就行了)
4.3(从HDFS/Hive导出到RDBMS) HDFS与Hive语法一样
sqoop export \ # 启动sqoop导出 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)导出到mysql的库名
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--table 表 \ # 导出到mysql的表名
--export-dir /路径名/路径名/路径名 \ # 从hdfs&hive导出的hive/hdfs文件路径
--input-fields-terminated-by "\t" \ # 从hdfs&hive导出的指定切割符
--num-mappers 1 \ # map工作数
五. Shell拓展
可利用shell编写脚本实现;减少麻烦
# vim test.sh Linux下编译名为test.sh的shell脚本。扩展名并不影响脚本执行,见名知意就好。添加以下内如。
#!/bin/bash #告诉系统这个脚本需要什么解释器来执行
sqoop import \ # 启动sqoop命令 导入 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--table 表 \ # 即将导入的表名
--target-dir /路径名/路径名 \ # 导入的路径(没有HFDS会创建)
--delete-target-dir \ # 删除原先已有的表
--num-mappers 1 \ # map工作数(自己确定就行了)
--fields-terminated-by "\t" # 指定分隔符不指定会粘到一块
:wq 保存退出
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本