【云计算】sqoop-hbase的使用操作介绍
小标 2019-02-25 来源 : 阅读 656 评论 0

摘要:本文主要向大家介绍了【云计算】sqoop-hbase的使用操作介绍,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

本文主要向大家介绍了【云计算】sqoop-hbase的使用操作介绍,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

【云计算】sqoop-hbase的使用操作介绍

sqoop


  

回顾:


  

今天任务


  

1.sqoop基本概念


  

2.配置sqoop环境


  

3.sqoop的典型应用


  

4.sqoop的原理


  

教学目标


  

1.熟悉sqoop环境的配置步骤


  

2.理解sqoop的原理


  

3.熟练使用sqoop导入导出数据


  

第一节:sqoop介绍


  

1.1 概述


  

Apache Sqoop(SQL-to-Hadoop) 项目旨在协助 RDBMS 与 Hadoop 之间进行高效的大数据交流


  

导入数据:关系型数据库(mysql)的数据导入到 Hadoop 与其相关的系统 (如HBase和Hive)中。


  

导出数据:从 Hadoop 系统里抽取并导出到关系型数据库里。


  

1.2 sqoop核心机制


  

通过hadoop的mapreduce把数据从关系型数据库中导入数据到HDFS。


  

简单说,Sqoop就是一个转换工具,用于在关系型数据库与HDFS之间进行数据转换。强大功能见下图:


  

第二节 sqoop安装配置


  

2.1 基于集群环境

    主机


    安装软件

min1    hadoop hive    

min2    hadoop mysql    

min3    hadoop    


  

2.2 安装步骤


  

下载


  下载地址://mirrors.hust.edu.cn/apache/sqoop/

  

  这里有两个版本,1.4.x 为Sqoop 1 版本,1.99.x为Sqoop 2 版本

  

解压安装


  

#我们先讲解Sqoop 1 版本的安装使用。


  

#将sqoop-1.4.6.bin__hadoop-0.23.tar.gz上传到min1机器的/home/hadoop/apps/目录下。


  

#解压缩


  

tar -xvf sqoop-1.4.6.bin__hadoop-0.23.tar.gz


  

#重命名为sqoop


  

mv sqoop-1.4.6.bin__hadoop-0.23 sqoop


  

设置环境变量


  

#在文件/etc/profile中设置环境变量SQOOP_HOME:


  

vim /etc/profile


  

#设置内容:


  

export SQOOP_HOME=/hadoop/sqoop


  

export PATH=$PATH:$SQOOP_HOME/bin:


  

source /etc/profile


  

#把mysql的jdbc驱动mysql-connector-java-5.1.32-bin.jar复制到sqoop项目的lib目录下:


  

cp mysql-connector-java-5.1.32-bin.jar /hadoop/sqoop/lib/


  

修改配置文件


  

#复制名配置文件


  

#在${SQOOP_HOME}/conf中执行命令


  

cp sqoop-env-template.sh sqoop-env.sh


  

vi sqoop-env.sh


  

#设置内容如下:


  

测试


  

#执行sqoop-version命令后,显示下图的效果说明配置成功


  

sqoop-version


  

第三节 Sqoop的数据导入


  

就是从关系型数据库(mysql)的数据导入到 Hadoop 与其相关的系统 (如HBase和Hive)中。


  

3.1 语法


  $ sqoop import (generic-args) (import-args) 

  

3.2 案例


  

测试之前先在mysql中准备数据:


  

create database sqoop; --创建名为sqoop的数据库


  

use sqoop; --切换到sqoop数据库


  

create table employee( --创建一个名为employee的表


  

id int not null primary key auto_increment,


  

name varchar(20),


  

birthday date


  

);


  

insert into employee values ('','zhangsan','2016-01-01');


  

insert into employee values ('','zs','2016-01-01');


  

insert into employee values ('','zw','2016-01-01');


  

insert into employee values ('','z6','2016-01-01');


  

insert into employee values ('','z7','2016-01-01');


  

insert into employee values ('','z8','2016-01-01');


  

insert into employee values ('','z9','2016-01-01');


  

insert into employee values ('','z10','2016-01-01');


  

insert into employee values ('','z11','2016-01-01');


  

insert into employee values ('','z12','2016-01-01');


  

insert into employee values ('','z13','2016-01-01');


  

insert into employee values ('','z14','2016-01-01');


  

insert into employee values ('','zhangsan','2016-01-01');


  

导入表数据到hdfs中


  

执行命令


  

#sqoop的命令只能在行,如果换行则需要使用 \


  

sqoop import \


  

--connect jdbc:mysql://localhost:3306/sqoop \


  

--username root \


  

--password root \


  

--table employee \ #mysql的表名


  

--target-dir /sqfs #/sqfs 表示导入的数据保存在hadoop的路径


  

--m 1 #表示启动mr的数量


  

上述语句如果没有指定保存到HDFS到哪里(target-dir),默认保存在/user/hadoop/employee/路径下


  

如果成功执行,那么会得到下面的输出


  

14/12/22 15:24:54 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5


  

14/12/22 15:24:56 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.


  

INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hadoop/compile/cebe706d23ebb1fd99c1f063ad51ebd7/emp.jar


  

-----------------------------------------------------


  

O mapreduce.Job: map 0% reduce 0%


  

14/12/22 15:28:08 INFO mapreduce.Job: map 100% reduce 0%


  

14/12/22 15:28:16 INFO mapreduce.Job: Job job_1419242001831_0001 completed successfully


  

-----------------------------------------------------


  

-----------------------------------------------------


  

14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Transferred 145 bytes in 177.5849 seconds (0.8165 bytes/sec)


  

14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Retrieved 5 records.


  

为了验证在HDFS导入的数据,请使用以下命令查看导入的数据


  hadoop fs -cat /sqfs/employee/part-m-00000

  

导入表数据到hive中


  

bin/sqoop import \


  

--connect jdbc:mysql://localhost:3306/sqoop \


  

--username root \


  

--password root \


  

--table employee \


  

--hive-import \ #这句是关键语句 默认到入到hive的名为default的database下


  

--m 1


  

导入表数据子集


  

我们使用Sqoop导入工具时,可以导入"where"子句的一个子集。它执行在各自的数据库服务器相应的SQL查询,并将结果存储在HDFS的目标目录。


  

导入id值大于5的记录


  

bin/sqoop import \


  

--connect jdbc:mysql://localhost:3306/sqoop \


  

--username root \


  

--password root \


  

--where "id >5" \


  

--target-dir /wherequery \


  

--table employee


  

--m 1


  

增量导入


  

增量导入是仅导入新添加的表中的行的技术


  

它需要添加‘incremental’,‘check-column’, 和 ‘last-value’选项来执行增量导入。下面的语法用于Sqoop导入命令增量选项。


  

--incremental 


  

--check-column 


  

--last value 


  

假设新添加的数据转换成employee表如下


  insert into employee values ('','chang100','2018-03-03');

  

下面的命令用于在employee表执行增量导入。


  

bin/sqoop import \


  

--connect jdbc:mysql://localhost:3306/sqoop \


  

--username root \


  

--password root \


  

--table employee


  

--m 1 \


  

--incremental append \


  

--check-column id \ #根据id判定一条记录


  

--last-value 12 #从哪条记录以后的内容导入


  

第四节 Sqoop的数据导出


  

就是从 Hadoop 系统里抽取并导出到关系型数据库里。


  

4.1 语法


  $ sqoop export (generic-args) (export-args) 

  

4.2 案例


  

从hdfs中导入到mysql


  

数据是在HDFS 中“employee/”目录的emp_data文件中。所述emp_data如下:


  

1,zhangsan,2016-01-01


  

2,lisi,2016-01-01


  

3,wangwu,2016-01-01


  

4,zhang6,2016-01-01


  

5,zhang7,2016-01-01


  

6,wang8,2016-01-01


  

首先需要手动创建mysql中的目标表


  

mysql> USE sqoop2;


  

mysql> CREATE TABLE employee (


  

id INT NOT NULL PRIMARY KEY,


  

name VARCHAR(20),


  

birthday date);


  

然后执行导出命令


  

bin/sqoop export \


  

--connect jdbc:mysql://localhost:3306/sqoop2 \


  

--username root \


  

--password root \


  

--table employee \


  

--export-dir /employee/


  

第五节 Sqoop原理


  

5.1 Sqoop架构图


  

sqoop1架构


  

sqoop2架构


  

5.2 Sqoop1大概流程


  

读取要导入数据的表结构,生成运行类,默认是QueryResult,打成jar包,然后提交给Hadoop,设置好job,主要也就是设置好各个参数,这里就由Hadoop来执行MapReduce来执行Import命令。


  

首先要对数据进行切分,也就是DataSplit,DataDrivenDBInputFormat.getSplits(JobContext job)。


  

切分好范围后,写入范围,以便读取DataDrivenDBInputFormat.write(DataOutput output),这里是lowerBoundQuery and upperBoundQuery。


  

读取以上2)写入的范围DataDrivenDBInputFormat.readFields(DataInput input)。


  

然后创建RecordReader从数据库中读取数据DataDrivenDBInputFormat.createRecordReader(InputSplit split,TaskAttemptContext context)。


  

创建MAP,MapTextImportMapper.setup(Context context)。


  

RecordReader一行一行从关系型数据库中读取数据,设置好Map的Key和Value,交给MapDBRecordReader.nextKeyValue()。


  

运行MAP,mapTextImportMapper.map(LongWritable key, SqoopRecord val, Context context),最后生成的Key是行数据,由QueryResult生成,Value是NullWritable.get()。


  

5.3 Sqoop 1与 Sqoop 2 对比


  

sqoop1优点:架构部署简单


  

sqoop1缺点:命令行方式容易出错,格式紧耦合,无法支持所有数据类型,安全机制不够完善,例如密码暴漏, 安装需要root权限,connector必须符合JDBC模型。


  

sqoop2优点:多种交互方式,命令行,web UI,rest API,conncetor集中化管理,所有的链接安装在sqoop server上,完善权限管理机制,connector规范化,仅仅负责数据的读写


  

sqoop2缺点:架构稍复杂,配置部署更繁琐。


  

5.4 Sqoop的Import


  

Sqoop在import时,需要制定split-by参数。Sqoop根据不同的split-by参数值来进行切分,然后将切分出来的区域分配到不同map中。每个map中再处理数据库中获取的一行一行的值,写入到HDFS中。同时split-by根据不同的参数类型有不同的切分方法,如比较简单 的int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来确定划分几个区域。 比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分别为1000和1,而num-mappers为2的话,则会分成两个区域 (1,500)和(501-100),同时也会分成2个sql给2个map去进行导入操作,分别为select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000。最后每个map各自获取各自SQL中的数据进行导入工作。


  

5.5 Sqoop的export


  

Sqoop可以在HDFS/Hive和关系型数据库之间进行数据的导入导出,其中主要使用了import和export这两个工具。这两个工具非常强大,提供了很多选项帮助我们完成数据的迁移和同步。比如,下面两个潜在的需求:


  

业务数据存放在关系数据库中,如果数据量达到一定规模后需要对其进行分析或同统计,单纯使用关系数据库可能会成为瓶颈,这时可以将数据从业务数据库数据导入(import)到Hadoop平台进行离线分析。


  

对大规模的数据在Hadoop平台上进行分析以后,可能需要将结果同步到关系数据库中作为业务的辅助数据,这时候需要将Hadoop平台分析后的数据导出(export)到关系数据库。


 

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程