Sqoop的产生背景
当需要将RDBMS上的数据抽取到Hadoop上,我们该怎么做?
方法:- file ==> load hive
拿到一个文件,load到Hive表中去 - shell ==> file ==> HDFS
通过编写shell脚本去RDBMS上拿到数据,然后通过hdfs shell中的put命令传到到HDFS上 - MapReduce
使用MapReduce将RDBMS上的数据,写到HDFS上去 (最常用的方式)
- file ==> load hive
当需要将Hadoop上的数据导到RDBMS上去,我们该怎么做?
方法:- MapReduce
同理,也可以使用MapReduce,将HDFS上的数据导入到RDBMS中来
- MapReduce
存在的问题
- 写MapReduce程序过于麻烦
- 效率低
当新进来一条业务线,就得写一个MapReduce(尤其在代码封装的不好的情况下,就显得更为麻烦)
基于存在的问题,抽取一个框架,如何进行设计?
- RDBMS层面
需要:driver/username/password/url/database/table/sql 等 - Hadoop层面
需要:hdfs path/分隔符/mappers数量/reducers数量 (reducer的数量决定了有多少个文件输出) 等 - 扩展一:当有一个新的业务线接入以后,那么我们只需要将新的业务线对应的参数传递给mapreduce即可
A) 使用hadoop jar的方式来提交作业
B) 动态的根据业务线的需求来传入参数 - 扩展二:如何用起来更爽 ==> 工匠精神
思路是什么? ==> WebUI + DB Configuration ==> UI/UE
相当于每一条业务线就是一行表记录,全部配置到数据库的表里去,用户只要在界面上点点就可以了,十分方便
- RDBMS层面
在上述的需求下,产生了Sqoop框架,而根据扩展二可以针对目前的Sqoop框架进行改进,进而在生产上更为方便的使用
Sqoop概述
官网:
官网介绍
Apache Sqoop(TM) is a tool designed for efficiently transferring bulk data between Apache Hadoop and structured datastores such as relational databases.
版本介绍
Note that 1.99.7 is not compatible with 1.4.6 and not feature complete, it is not intended for production deployment.
sqoop1和sqoop2是不兼容,就好比struts1和struts2之间不能兼容一样
Sqoop有2个版本:1.x 2.x(1.99.x)
名称的由来
Sqoop: SQL-to-Hadoop
SQoops ==> Sqoop
功能概述
RDBMS <==> Hadoop(HDFS/Hive/HBase….)
Sqoop是连接传统数据库到Hadoop之间的一个桥梁
运行原理
MapReduce程序的编写一定有Mapper和Reduce吗?
答案是否定的,MR程序的编写一定会有map,然而reduce不一定有
因此当我们使用MapReduce来完成导入操作,是否需要reduce?
答案是不需要reduce的,sqoop说白了就是一堆的map
注意:sqoop2是有reduce的,而sqoop1则没有
在sqoop1中底层为一个读写的操作,只需要map就能搞定,不需要reduce
因此提出问题:reduce可以决定输出的文件个数,没有reduce,输出的文件个数由谁决定呢?
其实通过map,也可以决定输出的文件个数
Sqoop架构
Sqoop1架构
把RDBMS上的数据通过Sqoop导入到HDFS中来:
Sqoop接收command后,发起一个命令,会有多个Map Task(Map Task数量可以设置),每个Map Task从关系型数据库中去读取数据(有几个Map Task,数据就会被拆分成多少片,每一个task去读那一片数据),然后进行执行。
注意:多个Map Task可以并行执行
Sqoop2架构
Metadata中存储配置信息(会提前配置好),因此客户端在提交的时候,不需要再输入这些配置信息,数据的安全性较好。
通过client来连线server端,再通过server来启动Map Task、Reduce Task来完成作业
Sqoop1与Sqoop2的对比
sqoop1都是以命令的方式进行执行的,而且是以一个客户端的小程序进行完成的 已经能满足大部分的生产需求
sqoop2安全性方面更好一些,但是用起来,有些许的麻烦,同时sqoop2还多了reduce task
Sqoop部署及help命令详解、简单使用
Sqoop部署
下载地址
http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.6-cdh5.7.0.tar.gz
解压文件到指定目录
$>tar -zxvf sqoop-1.4.6-cdh5.7.0.tar.gz -C /opt/app/
配置系统环境变量
$>vi /etc/profile
export SQOOP_HOME=/opt/app/sqoop-1.4.6-cdh5.7.0
export PATH=$SQOOP_HOME/bin:$PATH
生效环境变量
$>source /etc/profile
将mysql驱动拷贝到$SQOOP_HOME/lib/下
cp mysql-connector-java-5.1.39-bin.jar $SQOOP_HOME/lib/
配置$SQOOP_HOME/conf/sqoop-env.sh
export HADOOP_COMMON_HOME=/opt/app/hadoop-2.6.0-cdh5.7.0
export HADOOP_MAPRED_HOME=/opt/app/hadoop-2.6.0-cdh5.7.0
export HIVE_HOME=/opt/app/hive-1.1.0-cdh5.7.0
help命令的使用
使用help命令查看sqoop的用法:
$>sqoop help
$>sqoop list-databases --help
$>sqoop list-tables --help
简单使用
使用之前,事先 先在mysql数据库中创建sqoop数据库,导入两张表emp、dept
创建sqoop数据库
create database sqoop;
创建dept表
create table dept (
deptno numeric(2),
dname varchar(14),
loc varchar(13)
);
alter table DEPT
add constraint PK_DEPT primary key (DEPTNO);
insert into dept values (10, 'ACCOUNTING', 'NEW YORK');
insert into dept values (20, 'RESEARCH', 'DALLAS');
insert into dept values (30, 'SALES', 'CHICAGO');
insert into dept values (40, 'OPERATIONS', 'BOSTON');
创建emp表
create table emp (
empno numeric(4) not null,
ename varchar(10),
job varchar(9),
mgr numeric(4),
hiredate datetime,
sal numeric(7, 2),
comm numeric(7, 2),
deptno numeric(2)
);
alter table EMP
add constraint PK_EMP primary key (EMPNO);
alter table EMP
add constraint FK_DEPTNO foreign key (DEPTNO)
references DEPT (DEPTNO);
insert into emp values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
insert into emp values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
insert into emp values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
insert into emp values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
insert into emp values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
insert into emp values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);
insert into emp values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);
insert into emp values (7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000, null, 20);
insert into emp values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);
insert into emp values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
insert into emp values (7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100, null, 20);
insert into emp values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
insert into emp values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);
insert into emp values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);
sqoop使用入门
sqoop list-databases \
--connect jdbc:mysql://localhost:3306 \
--username root \
--password root
sqoop list-tables \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root
执行结果: