Sqoop知识点总结

一、Sqoop概述

1.1 Sqoop简介

Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(如MySQL,Oracle,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

Sqoop2的最新版本1.99.7;注意:2与1不兼容,且特征不完整,它并不打算用于生产部署;

Sqoop1使用最多。

1.2 Sqoop原理

将导入或导出命令翻译成mapreduce程序来实现;

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

1.3 Sqoop架构

sqoop架构非常简单,是hadoop生态系统架构最简单的框架。

sqoop1由client端直接接入hadoop,任务通过解析生成对应的mapreduce执行;

sqoop1:仅有一个客户端,架构简单明了,部署即用,使用门槛比较低;但是耦合性强,用户密码暴露不安全;

在这里插入图片描述

sqoop2:服务端部署,运行,提供client、rest api、web ui等入口,connector集中管理,rdbms账户控制更安全,但是sqoop2仅负责数据的读写操作,架构相对复杂。

在这里插入图片描述

1.4 Sqoop1导入

把数据从数据库导入到hdfs中(大数据生态圈)

在这里插入图片描述

1.5 Sqoop1导出

把数据从大数据生态圈(hdfs)导出到数据库里面

在这里插入图片描述

二、Sqoop工具

选项含义说明
–connect 指定JDBC连接字符串
–connection-manager 指定要使用的连接管理器类
–driver 指定要使用的JDBC驱动类
–hadoop-mapred-home 指定HADOOP_MAPRED_HOME路径
–help万能帮助
–password-file设置用于存放认证的密码信息文件的路径
-P从控制台读取输入的密码
–password 设置认证密码
–username 设置认证用户名
–verbose打印详细的运行信息
–connection-param-file 指定存储数据库连接参数的属性文件

2.1 导入工具:import

选项含义说明
–append将数据追加到HDFS上一个已存在的数据集上
–as-avrodatafile将数据导入到Avro数据文件
–as-sequencefile将数据导入到SequenceFile
–as-textfile将数据导入到普通文本文件(默认)
–boundary-query 边界查询,用于创建分片(InputSplit)
–columns <col,col,col…>从表中导出指定的一组列的数据
–delete-target-dir如果指定目录存在,则先删除掉
–direct使用直接导入模式(优化导入速度)
–direct-split-size 分割输入stream的字节大小(在直接导入模式下)
–fetch-size 从数据库中批量读取记录数
–inline-lob-limit 设置内联的LOB对象的大小
-m,–num-mappers 使用n个map任务并行导入数据,默认是3个
-e,–query 导入的查询语句
–split-by 指定按照哪个列去分割数据
–table 导入的源表表名
–target-dir 导入HDFS的目标路径
–warehouse-dir HDFS存放表的根路径
–where 指定导出时所使用的查询条件
-z,–compress启用压缩
–compression-codec 指定Hadoop的codec方式(默认gzip)
–null-string 如果指定列为字符串类型,使用指定字符串替换值为null的该类列的值
–null-non-string 如果指定列为非字符串类型,使用指定字符串替换值为null的该类列的值

2.2 导出工具:export

选项含义说明
–validate 启用数据副本验证功能,仅支持单表拷贝,可以指定验证使用的实现类
–validation-threshold 指定验证门限所使用的类
–direct使用直接导出模式(优化速度)
–export-dir 导出过程中HDFS源路径
–m,–num-mappers 使用n个map任务并行导出
–table 导出的目的表名称
–call 导出数据调用的指定存储过程名
–update-key 更新参考的列名称,多个列名使用逗号分隔
–update-mode 指定更新策略,包括:updateonly(默认)、allowinsert
–input-null-string 使用指定字符串,替换字符串类型值为null的列
–input-null-non-string 使用指定字符串,替换非字符串类型值为null的列
–staging-table 在数据导出到数据库之前,数据临时存放的表名称
–clear-staging-table清除工作区中临时存放的数据
–batch使用批量模式导出

三、Sqoop1

修改配置文件(复制conf/sqoop-env-template.sh为sqoop-env.sh)
在这里插入图片描述
验证sqoop:bin/sqoop help

测试sqoop是否能够成功连接数据库

bin/sqoop list-databases --connector jdbc:mysql://node7-1:3306/ --username root --password 123456

3.1 导入数据:import

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

3.1.1 RDBMS到HDFS

导入mysql和hadoop_mapper的jar包

全部导入

bin/sqoop import \
--connect jdbc:mysql://192.168.56.1:3306/userscenter?serverTimezone=GMT%2B8 \
--username root \
--password 123456 \
--table a_users \
--target-dir = /sqoop1/a_users \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated "\t"

查询导入

bin/sqoop import \
--connect jdbc:mysql://192.168.56.1:3306/userscenter?serverTimezone=GMT%2B8 \
--username root \
--password 123456 \
--target-dir = /sqoop1/a_users \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated "\t" \
# query和table是互斥的
# $CONDITIONS:sql语句的执行条件,由sqoop自己控制
--query 'select name,sex from a_users where id <=1 and $CONDITIONS;'
# 拆分的这一列不能重复,一般是主键

如果query后使用的是双引号,则$CONDITIONS前必须加转移符,防止shell识别为自己的变量。

导入指定列

bin/sqoop import \
--connect jdbc:mysql://192.168.56.1:3306/userscenter?serverTimezone=GMT%2B8 \
--username root \
--password 123456 \
--target-dir = /sqoop1/a_users \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated "\t" \
--column id,sex \
--table a_users

提示:columns中如果涉及到多列,用逗号分隔,分隔时不要添加空格

使用sqoop关键字筛选查询导入数据

bin/sqoop import \
--connect jdbc:mysql://192.168.56.1:3306/userscenter?serverTimezone=GMT%2B8 \
--username root \
--password 123456 \
--target-dir = /sqoop1/a_users \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated "\t" \
--table a_users \
--where "id=1"
3.1.2 RDBMS到HIVE

导入hive-common-3.1.1.jar的jar包

bin/sqoop import \
--connect jdbc:mysql://192.168.56.1:3306/userscenter?serverTimezone=GMT%2B8 \
--username root \
--password 123456 \
--table a_users \
--num-mappers 1 \
--fields-terminated "\t" \
--hive-overwrite \
--hive-table hive_users

该过程分为两步:第一步将数据导入到HDFS;第二步将导入到HDFS的数据迁移到Hive仓库。

3.1.3 RDBMS到HBase

导入hbase-client-2.2.5.jar的jar包

sqoop1.4.6只支持HBase1.0.1之前的版本的自动化创建

bin/sqoop import \
--connect jdbc:mysql://192.168.56.1:3306/userscenter?serverTimezone=GMT%2B8 \
--username root \
--password 123456 \
--table a_users \
--columns "id,name,sex" \
--columns-family 'cf' \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_users"
--num-mappers 1 \
--split-by id

提示:sqoop1.4.6只支持HBase1.0.1之前的版本的自动创建HBase表的功能
解决方案:手动创建HBase表

3.2 导出数据:export

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

HIVE/HDFS到RDBMS

bin/sqoop export \
--connect jdbc:mysql://192.168.56.1:3306/userscenter?serverTimezone=GMT%2B8 \
--username root \
--password 123456 \
--verbose \
--table a_users \
--export-dir /sqoop/a_users \
--input-fields-terminated-by "/t"

MySQL中如果表不存在,不会自动创建

3.3 脚本打包

  1. 创建job

    bin/sqoop job --create myjob --import \
    --connect jdbc:mysql://192.168.56.1:3306/userscenter?serverTimezone=GMT%2B8 \
    --username root \
    --password 123456 \
    --verbose \
    --fetch-size 30 \
    --query 'select * from a_users where $CONDITIONS' \
    --split-by id \
    --target-dir = /sqoop1/a_users
    
  2. 查看所有job

    bin/sqoop job --list

  3. 查看单个job

    bin/sqoop job --show myjob

  4. 执行job

    bin/sqoop job -exec myjob

  5. 删除job

    bin/sqoop job --delete myjob

四、Sqoop2

4.1 服务器端

  1. 解压,重命名

  2. 修改hadoop中的配置文件(core-site.xml)

    <property>
        <name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.root.groups</name>
        <value>*</value>
    </property>
    
  3. 导入、替换jar包

    mysql的驱动包放到%Sqoop_home%\server\lib中;

    将hadoop\share\hadoop\common\lib**guava-27.0-jre.jar**拷贝到/data/sqoop/sqoop-2/server/lib和/data/sqoop/sqoop-2/tools/lib中,删除老的,留下新的;

    comm-lang2.5拷贝到hadoop集群中。

  4. 修改配置文件(conf/sqoop.properties)

    org.apache.sqoop.submission.engine.mapreduce.configuration.directory=/data/hadoop/hadoop/etc/hadoop/
    
  5. 修改配置文件(bin/sqoop.sh)

    配置HADOOP_HOME环境变量

  6. 初始化,并且验证

    bin/sqoop2-tool verify

  7. 启动服务

    bin/sqoop2-server start

4.2 工具

把元数据从derby导出

bin/sqoop2-tool repositorydump -o ~/data.json

元数据导入

sqoop2-tool repositoryload -i ~/data.json

4.3 创建link导数据

4.3.1 客户端

启动客户端

bin/sqoop2-shell

启动客户端图形界面服务

set option --name verbose --value true

set server --host node7-4 --port 12000 --webapp sqoop

检查是否连接成功

show version -all

4.3.2 创建hdfs link

create link --connector hdfs-connector
在这里插入图片描述

4.3.3 创建mysql link

create link --connector generic-jdbc-connector
在这里插入图片描述

4.3.4 创建一个job
  1. 从mysql link到hdfs link

    create job --from mysql --to hdfs 在这里插入图片描述

  2. 从hdfs link到mysql link

    create job --from hdfs --to mysql
    在这里插入图片描述

  3. 标注

    表名和表sql语句是相互排斥的。如果表名提供,则表sql语句不应该提供;如果表sql语句提供,则表名不应该提供;

    表列名只应在表名提供的情况下提供;

    如果有具有类似名称的列,则需要起列别名。

4.3.5 启动job

启动job:start job --name myjob

查看任务的状态:status job --name myjob

删除任务:delete job --name myjob

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值