热门标签 | 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表数据

 

 



推荐阅读
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 阿里云MySQL与Oracle数据库的主从复制技术详解 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 在前一篇文章《Hadoop》系列之“踽踽独行”(二)中,我们详细探讨了云计算的核心概念。本章将重点转向物联网技术,全面解析其基本原理、应用场景及未来发展前景。通过深入分析物联网的架构和技术栈,我们将揭示其在智能城市、工业自动化和智能家居等领域的广泛应用潜力。此外,还将讨论物联网面临的挑战,如数据安全和隐私保护等问题,并展望其在未来技术融合中的重要角色。 ... [详细]
  • 在Hive中合理配置Map和Reduce任务的数量对于优化不同场景下的性能至关重要。本文探讨了如何控制Hive任务中的Map数量,分析了当输入数据超过128MB时是否会自动拆分,以及Map数量是否越多越好的问题。通过实际案例和实验数据,本文提供了具体的配置建议,帮助用户在不同场景下实现最佳性能。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 如何提升Python处理约1GB数据集时的运行效率?
    如何提升Python处理约1GB数据集时的运行效率?本文探讨了在后端开发中使用Python处理大规模数据集的优化方法。通过分析常见的性能瓶颈,介绍了多种提高数据处理速度的技术,包括使用高效的数据结构、并行计算、内存管理和代码优化策略。此外,文章还提供了在Ubuntu环境下配置和测试这些优化方案的具体步骤,适用于从事推荐系统等领域的开发者。 ... [详细]
  • Hadoop的分布式架构改进与应用
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 阿里云大数据计算服务MaxCompute (原名 ODPS)
     MaxCompute是阿里EB级计算平台,经过十年磨砺,它成为阿里巴巴集团数据中台的计算核心和阿里云大数据的基础服务。去年MaxCompute做了哪些工作,这些工作背后的原因是什 ... [详细]
  • 本文详细探讨了Oracle数据库中Number和Float数据类型的特性和使用方法。通过对比分析,解释了Number类型在精度和范围上的优势,以及Float类型在处理科学计算时的灵活性。文章还介绍了Number数据类型的语法结构及其在实际应用中的最佳实践,帮助读者更好地理解和选择合适的数据类型以满足不同的业务需求。 ... [详细]
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社区 版权所有