Sqoop

Sqoop

(Sqoop 是连接传统关系型数据库和 Hadoop 的桥梁,它不需要开发人员编写相应的 Map Reduce 代 码,只需要编写简单的配置脚本即可,大大提升了开发效率。)
在这里插入图片描述

简单日志业务流程的分析 注意Sqoop的位置

在这里插入图片描述

Sqoop简介

官网:http://sqoop.apache.org/ :数据导入导出框架 Sqoop

Sqoop产生背景

在工作中,我们经常会遇到下面这样的场景。

场景一:将关系型数据库中某张表的数据抽取到 Hadoop(HDFS/Hive/HBase)上;

场景二:将 Hadoop 上的数据导出到关系型数据库中。

导入:Map Reduce 输入为 DBInput Format 类型,输出为 Text Output Format。

导出:Map Reduce 输入为 Text Input Format 类型,输出为 DBOutput Format。

使用 Map Reduce 处理以上两个场景时存在如下问题:每次都需要编写 Map Reduce 程序,非常麻烦。在没有出现 Sqoop 之前,实际生产中有很多类似的需求需要通过编写 Map Reduce 去实现,然后形成一个工具,后来慢慢就将该工具代码整理出一个框架并逐步完善,最终就有了 Sqoop 的诞生。

Sqoop概述

基于 Hadoop 之上的数据传输工具 Sqoop 是 Apache 的顶级项目,主要用于在 Hadoop 和关系数据 库、数据仓库、No SQL 系统间传递数据。通过 Sqoop 我们可以方便地将数据从关系数据库导入到 HDFS、HBase、Hive,或者将数据从 HDFS 导出到关系数据库。使用 Sqoop 导入导出数据的处理流程 如图 所示。

在这里插入图片描述

Sqoop 在 Hadoop 生态圈中的位置如图 所示。

在这里插入图片描述

Sqoop架构

Sqoop 的架构非常简单,其整合了 Hive、HBase 等,通过 map 任务来传输数据,map 负责数据的加 载、转换,然后存储到 HDFS、HBase 或者 Hive 中

  1. 从工作模式角度看待:Sqoop 是基于客户端模式的,用户使用客户端模式,只需要在一台机器上 即可完成。

  2. 从 Map Reduce 角度看待:Sqoop 只提交一个 map 作业,数据的传输和转换都是使用 Mapper 来完成的,而且该 Map Reduce 作业仅有 Mapper 并不需要 Reducer,在执行 Sqoop 时可以通过 YARN 监控页面查看到。

  3. 从安全角度看待:需要在执行时将用户名或者密码显性指定,也可以在配置文件中配置,总的来 说,安全性不是很高。

在这里插入图片描述

Sqoop导入和导出过程

由前面的 Sqoop 框架,可以知道 Sqoop 是通过 MapReduce 作业进行导入操作的。在导入过程中, Sqoop 从表中读取数据行,将其写入 HDFS。反之就是导出过程。

在这里插入图片描述
在这里插入图片描述

Sqoop安装

下载地址

​ http://archive.apache.org/dist/sqoop/1.4.7/

上传并解压

[root@node01 ~]# tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
[root@node01 ~]# rm -rf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
[root@node01 ~]# mv sqoop-1.4.7.bin__hadoop-2.6.0 /opt/yjx/
[root@node01 yjx]# cd /opt/yjx/ 
[root@node01 yjx]# mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop-1.4.7

配置环境变量

[root@node01 ~]# vim /etc/profile

export SQOOP_HOME=/opt/yjx/sqoop-1.4.7
export PATH=$SQOOP_HOME/bin:$PATH

[root@node01 ~]# source /etc/profile

添加mysql连接包

[root@node01 ~]# cp ~/mysql-connector-java-5.1.32-bin.jar /opt/yjx/sqoop-1.4.7/lib/

添加Hive的jar包

[root@node01 ~]# cp /opt/yjx/apache-hive-3.1.2-bin/lib/hive-exec-3.1.2.jar/opt/yjx/sqoop-1.4.7/lib/

修改Sqoop配置文件

[root@node01 ~]# cd /opt/yjx/sqoop-1.4.7/conf/
[root@node01 conf]# cp sqoop-env-template.sh sqoop-env.sh
[root@node01 conf]# vim sqoop-env.sh

export HADOOP_COMMON_HOME=/opt/yjx/hadoop-3.1.2
export HADOOP_MAPRED_HOME=/opt/yjx/hadoop-3.1.2
export HIVE_HOME=/opt/yjx/apache-hive-3.1.2-bin
export HBASE_HOME=/opt/yjx/hbase-2.2.5
export ZOOKEEPER_HOME=/opt/yjx/zookeeper-3.4.5
export ZOOCFGDIR=/opt/yjx/zookeeper-3.4.5/conf

修改configure-sqoop

[root@node01 ~]# vim /opt/yjx/sqoop-1.4.7/bin/configure-sqoop

删除掉HCatalog,Accumulo检查(切记从后向前删除)

179-196 18dd
134-143 10dd
82-100 19dd

验证

[root@node01 ~]# sqoop version[root@node01 ~]# sqoop version

在这里插入图片描述

[root@node01 ~]# sqoop list-databases -connect jdbc:mysql://node01:3306/ -username root -password 123456

在这里插入图片描述

Sqoop使用

  • 官网:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html

导入数据

在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传 输数据,叫做:导入,即使用import关键字。

  • 从RDBMS到HDFS全部导入

    sqoop import \
    --connect jdbc:mysql://node01:3306/scott \
    --username root \
    --password 123456 \
    --table emp \
    --target-dir /sqoop/empall \
    --delete-target-dir \
    --num-mappers 1 \
    --fields-terminated-by "\t";
    
  • 从RDBMS到HDFS查询导入

    sqoop import \
    --connect jdbc:mysql://node01:3306/scott \
    --username root \
    --password 123456 \
    --target-dir /sqoop/empquery \
    --delete-target-dir \
    --num-mappers 1 \
    --fields-terminated-by "\t" \
    --query 'select empno,ename from emp where hiredate <= 1987-07-13 and
    $CONDITIONS;'
    提示:must contain '$CONDITIONS' in WHERE clause.
    如果query后使用的是双引号,则$CONDITIONS前必须加转移符,防止shell识别为自己的变量。
    
    
  • 从RDBMS到HDFS导入指定列

    sqoop import \
    --connect jdbc:mysql://node01:3306/scott \
    --username root \
    --password 123456 \
    --target-dir /sqoop/empcolumn \
    --delete-target-dir \
    --num-mappers 1 \
    --fields-terminated-by "\t" \
    --columns "empno,ename" \
    --table emp;提示:columns中如果涉及到多列,用逗号分隔,分隔时不要添加空格
    
  • 从RDBMS到HDFS关键字导入

    sqoop import \
    --connect jdbc:mysql://node01:3306/scott \
    --username root \
    --password 123456 \
    --target-dir /sqoop/empkeyword \
    --delete-target-dir \--num-mappers 1 \
    --fields-terminated-by "\t" \
    --table emp \
    --where "deptno=30"
    
  • RDBMS到Hive

    sqoop import \
    --connect jdbc:mysql://node01:3306/scott \
    --username root \
    --password 123456 \
    --table emp \
    --num-mappers 1 \
    --hive-import \
    --fields-terminated-by "," \
    --hive-overwrite \
    --hive-table hive_emp;
    提示:该过程分为两步第一步将数据导入到HDFS ,默认路径为 /user/root
    第二步将导入到HDFS的数据迁移到Hive仓库
    
  • RDBMS到Hbase

    sqoop import \
    --connect jdbc:mysql://node01:3306/scott \
    --username root \--password 123456 \
    --table emp \--columns "empno,ename,deptno" \
    --column-family "info" \
    --hbase-create-table \
    --hbase-row-key "empno" \
    --hbase-table "emp" \
    --num-mappers 1 \
    --split-by empno;
    

提示:sqoop1.4.7只支持HBase1.0.1之前的版本的自动创建HBase表的功能

  • 解决方案:手动创建HBase表
hbase> create 'emp','info'
  • 在HBase中scan这张表
hbase> scan ‘emp’

导出数据

在Sqoop中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS)中传 输数据,叫做:导出,即使用export关键字。

  • HIVE/HDFS到RDBMS提示:Mysql中如果表不存在,不会自动创建
sqoop export \
--connect jdbc:mysql://node01:3306/scott \
--username root \--password 123456 \
--table emp \
--num-mappers 1 \
--export-dir /sqoop/empall \
--input-fields-terminated-by "\t"

脚本打包

使用opt格式的文件打包sqoop命令,然后执行<

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值