热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ETL工具—Sqoop

1.概述Sqoop是apache旗下的一款”Hadoop和关系数据库之间传输数据”的工具导入数据:将MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等

1. 概述



  • Sqoop是apache旗下的一款 ”Hadoop和关系数据库之间传输数据”的工具
    导入数据:将MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统
    导出数据:从Hadoop的文件系统中导出数据到关系数据库


2. Sqoop的工作机制



  • 将导入和导出的命令翻译成mapreduce程序实现

  • 在翻译出的mapreduce中主要是对inputformat和outputformat进行定制


3. Sqoop1与Sqoop2架构对比



  • sqoop在发展中的过程中演进出来了两种不同的架构.架构演变史

  • Sqoop1架构

​ 版本号为1.4.x为sqoop1
​ 在架构上:sqoop1使用sqoop客户端直接提交的方式
​ 访问方式:CLI控制台方式进行访问
​ 安全性:命令或脚本中指定用户数据库名及密码



  • Sqoop2架构

​ 版本号为1.99x为sqoop2
​ 在架构上:sqoop2引入了sqoop server,对connector实现了集中的管理
​ 访问方式:REST API、 JAVA API、 WEB UI以及CLI控制台方式进行访问



  • sqoop1与sqoop2比较


Sqoop安装部署

 


第一步:下载安装包

https://mirrors.bfsu.edu.cn/apache/sqoop/1.4.7


第二步:上传并解压



  • 将我们下载好的安装包上传到hadoop03服务器的/bigdata/soft路径下,然后进行解压

cd /bigdata/soft/
tar -xzvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /bigdata/install

第三步:修改配置文件



  • 更改sqoop的配置文件

cd /bigdata/install/sqoop-1.4.7.bin__hadoop-2.6.0/conf/
mv sqoop-env-template.sh sqoop-env.sh
vim sqoop-env.sh

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/bigdata/install/hadoop-3.1.4

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/bigdata/install/hadoop-3.1.4

#set the path to where bin/hbase is available
export HBASE_HOME=/bigdata/install/hbase-2.2.6

#Set the path to where bin/hive is available
export HIVE_HOME=/bigdata/install/hive-3.1.2

#Set the path for where zookeper config dir is
export ZOOCFGDIR=/bigdata/install/zookeeper-3.6.2

第四步:添加两个必要的jar包



  • sqoop需要两个额外依赖的jar包,将课件资料当中两个jar包添加到sqoop的lib目录下

cd /bigdata/soft
cp java-json.jar mysql-connector-java-5.1.38.jar /bigdata/install/sqoop-1.4.7/lib/


第五步:配置sqoop的环境变量

sudo vim /etc/profile

# 添加如下内容
export SQOOP_HOME=/bigdata/install/sqoop-1.4.7
export PATH=:$SQOOP_HOME/bin:$PATH


  • 让环境变量生效

source /etc/profile

1. sqoop help有warning日志


  • 执行命令sqoop help,有warning日志



  • 解决方案



[hadoop@hadoop03 bin]$ pwd
/bigdata/install/sqoop-1.4.7/bin
# 搜索HCAT_HOME,将下图红框内容注释掉
[hadoop@hadoop03 bin]$ vim configure-sqoop


2. sqoop help有错误


  • 运行sqoop help有错误:

    • 错误: 找不到或无法加载主类 org.apache.hadoop.hbase.util.GetJavaProperty



  • 此错误,不影响sqoop的;可以忽略不管

    • 如果有洁癖,可以看如下方式解决




1. 解决方案一:


  • 简单的做法,直接用修改过的hbase文件,替换集群3个节点目录/bigdata/install/hbase-2.2.6/bin中的hbase文件

  • 重启hbase集群即可


2. 解决方案二


  • hadoop01修改hbase命令文件

[hadoop@hadoop01 bin]$ cd /bigdata/install/hbase-2.2.6/bin/
[hadoop@hadoop01 bin]$ vim hbase


  • 如下图显示,找到指定的位置(根据行号或关键字内容进行定位)



    • 新增第一个红框的内容;注意缩进

    # Needed for GetJavaProperty check below
    add_to_cp_if_exists "${HBASE_HOME}/hbase-server/target/classes"


    • 将第二个红框的内容注释掉



  • 继续查找hbase文件,定位到如下黄框内容



  • 在上图322行(第一个黄色框)增加下图①的代码;注意缩进



temporary_cp=
for f in "${HBASE_HOME}"/lib/hbase-server*.jar; do
if [[ ! "${f}" =~ ^.*\-tests\.jar$ ]]; then
temporary_cp=":$f"
fi
done


  • 将上图的第二个黄色框的内容修改成下图②的代码;注意缩进

HADOOP_JAVA_LIBRARY_PATH=$(HADOOP_CLASSPATH="$CLASSPATH${temporary_cp}" "${ HADOOP_IN_PATH}" \



  • 保存退出

  • 将hbase分发到另外两个节点

[hadoop@hadoop01 bin]$ pwd
/bigdata/install/hbase-2.2.6/bin
[hadoop@hadoop01 bin]$ scp hbase hadoop02:$PWD
[hadoop@hadoop01 bin]$ scp hbase hadoop03:$PWD

RUBY 复制 全屏



  • 重启hbase


Sqoop的数据导入

 


1. 列举出所有的数据库



  • 命令行查看帮助

sqoop help


  • 列出hadoop02主机所有的数据库

sqoop list-databases --connect jdbc:mysql://hadoop02:3306/ --username root --password 123456


  • 查看某一个数据库下面的所有数据表(将数据库名称hive替换成自己的某个数据库名)

sqoop list-tables --connect jdbc:mysql://hadoop02:3306/mysql --username root --password 123456

2. 准备表数据



  • 在mysql中有一个库userdb中三个表:emp, emp_add和emp_conn



  • 表emp:

















































    idnamedegsalarydept
    1201gopalmanager50,000TP
    1202manishaProof reader50,000TP
    1203khalilphp dev30,000AC
    1204prasanthphp dev30,000AC
    1205kranthiadmin20,000TP


  • 表emp_add:











































    idhnostreetcity
    1201288Avgirijublee
    1202108Iaocsec-bad
    1203144Zpguttahyd
    120478Bold citysec-bad
    1205720Xhitecsec-bad


  • 表emp_conn:





































    idphnoemail
    12012356742gopal@tp.com
    12021661663manisha@tp.com
    12038887776khalil@ac.com
    12049988774prasanth@ac.com
    12051231231kranthi@tp.com


  • 建表语句如下:



CREATE DATABASE /*!32312 IF NOT EXISTS*/`userdb` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `userdb`;
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`id` INT(11) DEFAULT NULL,
`name` VARCHAR(100) DEFAULT NULL,
`deg` VARCHAR(100) DEFAULT NULL,
`salary` INT(11) DEFAULT NULL,
`dept` VARCHAR(10) DEFAULT NULL,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`is_delete` BIGINT(20) DEFAULT '1'
) ENGINE=INNODB DEFAULT CHARSET=latin1;
INSERT INTO `emp`(`id`,`name`,`deg`,`salary`,`dept`) VALUES (1201,'gopal','manager',50000,'TP'),(1202,'manisha','Proof reader',50000,'TP'),(1203,'khalil','php dev',30000,'AC'),(1204,'prasanth','php dev',30000,'AC'),(1205,'kranthi','admin',20000,'TP');
DROP TABLE IF EXISTS `emp_add`;
CREATE TABLE `emp_add` (
`id` INT(11) DEFAULT NULL,
`hno` VARCHAR(100) DEFAULT NULL,
`street` VARCHAR(100) DEFAULT NULL,
`city` VARCHAR(100) DEFAULT NULL,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`is_delete` BIGINT(20) DEFAULT '1'
) ENGINE=INNODB DEFAULT CHARSET=latin1;
INSERT INTO `emp_add`(`id`,`hno`,`street`,`city`) VALUES (1201,'288A','vgiri','jublee'),(1202,'108I','aoc','sec-bad'),(1203,'144Z','pgutta','hyd'),(1204,'78B','old city','sec-bad'),(1205,'720X','hitec','sec-bad');
DROP TABLE IF EXISTS `emp_conn`;
CREATE TABLE `emp_conn` (
`id` INT(100) DEFAULT NULL,
`phno` VARCHAR(100) DEFAULT NULL,
`email` VARCHAR(100) DEFAULT NULL,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`is_delete` BIGINT(20) DEFAULT '1'
) ENGINE=INNODB DEFAULT CHARSET=latin1;
INSERT INTO `emp_conn`(`id`,`phno`,`email`) VALUES (1201,'2356742','gopal@tp.com'),(1202,'1661663','manisha@tp.com'),(1203,'8887776','khalil@ac.com'),(1204,'9988774','prasanth@ac.com'),(1205,'1231231','kranthi@tp.com');

3. 导入数据库表数据到HDFS



  • 使用sqoop命令导入、导出数据前,要先启动hadoop集群

  • 下面的命令用于从MySQL数据库服务器中的emp表导入HDFS。

sqoop import --connect jdbc:mysql://hadoop02:3306/userdb --password 123456 --username root --table emp -m 1


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



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



hdfs dfs -ls /user/hadoop/emp



  • 以上有参数--m 1,表示只启动一个map task进行数据的导入

  • 如果要开启多个map task的话,需要在命令中添加--split-by column-name,如下,其中map个数为4

sqoop import --connect jdbc:mysql://hadoop02:3306/userdb --password 123456 --username root --table emp -m 4 --split-by id

4. 导入到HDFS指定目录



  • 在导入表数据到HDFS使用Sqoop导入工具,我们可以指定目标目录。

  • 使用参数 --target-dir来指定导出目的地,

  • 使用参数--delete-target-dir来判断导出目录是否存在,如果存在就删掉

sqoop import --connect jdbc:mysql://hadoop02:3306/userdb --username root --password 123456 --delete-target-dir --table emp --target-dir /sqoop/emp -m 1


  • 查看导出的数据

hdfs dfs -text /sqoop/emp/part-m-00000



  • 它会用逗号(,)分隔emp_add表的数据和字段。

1201,gopal,manager,50000,TP
1202,manisha,Proof reader,50000,TP
1203,khalil,php dev,30000,AC
1204,prasanth,php dev,30000,AC
1205,kranthi,admin,20000,TP

5. 导入到hdfs指定目录并指定字段之间的分隔符

sqoop import --connect jdbc:mysql://hadoop02:3306/userdb --username root --password 123456 --delete-target-dir --table emp --target-dir /sqoop/emp2 -m 1 --fields-terminated-by '\t'


  • 查看文件内容

hdfs dfs -text /sqoop/emp2/part-m-00000

 


Sqoop的数据导出

 


将数据从HDFS把文件导出到RDBMS数据库



  • 导出前,目标表必须存在于目标数据库中。

  • 默认操作是从将文件中的数据使用INSERT语句插入到表中

  • 更新模式下,是生成UPDATE语句更新表数据

  • 数据是在HDFS当中的如下目录/sqoop/emp,数据内容如下

1201,gopal,manager,50000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1
1202,manisha,Proof reader,50000,TP,2018-06-15 18:54:32.0,2018-06-17 20:26:08.0,1
1203,khalil,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1
1204,prasanth,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 21:05:52.0,0
1205,kranthi,admin,20000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1

第一步:创建mysql表

use userdb;
CREATE TABLE `emp_out` (
`id` INT(11) DEFAULT NULL,
`name` VARCHAR(100) DEFAULT NULL,
`deg` VARCHAR(100) DEFAULT NULL,
`salary` INT(11) DEFAULT NULL,
`dept` VARCHAR(10) DEFAULT NULL,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`is_delete` BIGINT(20) DEFAULT '1'
) ENGINE=INNODB DEFAULT CHARSET=utf8;

第二步:执行导出命令

通过kkb来实现数据的导出,将hdfs的数据导出到mysql当中去

sqoop export \
--connect jdbc:mysql://hadoop02:3306/userdb \
--username root --password 123456 \
--table emp_out \
--export-dir /sqoop/emp \
--input-fields-terminated-by ","

第三步:验证mysql表数据

 

 



推荐阅读
  • 伸缩性|发生_分布式文件系统设计,该从哪些方面考虑?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了分布式文件系统设计,该从哪些方面考虑?相关的知识,希望对你有一定的参考价值。点击上方关注“ ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • Hadoop源码解析1Hadoop工程包架构解析
    1 Hadoop中各工程包依赖简述   Google的核心竞争技术是它的计算平台。Google的大牛们用了下面5篇文章,介绍了它们的计算设施。   GoogleCluster:ht ... [详细]
  • 我们在之前的文章中已经初步介绍了Cloudera。hadoop基础----hadoop实战(零)-----hadoop的平台版本选择从版本选择这篇文章中我们了解到除了hadoop官方版本外很多 ... [详细]
  • Java开发实战讲解!字节跳动三场技术面+HR面
    二、回顾整理阿里面试题基本就这样了,还有一些零星的问题想不起来了,答案也整理出来了。自我介绍JVM如何加载一个类的过程,双亲委派模型中有 ... [详细]
  • 本文_大数据之非常详细Sqoop安装和基本操作
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了大数据之非常详细Sqoop安装和基本操作相关的知识,希望对你有一定的参考价值。大数据大数据之 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • Hbase1.2.0cdh5.16.2使用PREFIX_TREE编码导致集群压缩队列异常
    Hbase1.X版本中PREFIX_TREE作为BlockEncoding存在bug,会造成RegionServer节点compactionqueue持续升高,甚至影响fl ... [详细]
  • Hadoop之Yarn
    目录1Hadoop1.x和Hadoop2.x架构区别2Yarn概述3Yarn基本架构4Yarn工作机制5作业提交全过程6资源调度器7任务的推测执行1Hadoop1.x和Hadoo ... [详细]
  • 文件txt-数据库mysql-纯内存数据库SAP-HANA-内存数据库redis-分布式数据库hbase一、数据存储选型要点容量成本访问速度 ... [详细]
author-avatar
冠吸柏芝霆疯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有