Sqoop

Sqoop 原理及入门教程

Posted by leone on 2019-02-25

sqoop

sqoop介绍

什么是sqoop

Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。

Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
对于某些NoSQL数据库它也提供了连接器。Sqoop,类似于其他ETL工具,使用元数据模型来判断数据类型并在数据从数据源转移到Hadoop时确保类型安全的数据处理。Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务来处理每个区块。

Sqoop导入

导入工具从RDBMS向HDFS导入单独的表。表中的每一行都被视为HDFS中的记录。所有记录都以文本文件的形式存储在文本文件中或作为Avro和Sequence文件中的二进制数据存储。

Sqoop导出

导出工具将一组文件从HDFS导出回RDBMS。给Sqoop输入的文件包含记录,这些记录在表中被称为行。这些被读取并解析成一组记录并用用户指定的分隔符分隔。

sqoop实战

sqoop安装(只需要做几项配置即可使用无需启动服务)

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
# sqoop的安装依赖java环境和hadoop所以安装sqoop前必须安装java和hadoop

# 下载sqoop
$ wget https://mirrors.shu.edu.cn/apache/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz

# 解压sqoop
$ tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz

# 修改配置文件
$ cp sqoop-env-template.sh sqoop-env.sh

# 修改一下配置(替换为你的软件安装目录)
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/export/servers/hadoop-2.7.7

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/export/servers/hadoop-2.7.7

#set the path to where bin/hbase is available
#export HBASE_HOME=/export/servers/hbase-2.1.2

#Set the path to where bin/hive is available
export HIVE_HOME=/export/servers/apache-hive-2.3.4-bin

# 上传mysql的驱动包到$SQOOP_HOME/lib目录下

# 验证sqoop是否安装成功

# 查看sqoop版本
$ $SQOOP_HOME/bin/sqoop-version

# 查看mysql中的库
$ $SQOOP_HOME/bin/sqoop-list-databases --connect jdbc:mysql://ip --username xxxx --password xxxx

# 查看mysql中的表
$ $SQOOP_HOME/bin/sqoop-list-tables --connect jdbc:mysql://ip/dbName?userSSL=false --username xxxx --password xxxx

sqoop的实战

mysql数据导入到好HDFS中

1
2
3
4
5
6
7
8
$ $SQOOP_HOME/bin/sqoop import \
--connect jdbc:mysql://ip/dbName \
--username root \
--password root \
--table t_site \
--fields-terminated-by ',' \
--target-dir /sqoop-1.4.7/mysql/t_site \
--m 2

HDFS中的数据导入到mysql中

1
2
3
4
5
6
7
$ $SQOOP_HOME/bin/sqoop export \
--connect "jdbc:mysql://ip/dbName?useUnicode=true&characterEncoding=utf8" \
--username root \
--password root \
--table t_site_bak \
--export-dir /sqoop-1.4.7/mysql/t_site \
--fields-terminated-by ','

mysql中的数据导入到hive中

1
2
3
4
5
6
7
8
9
10
11
bin/sqoop import \
--connect "jdbc:mysql://39.108.125.41:3306/boot?useSSL=false&characterEncoding=utf8" \
--username root \
--password root \
--table t_site \
--m 2 \
--hive-import \
--fields-terminated-by ',' \
--hive-database db1 \
--create-hive-table \
--hive-table t_site_hive

hive中的数据导入到mysql中

1
2
3
4
5
6
7
8
9
bin/sqoop export \
--connect "jdbc:mysql://39.108.125.41:3306/boot?useSSL=false&characterEncoding=utf8" \
--username root \
--password root \
--table t_site_bak \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
--export-dir /hive-2.3.4/db1.db/t_site_hive \
--fields-terminated-by ','

sqoop 导入导出相关参数

  • 验证相关的参数
参数 描述
–valid 启动数据验证功能,只对单表copy有效
–validator < class-name > 指定验证类
–validation-threshold < class-name > 指定使用的阈值验证类
–validation-failurehandler < class-name > 指定验证失败的处理类
  • import控制参数
参数 描述
–append 导入的数据追加到数据文件中
–as-avrodatafile 导入数据格式为avro
–as-sequencefile 导入数据格式为sqeuqncefile
–as-textfile 导入数据格式为textfile
–boundary-query < statement > 代替min(split-by),max(split-by)值指定的边界,下面会有详细介绍
–columns < col,col,col… > 指定导入字段
–delete-target-dir 如果导入的target路径存在,则删除
–direct 使用direct模式
–fetch-size < n > 从数据库一次性读入的记录数
-inline-lob-limit < n > 设定大对象数据类型的最大值
-m, –num-mappers < n > 指定并行导入数据的map个数,默认为4个
-e, –query < statement > 导入查询语句得到的数据
–split-by < column-name > 一般与-m参数一起使用,指定分割split的字段
–table < table-name > 指定database中的表名
–target-dir < dir > 指定目标HDFS路径
–warehouse-dir < dir > 指定表目标路径所在路径
–where < where clause > 即sql语句中的where条件
-z, –compress 打开压缩功能
–compression-codec < c > 使用Hadoop的压缩,默认为gzip压缩
–null-string < null-string > 源表中为null的记录导入为string类型时显示为null-string,默认显示为”null”
–null-non-string < null-string > 源表中为null的记录导入为非string类型时显示为null-string,默认显示为”null”
  • export控制参数
参数 描述
–columns < col,col,col… > 指定导出字段
–direct 使用direct模式
–export-dir < dir > 导出HDFS文件路径
-m, –num-mappers < n > 指定并行导出数据的map个数,默认为4个
–table < table-name > 指定database中的表名
–call < stored-proc-name > 调用的存储过程名称
–update-key < col-name > UPDATE模式下的更新字段,多个字段可以用逗号分隔
–update-mode < mode > 当某记录在数据库中找不到对应记录时的操作。默认为updateonly,可以设置成allowinsert,这个模式遇到新增记录会插入导出表中
–input-null-string < null-string > string类型字段表示null值的字符
–input-null-non-string < null-string > 非string类型字段表示null值的字符
–staging-table < staging-table-name > 在最终导出到目标表之前临时存储这些记录的表
–clear-staging-table 表示可以清除上面的staging-table表中的记录
–batch 对底层数据库的插入操作使用batch模式

报错Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR

将hive 里面的lib下的hive-exec-**.jar 放到 sqoop 的 lib 下可以解决以下问题