一、实现功能
将mysql数据库中数据导入到hdfs上。
二、方法
1.mysql中新建测试表
create database if not exists sqoop;
use sqoop;
//创建测试表
create table tohdfs(
id int primary key not null,
name varchar(20) not null
);
//插入测试数据
insert into tohdfs value('1','jack');
insert into tohdfs value('2','leo');
insert into tohdfs value('3','peter');
insert into tohdfs value('4','tom');
insert into tohdfs value('5','linda');
insert into tohdfs value('6','marry');
insert into tohdfs value('7','jerry');
insert into tohdfs value('8','zhangsan');
insert into tohdfs value('9','lisi');
2.mysql数据导入到HDFS,指定目录"/sqoop"
bin/sqoop import \
--connect jdbc:mysql://bigdata.ibeifeng.com:3306/sqoop \
--username root \
--password 123456 \
--table tohdfs \
--target-dir /sqoop
3.指定mapper数量
指定使用id字段分割数据到不同的mapper中
bin/sqoop import \
--connect jdbc:mysql://bigdata.ibeifeng.com:3306/sqoop \
--username root \
--password 123456 \
--delete-target-dir \
--table tohdfs \
--split-by id \
--num-mappers 5
4.提前删除输出目录(重复输出数据到同一个路径会报错)
bin/sqoop import \
--connect jdbc:mysql://bigdata-03:3306/sqoop \
--username root \
--password 123456 \
--table tohdfs \
--delete-target-dir \
--target-dir /sqoop \
--num-mappers 1
5.自定义分隔符
(1)指定输入sqoop的数据的分隔符
--input-fields-terminated-by <char>
(2)指定输出sqoop数据的分隔符
--fields-terminated-by <char>
bin/sqoop import \
--connect jdbc:mysql://bigdata.ibeifeng.com:3306/sqoop \
--username root \
--password 123456 \
--table tohdfs \
--delete-target-dir \
--target-dir /sqoop \
--num-mappers 1 \
--fields-terminated-by ','
6.增量导入
【官网:http://archive.cloudera.com/cdh5/cdh/5/sqoop/SqoopUserGuide.html#_incremental_imports】
(1)功能:从原有的数据上进行追加数据
(2)配置参数
--check-column:指定要确定要导入的行时要检查的列,一般都是拿主键作为检测列,注意:char、varchar类型是不可以的
--incremental:有两种模式:append 和 lastmodified
append 追加 ,lastmodified 时间戳
--last-value:指定上次导入检查列最后字段的最大值,也就是最后一个值
(3)两种模式
append模式
--check-column id
--last-value 5 //5的作用是,这次导入时候,从mysql表中id=5的后面开始导入!
lastmodified模式
--check-column time 列time下面的数据:指的是你添加数据时的一个时间戳
--last-value last_time 最后一行数据的时间戳
(4)测试append模式增量导入
(a)在mysql里增加数据
insert into tohdfs values(10,'one');
insert into tohdfs values(11,'two');
insert into tohdfs values(12,'three');
insert into tohdfs values(13,'four');
insert into tohdfs values(14,'five');
(b)导入到hdfs
bin/sqoop import \
--connect jdbc:mysql://bigdata.ibeifeng.com:3306/sqoop \
--username root \
--password 123456 \
--direct \
--target-dir /sqoop_test \
--table tohdfs \
-m 1 \
--fields-terminated-by "\t" \
--check-column id \
--incremental append \
--last-value 7
结果:
6 marry
7 jerry
8 zhangsan
9 lisi
10 one
11 two
12 three
13 four
14 five
***********下面就是新追加的值!***************
8 zhangsan
9 lisi
10 one
11 two
12 three
13 four
14 five
7、sqoop 创建一个job
(1)基本命令
bin/sqoop job --create 创建
bin/sqoop job --list 显示可用的job
bin/sqoop job --show myjob 显示job的详细信息(show后面拼接job的名称)
bin/sqoop job --exec 执行(指定job)
bin/sqoop job --delete 删除(指定job)
(2)在mysql中再次添加数据
insert into tohdfs values(15,'1one');
insert into tohdfs values(16,'1two');
insert into tohdfs values(17,'1three');
insert into tohdfs values(18,'1four');
insert into tohdfs values(19,'1five');
(3)创建job:jobID01
bin/sqoop job \
--create jobID01 \
-- \
import \
--connect jdbc:mysql://bigdata.ibeifeng.com:3306/sqoop \
--username root \
--password 123456 \
--direct \
--target-dir /sqoop_test3 \
--table tohdfs \
-m 1 \
--fields-terminated-by "\t" \
--check-column id \
--incremental append \
--last-value 14
(4)执行job
bin/sqoop job --exec jobID01
输入mysql的密码