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

标签: sqoop

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/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 

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

版权声明:本文为lemonZhaoTao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lemonZhaoTao/article/details/78279166

智能推荐

FFMPEG完美入门资料---002---FFmpeg 支持能力说明

接着上文写: 2.3.1 FFmpeg 对编码解码器的支持 ffmpeg 支持的编解码器种类共有 280 多种, 涵盖了几乎所有常见音视频编码格式, 能解码几乎所有的音视频, 每种音视频编解码器的实现都在 libavcodec 目录下有具体的 C 语言实现。 * 注:编码器和解码器的名称不是完全匹配的,因此有些编码器没有对应相同名称的解码器,反之, 解码器也一样。即使编码和解码都支持也不一定是完全...

20145107 《Java程序设计》第五次实验报告

实验简述: 在本周,我们进行了Java的第五次试验,本次实验的主要内容是结对编程。本次实验的大体过程是: 1.先进行Java的客户端与服务端的代码编写。结对是两个人,一人负责客户端,一人负责服务端。 2.利用加解密代码包,编译运行代码,客户端加密,服务器解密。 3.客户端加密明文后将密文通过TCP发送。 4.在本次的代码编写上,要求代码可以实现两者之间的数据传输,在代码传输的基础上加上一定的加密过...

更改springboot启动拼成的字母

1.更改springboot启动拼成的字母 其实很好改,只需要在resources下新建一个txt文件就可以,命名为banner.txt,那这种字符该怎么拼出来呢,下面推荐一个网址,有这种工具 传送门 2.集成...

Node.js安装配置

好久都没更新博客了,今天心血来潮,决定是时候更新一篇了,首先我们来认识一下node.js。 什么是node.js? 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的...

RocketMQ之双Master集群搭建笔记记录

一:RocketMQ双master集群部署 服务器环境(我采用的虚拟机,centos6 .5【特别注意:安装的虚拟机centos系统一定得是64位的,32位的会启动不起来。即便起来了也会有很多问题,深坑勿踩】)  ip       用户名    密码        角色     模式 192.168.197.101   root        nameServer1,brokerServer1  ...

猜你喜欢

蓝桥杯试题集-基础练习题-数列特征(Java)

//做题笔记,仅自己看得懂 题目: 正确姿势:...

多线程爬取4k超高清美图壁纸

多线程爬取4k美图壁纸 前言:看完此篇文章你可以更加深入的了解多线程的使用,并且最重要的你能够下载你自己想要的超高清4k壁纸 爬取结果: 1. 分析网站 要爬取的url :http://pic.netbian.com/ a) 判断网页是动态加载还是静态加载页面。右击查看网页源代码,按Ctrl + f在源代码中搜索网站的详情页地址,从而判断整个网页是静态加载的 b) 明确爬取的目标。我们要爬取的目标...

elementUI-添加自定义图标

elementui的小图标有限,跟UI给的不一样,这个时候咋办呢?百度走起。。。。参考了两篇博主分享的 自定义elementui中的图标 和 建立图标库,这里主要用到第一种 实际中: elementUI导航栏 具体代码: 汉字转换Unicode编码: 直接打开控制台: 汉字.chatCodeAt().toString(16); 然后回车; 至于三角形的图标,我直接把箭头的 unicode 值改成了...

[Linux]——文件缓冲区

文件缓冲区 提到文件缓冲区这个概念我们好像并不陌生,但是我们对于这个概念好像又是模糊的存在脑海中,之间我们在介绍c语言文件操作已经简单的提过这个概念,今天我们不妨深入理解什么是文件缓冲区。 为什么需要文件缓冲区 当我们在程序中写下一条printf语句时,我们希望将这条语句的内容打印到屏幕上。但是如果你将语句放在循环中,难道你执行一次循环那么操作系统就要打印一次这条数据么?答案当然不是 我们对于程序...

基于FPGA的IIC协议详解——EEPROM控制器(1)

IIC协议举例 常用IIC协议使用地方 常见IIC协议的注意点 24LC64芯片读写命令的时序图 eeprom控制器的系统框图 时序图设计 代码设计 EEPROM控制器测试模块的代码 结束语 常用IIC协议使用地方 熟悉一个协议一定要知道这个协议应该用到什么地方,IIC协议作为飞利浦公司定义的一个慢速传输协议,常用于: 1、芯片寄存器的配置; 2、eeprom的读写; 本次实验我们将使用eepro...