Sqoop 简介

Sqoop是将关系数据库(oracle、mysql、postgresql等)数据与hadoop数据进行转换的工具。

官网:http://sqoop.apache.org/

版本:(两个版本完全不兼容,sqoop1使用最多)

  • sqoop1:1.4.x
  • sqoop2:1.99.x

同类产品:

  • DataX:阿里顶级数据交换工具

Sqoop 架构

sqoop 架构非常简单,是 hadoop 生态系统的架构最简单的框架,它主要由三个部分组成:Sqoop client、HDFS/HBase/Hive、Database

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

Sqoop 导入

Sqoop 导出

Sqoop 安装使用

Sqoop 安装

1、下载解压 Sqoop

可以到apache基金sqoop官网 http://hive.apache.org/,选择镜像下载地址:http://mirror.bit.edu.cn/apache/sqoop/下载一个稳定版本。

**2、配置环境变量 **

vim ~/.bash_profile	 #这里配置局部环境变量

source ~/.bash_profile	#刷新环境变量

3、添加数据库驱动包

cp mysql-connector-java-5.1.10.jar /sqoop-install-path/lib

4、重命名配置文件

mv sqoop-env-template.sh sqoop-env.sh

5、修改配置 configure-sqoop

在 sqoop 安装包的 bin 目录下

注释掉未安装服务相关内容;

例如(HCatalog、Accumulo):

## Moved to be a runtime check in sqoop.
#if [ ! -d "${HCAT_HOME}" ]; then
# echo "Warning: $HCAT_HOME does not exist! HCatalog jobs will fail."
# echo 'Please set $HCAT_HOME to the root of your HCatalog installation.'
#fi

#if [ ! -d "${ACCUMULO_HOME}" ]; then
# echo "Warning: $ACCUMULO_HOME does not exist! Accumulo imports will fail."
# echo 'Please set $ACCUMULO_HOME to the root of your Accumulo installation.'
#fi

6、测试

sqoop version	#测试版本号

注意:我这里报了一个错

Error: /usr/soft/sqoop-1.4.6.bin/bin/…/…/hadoop does not exist!
Please set $HADOOP_COMMON_HOME to the root of your Hadoop installation.

根据错误提示缺少的 hadoop 安装路径配置,需修改 sqoop 配置文件。

网上给出的办法是:

进入sqoop下的conf目录编辑 sqoop-env.sh 文件,给 HADOOP_COMMON_HOME 和 HADOOP_MAPRED_HOME 添加 hadoop 安装路径,注意去掉#号 [ # 是注释 ]

重新检测,发现还有警告,需要添加 ZOOKEEPER_HOME,填上 Zookeeper 的安装路径。

重新回到 sqoop-env.sh 文件中,添加如下一行:

再次检测,完美!

7、连接数据库

sqoop list-databases -connect jdbc:mysql://sean01:3306/ -username root -password 123456

连接之前记得一定要先启动 mysql 数据库

Sqoop 参数

Sqoop 连接参数

Sqoop 导入参数

Sqoop 导出参数

Sqoop 操作

将关系型数据库中的数据导入到 HDFS/Hive/Hbase。

mysql导入到HDFS/Hive/HBase

导入到 HDFS

1、先准备数据,在 mysql 中建表 stu

2、在 sqoop 上执行语句

sqoop import --connect jdbc:mysql://localhost:3306/sqoop --username root --password 123456 --table stu -m 1 -target-dir hdfs://Xss/mysqoop	#指明集群名称和导入的路径

从日志打印中可以得知只运行了 Map,不改变结果。

3、在HDFS Web端上查看

4、下载打开得到数据

导入到 Hive

1、先启动 Hive

这里注意:Hive不同的配置模式启动也不同,但要保证一点,Hive的客户端必须跟Sqoop在一个节点上,否则报错!

我这里3个节点用的是远程分开模式,所以需要分别启动服务端 sean02 和客户端 sean03

2、在 sqoop 上执行语句

sqoop import --connect jdbc:mysql://sean01:3306/sqoop --username root --password 123456 --table stu -m 1 --hive-import

这里最终导入 Hive 的地址,我们在远程一体模式中配置文件中已经指定好了路径,在服务端的Hive安装包的 conf目录下的 hive-site.xml 文件中

执行完毕我们来HDFS(因为Hive的数据也是存储到HDFS中)查看

3、HDFS Web端查看Hive数据

4、下载查看

HDFS/Hive/HBase导出到mysql

1、清空 mysql 的表数据

清空表 stu 为导出做准备。

2、在 Sqoop 上执行语句

#从HDFS中导出
sqoop export --connect jdbc:mysql://sean01:3306/sqoop --username root --password 123456 --table stu -export-dir /mysqoop/part-m-00000 #指明集群名称和表数据路径

3、查看 Navivat中的mysql

可以看出,数据已经成功导出

4、从Hive中导出同理

#从Hive中导出
sqoop export --connect jdbc:mysql://sean01:3306/sqoop --username root --password 123456 --table stu -export-dir /user/hive/warehouse/stu/part-m-00000 --input-fields-terminated-by '\001'

注意:这里的\001是Hive默认的分隔符,属于不可见字符,这个字符在vi里是^A

我们可以在 vim 中查看一下

hdfs dfs -cat /user/hive/warehouse/stu/part-m-00000

会发现分隔符并不可见

但是我们下载下载使用 vim 查看呢

hdfs dfs -get /user/hive/warehouse/stu/part-m-00000
vim part-m-00000

这个字符在 vi 里是 ^A

5、再次清空mysql中的stu表,执行语句从Hive导出,查看Navcat

表stu数据再次回来,表示从 Hive 中完美导出