Sqoop的产生背景 & 概述 & 架构 & 部署 & 简单使用

来源:互联网 发布:淘宝店铺最高等级 编辑:程序博客网 时间:2024/06/08 18:40

Sqoop的产生背景

  1. 当需要将RDBMS上的数据抽取到Hadoop上,我们该怎么做?
    方法:

    • file ==> load hive
      拿到一个文件,load到Hive表中去
    • shell ==> file ==> HDFS
      通过编写shell脚本去RDBMS上拿到数据,然后通过hdfs shell中的put命令传到到HDFS上
    • MapReduce
      使用MapReduce将RDBMS上的数据,写到HDFS上去 (最常用的方式)
  2. 当需要将Hadoop上的数据导到RDBMS上去,我们该怎么做?
    方法:

    • MapReduce
      同理,也可以使用MapReduce,将HDFS上的数据导入到RDBMS中来
  3. 存在的问题

    • 写MapReduce程序过于麻烦
    • 效率低
      当新进来一条业务线,就得写一个MapReduce(尤其在代码封装的不好的情况下,就显得更为麻烦)
  4. 基于存在的问题,抽取一个框架,如何进行设计?

    • RDBMS层面
      需要:driver/username/password/url/database/table/sql 等
    • Hadoop层面
      需要:hdfs path/分隔符/mappers数量/reducers数量 (reducer的数量决定了有多少个文件输出) 等
    • 扩展一:当有一个新的业务线接入以后,那么我们只需要将新的业务线对应的参数传递给mapreduce即可
      A) 使用hadoop jar的方式来提交作业
      B) 动态的根据业务线的需求来传入参数
    • 扩展二:如何用起来更爽 ==> 工匠精神
      思路是什么? ==> WebUI + DB Configuration ==> UI/UE
      相当于每一条业务线就是一行表记录,全部配置到数据库的表里去,用户只要在界面上点点就可以了,十分方便

在上述的需求下,产生了Sqoop框架,而根据扩展二可以针对目前的Sqoop框架进行改进,进而在生产上更为方便的使用

Sqoop概述

官网:

网址:
http://sqoop.apache.org/

官网介绍

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/profileexport SQOOP_HOME=/opt/app/sqoop-1.4.6-cdh5.7.0export 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.0export HADOOP_MAPRED_HOME=/opt/app/hadoop-2.6.0-cdh5.7.0export 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 DEPTadd 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 EMPadd constraint PK_EMP primary key (EMPNO);alter table EMPadd 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 

执行结果:
这里写图片描述

原创粉丝点击