Sqoop 使用手册(即用即查)

一、简介

1.1 概述

Sqoop是一款数据传输工具,主要用于大数据集群与传统数据库之间的数据传输,如将MySQL中的数据导入到HDFS、Hive、HBase等,也可以将HDFS等数据导出到MySQL中。

Sqoop分为两个版本分别是sqoop1和sqoop2,且两个版本不兼容,官网中指出sqoop2不作为生产环境部署

Latest stable release is 1.4.7 (download, documentation)
Latest cut of Sqoop2 is 1.99.7 (download, documentation)
Note that 1.99.7 is not compatible with 1.4.7 and not feature complete
it is not intended for production deployment.

1.2 名词解释

Sqoop的导入导出是站在大数据集群的角度来说的,因此

导入:从传统数据库到大数据集群

导出:从大数据集群到传统数据库

1.3 原理

将导入导出命令翻译成MapReduce程序并自动化完成这个过程的大部分,还提供了并行操作和容错,定制化InputFormat和OutputFormat

二、安装

2.1 前期准备

我的组件版本

  1. jdk 1.8
  2. hadoop 3.2.1
  3. mysql 8.0.20
  4. sqoop 1.4.6

注:亲测sqoop 1.4.7用不了

2.2 配置

  1. 解压
tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
  1. 修改配置文件
cp sqoop-env-template.sh sqoop-env.sh

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/usr/local/soft/hadoop-3.2.1

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/usr/local/soft/hadoop-3.2.1

#set the path to where bin/hbase is available
export HBASE_HOME=/usr/local/soft/hbase-2.2.5

#Set the path to where bin/hive is available
export HIVE_HOME=/usr/local/soft/hive-3.1.2

#Set the path for where zookeper config dir is
export ZOOCFGDIR=/usr/local/soft/zookeeper-3.4.10
  1. 拷贝jdbc驱动

以mysql为例,将mysql连接驱动jar包拷贝到sqoop/lib下

  1. 测试sqoop
sqoop help
Warning: /usr/local/soft/sqoop-1.4.6/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /usr/local/soft/sqoop-1.4.6/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
2020-09-15 09:38:01,142 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
usage: sqoop COMMAND [ARGS]

Available commands:
  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import             Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  import-mainframe   Import datasets from a mainframe server to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information

See 'sqoop help COMMAND' for information on a specific command.
  1. 测试连接mysql
sqoop list-databases \
> --connect jdbc:mysql://master:3306 \
> --username root \
> --password 980729
Warning: /usr/local/soft/sqoop-1.4.6/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /usr/local/soft/sqoop-1.4.6/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
2020-09-15 09:41:13,200 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
2020-09-15 09:41:13,272 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
2020-09-15 09:41:13,386 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
mysql
information_schema
performance_schema
sys
metastore
company
参数说明
–connect连接关系型数据库的URL
–username用户名
–password密码,考虑安全可使用 -P
–driver指定jdbc驱动类

三、使用

以mysql到大数据集群为例,数据可自行准备

3.1 导入数据

3.1.1 导入到HDFS

1.导入全表
sqoop import \
--connect jdbc:mysql://master:3306/company \
--driver com.mysql.cj.jdbc.Driver \
--username root \
--password 980729 \
--table staff \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"
参数说明
–table导入数据的表
–target-dir导入到HDFS的路径
–delete-target-dir路径存在则删除(不推荐使用)
–num-mappers设置map数,根据数据大小设置
–fields-terminated-by指定分隔符,否则数据会连在一起

在这里插入图片描述

从打印的日志和运行结果可以看出其本质走的是MapReduce且只有map(不涉及数据的聚合操作)

2.导入查询
sqoop import \
--connect jdbc:mysql://master:3306/company \
--driver com.mysql.cj.jdbc.Driver \
--username root \
--password 980729 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name,sex from staff where id <=1 and $CONDITIONS;'

--query后面的sql执行结果导入到HDFS中

注意:

  1. 如果您想并行导入查询的结果,那么每个映射任务都需要执行一个查询副本,结果由Sqoop推断出边界条件进行分区。您的查询必须包含令牌$CONDITIONS,每个Sqoop进程将用一个唯一的条件表达式替换该令牌
  2. 如果sql使用""必须使用\$CONDITIONS,如"SELECT * FROM x WHERE a='foo' AND \$CONDITIONS"
3.导入指定列
sqoop import \
--connect jdbc:mysql://master:3306/company \
--driver com.mysql.cj.jdbc.Driver \
--username root \
--password 980729 \
--table staff \
--columns id,sex \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"

--columns 指定需要导入的列字段

4.导入指定字段
sqoop import \
--connect jdbc:mysql://master:3306/company \
--driver com.mysql.cj.jdbc.Driver \
--username root \
--password 980729 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table staff \
--where "id=1"

--where指定需要导入的字段,3,4其实就是2的分解了解即可

3.1.2导入到Hive

sqoop import \
--connect jdbc:mysql://master:3306/company \
--driver com.mysql.cj.jdbc.Driver \
--username root \
--password 980729 \
--table staff \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table staff_hive
参数说明
–hive-import标记导入到hive
–hive-overwirte覆盖导入,默认不覆盖
–hive-table指定导入的hive表
  1. 从日志分析为两次MapReduce,首先将其导入至HDFS,在将数据迁移到Hive表中
  2. 导入到HDFS默认路径时/user/${username}/表名
  3. 默认导入到数据库default
  4. 表不存在会自动创建
  5. --hive-table 数据库.表名指定数据库导入

3.1.2导入到HBase

sqoop import \
--connect jdbc:mysql://master:3306/company \
--driver com.mysql.cj.jdbc.Driver \
--username root \
--password 980729 \
--table staff \
--columns id,name,sex \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_company" \
--num-mappers 1 \
参数说明
–hbase-table指定导入的HBase表名
–column-family指定表的列族名
–hbase-row-key指定表的rowKey
–hbase-create-tableHBase表不存在自动创建
  1. sqoop 1.4.6不兼容HBase 2.x,亲测HBase 1.6.0可用
  2. --hbase-create-table仅对HBase 1.0.1以下版本有效

3.2 导出数据

3.2.1 HDFS/Hive 导出数据

HDFS/Hive 导出数据的本质是一样的,都是从HDFS -> mysql

sqoop export \
--connect jdbc:mysql://master:3306/company \
--driver com.mysql.cj.jdbc.Driver \
--username root \
--password 980729 \
--table staff \
--num-mappers 1 \
--export-dir /user/hive/warehouse/staff_hive \
--input-fields-terminated-by "\t"
参数说明
–export-dir导出文件路径
–input-fields-terminated-by指定字段分隔符
  1. 注意导出数据与mysql表数据是否存在主键唯一问题,否则job卡死
  2. 一定要指定--input-fields-terminated-by否则必报错

3.2.2 HBase 导出数据

HBase数据不能直接导出,因此需要先将HBase数据导入到Hive表,再从Hive表导出

3.2.3 执行脚本

实际生产更多的是使用脚本,通过定时任务如contab、Azkaban等执行导入导出作业

1.编写脚本
vim mysql_to_hdfs.opt

import 
--connect 
jdbc:mysql://master:3306/company 
--driver 
com.mysql.cj.jdbc.Driver 
--username 
root 
--password 
980729 
--table 
staff 
--target-dir 
/user/company 
--delete-target-dir 
--num-mappers 
1 
--fields-terminated-by 
"\t"

参数和参数值之间必须换行,必须换行,必须换行

2.运行脚本
sqoop --options-file mysql_to_hdfs.opt

四、手册

4.1 常用命令

序号命令说明
1importImportTool将数据导入到集群
2exportExportTool将集群数据导出
3codegenCodeGenTool获取数据库中某张表数据生成Java并打包Jar
4create-hive-tableCreateHiveTableTool创建Hive表
5evalEvalSqlTool查看SQL执行结果
6import-all-tablesImportAllTablesTool导入某个数据库下所有表到HDFS中
7jobJobTool用来生成一个sqoop的任务,生成后,该任务并不执行,除非使用命令执行该任务。
8list-databasesListDatabasesTool列出所有数据库名
9list-tablesListTablesTool列出某个数据库下所有表
10mergeMergeTool将HDFS中不同目录下面的数据合在一起,并存放在指定的目录中
11metastoreMetastoreTool记录sqoop job的元数据信息,如果不启动metastore实例,则默认的元数据存储目录为:~/.sqoop,如果要更改存储目录,可以在配置文件sqoop-site.xml中进行更改。
12helpHelpTool打印sqoop帮助信息
13versionVersionTool打印sqoop版本信息

4.2 导入import

序号参数说明
1–enclosed-by <char>给字段值前加上指定的字符
2–escaped-by <char>对字段中的双引号加转义符
3–fields-terminated-by <char>设定每个字段是以什么符号作为结束,默认为逗号
4–lines-terminated-by <char>设定每行记录之间的分隔符,默认是\n
5–mysql-delimitersMysql默认的分隔符设置,字段之间以逗号分隔,行之间以\n分隔,默认转义符是\,字段值以单引号包裹。
6–optionally-enclosed-by <char>给带有双引号或单引号的字段值前后加上指定字符。

4.3 导出export

序号参数说明
1–input-enclosed-by <char>对字段值前后加上指定字符
2–input-escaped-by <char>对含有转移符的字段做转义处理
3–input-fields-terminated-by <char>字段之间的分隔符
4–input-lines-terminated-by <char>行之间的分隔符
5–input-optionally-enclosed-by <char>给带有双引号或单引号的字段前后加上指定字符
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王是个弟弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值