Apache Sqoop是一种用于在Apache Hadoop和结构化数据存储(如关系数据库)之间高效传输批量数据的工具。实质就是将导入导出命令转换成mapreduce程序来实现。
Sqoop版本选择
根据官网介绍,当前(文档编写时间:2018-05-07)最新的稳定版本是1.4.7。 Sqoop2的最新版本是1.99.7(下载,文档)。 请注意,1.99.7与1.4.7不兼容,且未完成功能,具体信息可以参见Apache Sqoop官网。因此不适用于生产部署。所以我们选择1.4.7版本。
可以选择华中科技大学的镜像站进行下载:http://mirrors.hust.edu.cn/apache/sqoop/1.4.7
Sqoop安装配置
上传sqoop安装包sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz到/usr/local/src目录中,解压并改名:
配置SQOOP_HOME到环境变量中,vim ~/.profile
,然后写入以下内容(根据实际情况修改):
配置sqoop-env.sh
然后使用 vim sqoop-env.sh
命令,打开文件添加如下内容:
如果数据读取不涉及hbase和hive,那么相关hbase和hive的配置可以不加;如果集群有独立的zookeeper集群,那么配置zookeeper,反之,不用配置。因为本次主要是使用Sqoop从Mysql导入数据到HDFS和使用Sqoop导出HDFS数据到Mysql,所以不需要配置这三项,但是会出现harmless warnning,不过没影响。
将mysql-connector-java.jar文件复制到sqoop/lib文件夹下:
测试运行
使用vps中的数据库测试,数据库url为ip
sqoop 命令执行成功,代表安装成功,数据库连接成功。
如果使用阿里云RDS进行连接测试,需要配置RDS和本地的DNS,以便支持阿里云RDS的连接。如果不做配置会有如下报错:
Sqoop从Mysql导入数据到HDFS
新建Mysql测试表tb_roommate:
插入测试数据:
查询待处理结果集:
数据导入:
将msyql数据库wordpress中的表tb_roommate,导入到hdfs目录,默认会导入到/user/hadoop/tb_roommate
下,其中tb_roommate为导入的表名。
如果想要数据导入速度更快,可以使用--direct
模式,sqoop为特定的RDBMS提供直接连接器,因此传输更快
但是需要在每台机器上有一份mysqldump可执行文件,解决办法是复制一份mysqldump文件或者直接在每台机器上安装一个mysql数据库,如果没有mysqldump,会报如下错误:
如果要想导入到指定的目录,添加一个选项–target-dir:
因为默认执行sqoop会有4个maptasks任务,为了满足业务的需要,可以进行修改,只需要在命令后面加一个选项-m:
执行的过程中,如果输出目录已经存在,报错,要想输出到该目录 使用选项–delete-target-dir:
如果想在原来的基础之上追加新的数据,只需要添加一个选项–append,但是注意,–append和–delete-target-dir不能同时存在:
条件导入:
通过sql导入:
Sqoop导出HDFS数据到Mysql
数据导出到mysql,默认以逗号作为分隔符。导出数据到Mysql之前,表需要已经存在,否则报错
类似于Mysql duplicate操作,如果存在就更新,不存在就插入:
常见错误整理
- 阿里云RDS连接不上时,先用一个本地的url中只有ip的数据库或者是腾讯Mysql数据库进行测试,确认是否有问题
- 命令使用过程中的warning信息,需要判断是否是harmless的
参考: