sqoop 操作

Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

sqoop 搭建

首先将 sqoop 安装包解压到需要安装的路径下,然后进行相关配置

配置环境变量

将 SQOOP_HOME 添加到环境变量中,运行如下语句

1
2
3
vim /etc/profile
export SQOOP_HOME=安装路径
PATH=${PATH}:SQOOP_HOME/bin

环境变量更改后需要 source 一下,否则更改会应用不上

配置程序

1.进入 sqoop 下的 conf 文件夹,将 sqoop-env-template.sh 重命名为 sqoop-env.sh

2.进入文件后可以发现里面全是被注销的路径变量,可以根据自己需要使用的功能来设置相应的路径,以我的文件为例,因为需要使用 Hadoop,hbase 和 hive,所以为与这三个功能相关的变量赋值,具体如下:

3.接下来对 bin 目录下的 configure-sqoop 文件进行修改,此处和之前的修改原则相同,都是将不使用的功能注释掉。具体注释的位置是 Check: If we can't find our dependencies, give up here 注释下方的内容,此注释的意思就是放弃没有的依赖。我的注释内容如图:

4.将数据库驱动包放到 sqoop 安装路径下的 lib 文件夹中,此处我使用的版本是 mysql-connector-java-5.1.10.jar

如果安装成功,设置之后,运行 sqoop version 可以看到 sqoop 版本信息,运行 sqoop list-databases -connect jdbc:mysql://mysql地址 -username root -password **** 如果连接成功显示了 MySQL 中的库信息,则 sqoop 安装成功。

sqoop 语法

sqoop 的主要功能就是将数据在 Hadoop 和 MySQL 之间进行传输,这里主要说下 MySQL to Hbase,MySQL to Hive,MySQL to Hadoop,Hadoop to MySQL 几种方式的语法。

MySqlToHbase

1
import --connect jdbc:mysql://数据库地址/库名称 --username 用户名 --password 密码 --table 表名称 --m 线程数 --split-by 划分依据 --target-dir 存储路径 --fileds-terminated-by 存储分隔符

如果操作的数据库访问量较大,则这里的线程数不宜设置过大,防止数据库卡顿影响使用,当 m 不等于1,–split-by 默认使用主键进行划分,例如当 m=10 使用 split-by id 对表 test 进行划分时,sqoop 首先会运行 select max(id),min(id) from test 然后将 min(id),max(id) 之间的区间平均分为 10 份,然后启动 10 个 map 进行数据拉取,需要注意的是,–split-by对非数字类型的字段支持不好。一般用于主键及数字类型的字段。–target-dir 指的是数据在 hdfs 中存储的路径。–fileds-terminated-by 是指数据存储后的分隔符。

MySqlToHive

1
import --connect jdbc:mysql://数据库地址/库名称 --username 用户名 --password 密码 --table 表名称 --target-dir 存储路径 --fileds-terminated-by 字段分隔符 --lines-terminated-by 行分隔符 --hive-table hive中的表名 --hive-import(无参数,直接导出到hive,不加就不导)

存储到 hive 的语句和存储到 MySQL 的语句大致相同,需要注意的是此处的 –target-dir 并不是数据文件最终存储的位置,数据文件最初会上传到–target-dir的位置,但最后会移动到 hive 的存储路径下,默认情况下导入的表会放在 default 库下,如果要指定表的存储位置则需要在 –hive-table 声明表的时候加上数据库,如 default.test

MySqlToHbase

1
import --connect jdbc:mysql://数据库地址/库名称 --username 用户名 --password 密码 --table 表名称 --hbase-table hbase中的表名称 --hbase-create-table (无参数,自动创建表)--hbase-row-key RowKey名称 --column-family 列簇名称

HdfsToMySql

1
export --connect jdbc:mysql://数据库地址/库名称 --username 用户名 --password 密码 --table 表名称 --columns 所有字段,以逗号隔开 --export-dir 数据在hdfs中的位置 --fileds-terminated-by 原始数据分隔符

为防止数据导入到 MySQL 乱码需要指定字符集,首先在建表时将字符集设置为 utf8 ,另外 jdbc 在连接时也要指定字符集,指定方法为在链接字符串后加上 ?characterEncoding=utf8

增量到数据

当数据发生更改时, sqoop 的数据转移就面临两种选择,第一种是将所有数据重新传递一遍,第二种是只传递变更和新增的数据。显然,这里的第二种方式更加科学一点。第二种方式在 sqoop 中有两种方法,下面分别介绍。

-----------本文结束感谢您的阅读-----------
0%