Sqoop数据导入

Sgoop 数据导人(import)是将关系数据库中的单个表数据导人到 HDFS 和 Hive 等具有 Hadoop 分布式存储结构的文件系统中,表中的每一行都被视为一条记录,所有记录默认以文本文件格式进行逐行存储,还可以以二进制形式存储,如 Avro 文件格式和序列文件格式(SequenceFile)。

一、数据准备


为了演示 Sqoop 数据导人、导出的相关操作,首先在 hadoop01 机器上安装的 MySQL数据库中创建 userdb 数据库,字符集设置为 UTF-8,接下来创建表:emp.

#连接mysql
mysql -uroot -pmysql

#数据库sqooptest创建
CREATE DATABASE sqooptest CHARACTER SET utf8 COLLATE utf8_general_ci;
use sqooptest;

#检查数据库是否存在表“emp”
DROP TABLE IF EXISTS ’emp‘;

#创建表emp
CREATE TABLE emp (   id INT PRIMARY KEY,   name VARCHAR(255),   age INT,   salary DECIMAL(10, 2) );

#查看表结构
describe emp;

#插入表数据
insert into emp values(1,"zhangsan",15,2000);
insert into emp values(2,"lisi",20,4000);
insert into emp values(3,"wangwu",20,3000);

#查看表数据是否插入成功
select * from emp;

二、MySQL表数据导入HDFS 

#启动hdfs(Hadoop集群)
start-dfs.sh
start-yarn.sh

#MySQL导入HDFS命令
sqoop import --connect jdbc:mysql://master:3306/sqooptest --username root --password mysql --target-dir /sqoopresult --table emp --num-mappers 1

#--connect 指定连接的关系数据库,包括驱动名、主机名、端口号、数据库名,这里连接的主机名不能是localhost,而是mysql所在的主机名或IP地址
#--username 指定连接数据库的用户名
#--password 指定连接数据库的密码
#--target-dir 指定导入到HDFS的目录路径
#--table 代表要导入数据库操作的MySQL源数据库表明
#--num-mappers 指定map任务数(默认为4)这里指定为1


 导入成功后可在HDFS UI的指定目录下查看结果文件

 查看文件与我们epm表的数据一致

也可使用hdfs dfs -cat /sqoopresult/part-m-00000

三、MySQL增量导入HDFS

当 MySQL 表中的数据发生了新增或修改变化,需要更新 HDFS 上对应的数据时,就可以使用 Sqoop 的增量导人功能。Sqoop 目前支持两种增量导入模式:

append 模式:主要针对 INSERT 新增数据的增量导入

astmodified 模式:astmodified 模式主要针对 UPDATE 修改数据的增量导人


在进行增量导人操作时,首先必须指定“--check-column”参数,用来检查数据表列字段从而确定哪些数据需要执行增量导人。例如,在执行 append 模式增量导入时,通常会将“.check-column”参数指定为具有连续自增功能的列(如主键 id);而执行 lastmodified 模式增量导人时,通常会将“--check-column”参数必须指定为日期时间类型的列(如 date 或timestamp类型的列)
同时,还可以为增量导人操作指定“--last-value”参数,只用于增量导人 last-value 值以后的记录数据,然后存储到之前 HDFS 上相应目录下的一个单独文件中。否则,会导人原表中所有数据到 HDFS 上相应目录下的一个单独文件中

1.往emp表中在添加一条数据

#进入mysql
mysql -uroot -pmysql

use sqooptest;
insert into emp values(4,"zhaoliu",40,8500);

2.将emp新增的数据以append模式进行增量导入

sqoop import --connect jdbc:mysql://master:3306/sqooptest --username root --password mysql --target-dir /sqoopresult --table emp --num-mappers 1 --incremental append --check-column id --last-value 3


#--incremental append”指定了使用增量导入的模式为 append;“
#-check-column id”指定了针对表 emp 数据的id 主键进行检查“
#--last-value 3”指定了针对 id 值为 3 以后的数据执行增量导入。

 由于上述参数--last-value 3,所以导入了id=3后面的数据到HDFS的结果文件中

 四、MySQL表数据导入Hive

如果Hadoop集群部署了Hive服务,并且在Sqoop服务的sqoop-env.sh文件中配置Hive的安装路径,那么就可以通过Sqoop工具将MySQL数据表导入到Hive表中。

sqoop import --connect jdbc:mysql://master:3306/sqooptest --username root --password mysql --table emp --hive-table itcase.emp --create-hive-table --hive-import --num-mappers 1

#--hive-table itcase.emp用于指定上传到HIVE上的目标itcase数据库的emp表,需要提前创建itcase数据库
#--create-hive-table用于指定自动创建指定的HIVE表,如果emp表已存在则执行失败
#--hive-import用于mysql对HIve的数据映射

通过web UI查看

 mysq数据成功导入到Hive

如果出现以下报错,则进行以下修改

(1)添加 环境变量

#添加hive的配置目录
export HIVE_CONF_DIR=/PATH/TO/hive/conf

source /etc/profile

(2)将/hive/lib/hive-common-3.1.2.jar 复制到sqoop/lib目录下,在执行以上数据迁移命令

五、MySQL表数据子集导入

有些时候开发人员只需要针对部分数据进行导入,可以使用sqoop的where,query参数进行数据过滤,再进行导入。

--where:针对简单数据过滤

sqoop import --connect jdbc:mysql://master:3306/sqooptest --username root --password mysql --table emp --where "id=2" --num-mappers 1 --target-dir /wherequery

#--where “id=2” 筛选出id=2的数据,可自行改变条件测试,如果是字符串格式为where “city=‘gd’”
#--target-dir /wherequery HDFS指定存放目录

 --query:针对复杂数据过滤

sqoop import --connect jdbc:mysql://master:3306/sqooptest --username root --password mysql  --query 'SELECT id,name,salary from emp WHERE id>2 AND $CONDITIONS' --num-mappers 1 --target-dir /wherequery1

#的“-query”参数进行数据过滤,它的主要作用就是先通过该参数指定的查询语句查询出子集数据,然后再将子集数据进行导人。上述示例中SCONDITIONS相当于一个动态占位符,动态地接收经过滤后的子集数据,然后让每个Map 任务执行查询的结果并进行数据导人。

注意事项:

(1)如果没有指定“--num-mappers 1”(或-m 1,即 map 任务个数为 1),那么在指令中必须还要添加“--split-by”参数。“--split-by”参数的作用就是针对多副本 map 任务并行执行查询结果并进行数据导入,该参数的值要指定为表中唯一的字段(如主键 id);

(2)“--query”参数后的查询语句中(如示例中单引号中的 SELECT 语句),如果已经使用了 WHERE 关键字,那么在连接 $CONDITIONS 占位符前必须使用 AND 关键字;否则,就必须使用 WHERE 关键字连接;


(3)“--query”参数后的查询语句中的$ CONDITIONS 占位符不可省略,并且如果查询语句使用双引号(")进行包装,那么就必须使用\$ CONDITIONS,这样可以避免 Shell 将其视为 Shell 变量。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值