Sqoop学习笔记

Apache sqoop是apache旗下的一款“Hadoop和关系数据库服务器之间传送数据”的工具。简单的说就是也给数据迁移工具

Sqoop工作机制是将导入或导出命令翻译成mapreduce程序来实现。在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。

导入数据:Mysql、Oracle导入到Hadoop的HDFS、HIVE、HBASE等数据库系统

导出数据:从Hadoop的文件系统中导出数据到关系数据库mysql等

sqoop的安装

下载Sqoop

安装的前提是已经安装好了java和hadoop环境。最新稳定版:1.4.6

Apache版本下载地址:http://sqoop.apache.org/

CDH版本下载地址: http://archive.cloudera.com/cdh5/cdh/5/

百度网盘下载地址:链接:https://pan.baidu.com/s/1yU72jxv9t4xf4oMO0N6HWg 提取码:dp34

解压

这里安装的时sqoop1,将下载好的安装包sqoop-1.4.6-cdh5.14.0.tar.gz上传到node03的/export/software目录下面,然后解压:

1
$ tar -zxvf sqoop-1.4.6-cdh5.14.0.tar.gz -C /export/servers/

修改配置文件

1
2
3
$ cd /sqoop-1.4.6-cdh5.14.0/conf/
$ cp sqoop-env.template.sh sqoop-env.sh
$ vim sqoop-env.sh

修改如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#设置bin/hadoop可用的路径
export HADOOP_COMMON_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0

#设置hadoop-*-core.jar可用的路径
export HADOOP_MAPRED_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0

#设置bin/hbase可用的路径
export HBASE_HOME=

#设置bin/hive可用的路径
export HIVE_HOME=/export/servers/hive-1.1.0-cdh5.14.0

#设置zookeper配置目录的路径
export ZOOCFGDIR=

加入额外的依赖包

sqoop的使用需要添加两个额外的依赖包,一个是mysql的驱动包,一个是java-json的依赖包,不然会报错。

下载地址:

下载好这两个jar包之后,将它们放到sqoop的lib目录下。

验证启动

1
2
$ cd /export/servers/sqoop-1.4.6-cdh5.14.0
$ bin/sqoop-version

help查询工具

bin/sqoop help可以打印出可用的工具列表;如果将特定工具的名称作为参数,help可以提供该工具的使用说明。

1
$ bin/sqoop help 参数

sqoop导入

“导入工具”导入单个表从RDBMS到HDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据

列举出所有数据库

  • 命令行查看帮助

    1
    $ bin/sqoop list-databases --help
  • 列出某台主机所有数据库

    1
    $ bin/sqoop list-databases --connect jdbc:mysql://ip地址:3306/ --username 用户名 --password 密码
  • 查看某一个数据库下面的所有数据表

    1
    $ bin/sqoop list-tables --connect jdbc:mysql://ip地址:3306/数据库名 --username 用户名 --password 密码

mysql导入到HDFS

1
2
## --m 1 : 表示指定一个map任务运行
$ bin/sqoop import --connect jdbc:mysql://localhost:3306/数据库名 --username 用户名 --password 密码 --table 表名 --m 1

上述命令执行成功后,默认将导入的数据存储在 /user/root/下面。如何将数据导入到指定的目录下呢?

1
2
3
4
## 指定导出目的地
--target-dir 目录路径
## 判断导出目录是否存在,如果存在就删掉
--delete-target-dir

导入到hdfs的数据默认是用逗号分隔的。如果要指定字段之间的分隔符,则

1
2
## 指定字段间的分隔符,例如:制表符
--fields-terminated-by '\t'

也可以通过sql语句查找导入到hdfs

1
2
## 通过--query参数来指定sql语句,通过sql语句过滤数据进行导入
--query 'select 字段列表 from 表名 where 条件'

mysql导入到hive

基本步骤

  1. 将mysql表中的数据导入到hive中,需要将一个叫做hive-exec-1.1.0-cdh5.14.0.jar的jar包拷贝到sqoop的lib目录下。这个jar可以到hive的安装目录的lib目录下找到。

  2. 准备hive数据库与表,举例如下:

    1
    2
    3
    hive (default)> create database sqooptohive;
    hive (default)> use sqooptohive;
    hive (default)> create external table 表名(字段名1,字段名2,...) row format delimited fields terminated by '\001';
  3. 开始导入,举例如下:

    1
    $ bin/sqoop import --connect jdbc:mysql://localhost:3306/数据库名 --username 用户名 --password 密码 --table 表名 --field-teminated-by '\001' --hive-import --hive-table hive数据库名.表名 --hive-overwrite --delete-target-dir --m 1
  4. hive表数据查看

    1
    hive (default)> select * from 表名;

导入到hive并自动创建hive表

1
2
## 自动创建hive表
--hive-database 数据库名

导入表数据子集

sqoop不需要每次都导入整张表,可以使用where子句来限定需要导入的数据。语法如下:

1
--where <条件>

增量导入

在实际工作中,数据的导入往往只需要导入增量的数据即可,并不需要将表中的所有数据都导入到hive或hdfs中去。增量导入是仅导入新添加的表中的行的技术。它需要添加incrementalcheck-columnlast-value选项来执行增量导入。语法如下:

1
2
3
4
5
6
7
## 一、只有当特定列(由--check-column指定)的值大于指定值(--last-value设置)时,sqoop才导入数据
## 二、mode:
## 1、append:适用于数据库中的表只有新行添加,不存在对现有行更新的情况
## 2、lastmodified:基于时间的增量导入,适用于现有行也有被更新的情况
--incremental <mode>
--check-column <cloumn name>
--last-value <last check column value>

增量导入结束时,程序显示在下次导入时将被指定为--last-value的值,这对于手共运行的增量导入来说很重要;但对于定期的增量导入,最好使用sqoop的saved job工具,它可以自动的保存最近一次的值并在下次作业运行时使用。

注意:增量导入的时候,一定不能加参数 --delete-target-dir,否则会报错。

sqoop数据导出

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

  • 默认操作是将文件中的数据使用insert语句插入到表中
  • 更新模式下,是生成update语句更新表数据

HDFS导出到mysql

  1. 创建mysql表

  2. 执行导出命令

    通过export来实现数据的导出,将hdfs的数据导出到mysql当中去。例如:

    1
    $ bin/sqoop export --connect jdbc:mysql://ip地址:3306/数据库名 --username 用户名 --password 密码 --table 表名 --export-dir 导出目录 --input-fields-terminated-by '分隔符'
  3. 验证mysql表数据

Sqoop作业

将事先定义好的数据导入导出任务按照指定流程运行。

语法

1
$ sqoop job [GENERIC-ARGS] [JOB-ARGS] [-- [<tool-name>] [TOOL-ARGS]]

创建作业(–create)

以创建一个名为myjob2为例

1
2
## 注意 -- import 之间由空格
$ bin/sqoop job --create myjob2 -- import --connect jdbc:mysql://localhost:3306/userdb --username root --password 123456 --table tmp --delete-target-dir --m 1

该命令创建了一个从db库的emp表导入到hdfs文件的作业。

验证作业(–list)

--list参数是用来检验保存的作业。以下命令用来验证保存sqoop作业的列表。

1
$ bin/sqoop job --list

显示的结果:

1
2
Available jobs:
myjob2

检查作业(–show)

--show参数用于检查或验证特定的工作,及其详细信息。以下命令和样本输出用来验证一个名为myjob2的作业。

1
bin/sqoop job --show myjob2

显示结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Job: myjob2
Tool: import
Options:
----------------------------
reset.onemapper = false
codegen.output.delimiters.enclose = 0
sqlconnection.metadata.transaction.isolation.level = 2
codegen.input.delimiters.escape = 0
codegen.auto.compile.dir = true
accumulo.batch.size = 10240000
codegen.input.delimiters.field = 0
accumulo.create.table = false
mainframe.input.dataset.type = p
enable.compression = false
accumulo.max.latency = 5000
db.username = root
sqoop.throwOnError = false
db.clear.staging.table = false
codegen.input.delimiters.enclose = 0
hdfs.append.dir = false
import.direct.split.size = 0
hcatalog.drop.and.create.table = false
codegen.output.delimiters.record = 10
codegen.output.delimiters.field = 44
hbase.bulk.load.enabled = false
mapreduce.num.mappers = 4
export.new.update = UpdateOnly
db.require.password = true
hive.import = false
customtool.options.jsonmap = {}
hdfs.delete-target.dir = true
codegen.output.delimiters.enclose.required = false
direct.import = false
codegen.output.dir = .
hdfs.file.format = TextFile
hive.drop.delims = false
codegen.input.delimiters.record = 0
db.batch = false
split.limit = null
hcatalog.create.table = false
hive.fail.table.exists = false
hive.overwrite.table = false
incremental.mode = None
temporary.dirRoot = _sqoop
verbose = false
import.max.inline.lob.size = 16777216
import.fetch.size = null
codegen.input.delimiters.enclose.required = false
relaxed.isolation = false
sqoop.oracle.escaping.disabled = true
db.table = tmp
hbase.create.table = false
codegen.compile.dir = /tmp/sqoop-root/compile/f41afd19f032407164f699998819e5a8
codegen.output.delimiters.escape = 0
db.connect.string = jdbc:mysql://localhost:3306/userdb

执行作业(–exec)

--exec参数用来执行保存的作业。

1
bin/sqoop job --exec myjob2
-------------本文结束感谢您的阅读-------------

本文标题:Sqoop学习笔记

文章作者:Mr.wj

发布时间:2019年12月23日 - 20:54

最后更新:2019年12月23日 - 21:30

原始链接:https://www.wjqixige.cn/2019/12/23/Sqoop学习笔记/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Mr.wj wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!