文章目录
概述
sqoop是一款开源工具,主要运用在Hadoop(Hive)与传统的数据库(mysql\postgresql等)间进行数据的传递;
它最早是作为hadoop的一个第三方模块存在,后来为了让使用者能快速部署以及迭代开发,最后独立成为Apache项目;
依赖于hadoop,数据并行写入;
传递类型分为两种:
1)import——MySQL导入到HDFS中;
2)export——将HDFS的数据导出到关系型数据库中;
我们可以将导入或导命令翻译成MapReduce程序来实现,并且不需要reducetask,在其中主要针对inputformat和outformat进行定制。
数据导入
- sqoop会通过jdbc来获取需要的数据库的元数据信息,例如:导入的表的列名,数据类型。
- 这些数据库的数据类型会被映射成为java的数据类型,根据这些信息,sqoop会生成一个与表名相同的类用来完成序列化工作,保存表中的每一行记录。
- sqoop开启MapReduce作业 。
- 启动的作业在input的过程中,会通过jdbc读取数据表中的内容,这时,会使用sqoop生成的类进行序列化。
- 最后将这些记录写到hdfs上,在写入hdfs的过程中,同样会使用sqoop生成的类进行反序列化。
MySQL到HDFS
简单举例导入数据
基础思路:
- 需要指明是导入import;
- 之后必须指定所连接的数据库,其用户名和密码;
- 指定数据库表,最终目标路径,同时注意如果这个目录已经存在,先删除或者使用append参数,表示追加;
- 指定启动的maptask的个数;
- hdfs文件数据的分隔符。
在shell命令行实现
sqoop import \
--connect jdbc:mysql://hadoop102:3306/sqoop \
--username root \
--password 123456 \
--table goodtbl \
--target-dir /root/sqoop_hdfs \
--delete-target-dir \
-m 1 \
--fields-terminated-by "\t"
//如果需要导入查询数据
//两种方式
//1.使用query 不需要指定数据库表,sql语句中有
--query 'select col_name... from tbk_name where 筛选条件 and ¥CONDITIONS'
//查询语句中的where子句中必须包含'$CONDITIONS',也是为了数据分区使用,即使只有1个MapTask;
//若query后使用的是双引号,则$CONDITIONS前必须加转义符,也就是\$CONDITIO