一、Sqoop 概述
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 :MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
其原理和 Hive 类似,本质就是通过命令生成 MapReduce 任务,进而去执行数据迁移任务。
二、Sqoop 使用
1. 关系型数据库数据导入 HDFS
将 mysql 的 hadooptest 数据库中的 employees 表导入 HDFS
sqoop import --connect jdbc:mysql://10.0.0.100/hadooptest
--username hadoopuser \> --password password --table employees
检查输出目录(默认情况输出文件目录名与数据表的名称相同):
hadoop fs -ls employee
可以在 HDFS 目录下看到输出的数据,里面存放的就是数据库表中的数据
/user/hadoop/employees/part-m-00000
/user/hadoop/employees/part-m-00001
/user/hadoop/employees/part-m-00002
/user/hadoop/employees/part-m-00003
可以看到这里输出了4个文件,因为 Sqoop 默认使用 4个 mapper 执行 MapReduce 作业(可以通过 -m 选项指定 mapper 的数量),Sqoop 会根据主键列的内容决定如何把数据源分段
2. 关系型数据库数据导入Hive
将 mysql 的 hadooptest 数据库中的 employees 表导入 Hive 中的 employees 表
sqoop import --connect jdbc:mysql://10.0.0.100/hadooptest
--username hadoopuser -P
--table employees
--hive-import --hive-table employees
导入指定列,并规定范围:
sqoop import --connect jdbc:mysql://10.0.0.100/hadooptest
--username hadoopuser -P
--table employees --cloumns first_name,salary
--where "salary > 45000"
--hive-import --hive-table employees
通过 SQL 查询导入
sqoop import --connect jdbc:mysql://10.0.0.100/hadooptest
--username hadoopuser -P
--table employees
--query 'select first_name, salary, timestamp(start_date) as start_date
from employees where $CONDITIONS'
--hive-import --hive-table employees
--map-colunm-hive start_date=timestamp
–query 指定了查询语句,Sqoop 要求必须在 SQL 语句中加入 where 子句
–map 指定了数据映射类型,指定 start_date 列的数据类型为 timestamp、
3. 把 Hadoop数据导入关系型数据库
将 HDFS edata目录下的所有文件导入 mysql 的 employees 表
sqoop export --connect jdbc:mysql://10.0.0.100/hadooptest
--username hadoopuser -P
--table employees
--export-dir edata
--input-fields-terminated-by '\t'
input-fields-terminated 指定了文件分隔符
上述将数据插入数据库中,可能在主键重复时会插入失败,可以使用 –update-key 指定主键,生成 UPDATE语句
还可以使用 –update-mode allowinsert,在更新现有数据的同时在数据表中插入并不存在的新纪录
4. 把 Hive 数据导入关系型数据库
Sqoop 目前无法直接将 Hive 数据表导入关系型数据库,但是在一些情况下可以解决这个问题。可以将 Sqoop 指向 Hive 在 HDFS 上存储的数据文件,从而导入这些数据。
但是 Sqoop 目前无法导出 Hive 表中存储的二进制 SequenceFile