Hadoop之Sqoop

来源:互联网 发布:淘宝找相似 编辑:程序博客网 时间:2024/06/08 18:25

sqoop

 
Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS及其相关系统(Hbase,Hive),也可以将HDFS的数据导进到关系型数据库中。
Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。对于某些NoSQL数据库它也提供了连接器。Sqoop,类似于其他ETL工具,使用元数据模型来判断数据类型并在数据从数据源转移到Hadoop时确保类型安全的数据处理。Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务来处理每个区块、利用MapReduce加快数据传输速度,以批处理方式进行数据传输。
进行增量导入是与效率有关的最受关注的问题,因为Sqoop专门是为大数据集设计的。Sqoop支持增量更新,将新记录添加到最近一次的导出的数据源上,或者指定上次修改的时间戳。
sqoop基本使用
1、从mysql导到HDFS
通过bin/sqoop help找到import参数
方向的概念:
mysql将数据导出到HDFS
HDFS是从mysql将数据导入
准备;建库
create database if not exists sqoop;
建表:
create table mysqltohdfs(
id int primary key not null,
name varchar(20) not null
);

插数据:
insert into mysqltohdfs value('1','one');
insert into mysqltohdfs value('2','two');
insert into mysqltohdfs value('3','three');
insert into mysqltohdfs value('4','four');
insert into mysqltohdfs value('5','five');
insert into mysqltohdfs value('6','six');
insert into mysqltohdfs value('7','seven');
insert into mysqltohdfs value('8','eight');
insert into mysqltohdfs value('9','night');
insert into mysqltohdfs value('10','ten');
insert into mysqltohdfs value('11','eleven');
insert into mysqltohdfs value('12','t12');
insert into mysqltohdfs value('13','t13');
insert into mysqltohdfs value('14','t14');
insert into mysqltohdfs value('15','t15');
insert into mysqltohdfs value('16','t16');
insert into mysqltohdfs value('17','t17');
insert into mysqltohdfs value('18','t18');

【mysql导入到HDFS】
bin/sqoop import \
--connect \
jdbc:mysql://bigdata-01.yushu.com:3306/sqoop \
--username root \
--password 123456 \
--table mysqltohdfs

【mysql导入到HDFS-指定导入的路径】
bin/sqoop import \
--connect \
jdbc:mysql://bigdata-01.yushu.com:3306/sqoop \
--username root \
--password 123456 \
--table mysqltohdfs \
--target-dir /sqoop

【mysql导入到HDFS 指定Mapper个数】
bin/sqoop import \
--connect \
jdbc:mysql://bigdata-01.yushu.com:3306/sqoop \
--username root \
--password 123456 \
--table mysqltohdfs \
--delete-target-dir \
--target-dir /sqoop \
--num-mappers 1

--delete-target-dir \删除目标目录
--num-mappers 1指定mapper个数

Input parsing arguments:输入指定分隔符
Output line formatting arguments:输出指定分隔符


【mysql导入到HDFS 指定Mapper个数 指定输出分隔符】
bin/sqoop import \
--connect \
jdbc:mysql://bigdata-01.yushu.com:3306/sqoop \
--username root \
--password 123456 \
--table tohdfs \
--delete-target-dir \
--target-dir /sqoop \
--num-mappers 3 \
--fields-terminated-by '\t'
-从MYSQL输入,输出到HDFS --fields-terminated-by '\t'输出指定的分割符

 WARN manager.MySQLManager: It looks like you are importing from mysql.
WARN manager.MySQLManager: This transfer can be faster! Use the --direct
WARN manager.MySQLManager: option to exercise a MySQL-specific fast path.
INFO manager.MySQLManager: Setting zero DATETIME behavior to convertToNull (mysql)

【mysql导入到HDFS 更快的运行方式】
bin/sqoop import \
--connect \
jdbc:mysql://bigdata-01.yushu.com:3306/sqoop \
--username root \
--password 123456 \
--direct \
--table tohdfs \
--delete-target-dir \
--target-dir /sqoop \
--num-mappers 1 \
--fields-terminated-by '\t'

--direct 简称:快速模式

Incremental import arguments:
   --check-column <column>        Source column to check for incremental
                                  change
   --incremental <import-type>    Define an incremental import of type
                                  'append' or 'lastmodified'
   --last-value <value>           Last imported value in the incremental
                                check column
检查列,将某一列作为一个增量导入的依据,一般是主键
实现导入方式: 'append' or 'lastmodified'
根据最后插入的值来判断 ,--last-value指的是上一次最后插入的值
或者是最后导入的那条记录的时间
【mysql导入到HDFS 增量导入】
bin/sqoop import \
--connect \
jdbc:mysql://bigdata-01.yushu.com:3306/sqoop \
--username root \
--password 123456 \
--direct \
--table mysqltohdfs \
--target-dir /sqoop \
--num-mappers 1 \
--fields-terminated-by '\t' \
--check-column id \
--incremental append \
--last-value 11

-》注意如果是增量导入,原目录是不能删除的 在原有文件的基础上新增记录。

ImportTool: (Consider saving this with 'sqoop job --create')
尝试可以将sqoop打包成一个job,代表这个任务去使用定时,实现增量导入

$ bin/sqoop job --help 
创建sqoop job
bin/sqoop job \
--create stu_info2 \
-- \
import \
--connect \
jdbc:mysql://bigdata-01.yushu.com:3306/sqoop \
--username root \
--password 123456 \
--direct \
--table mysqltohdfs \
--target-dir /sqoop \
--num-mappers 1 \
--fields-terminated-by '\t' \
--check-column id \
--incremental append \
--last-value 14
执行任务:bin/sqoop job --exec stu_info2
--last-value '2017-05-14 15:00:30'

$ bin/sqoop job --show stu_info 查看是否有某个任务
$ bin/sqoop job --list 查看任务列表

十一、将mysql的数据导入hive中
-》和mysql导到HDFS一样,先将数据文件放到HDFS上,然后将结果集移动到hive的表对应的文件夹下

bin/sqoop import \
--connect \
jdbc:mysql://bigdata-01.yushu.com:3306/sqoop \
--username root \
--password 123456 \
--table mysqltohdfs \
--hive-import \
--hive-database student \
--hive-table stu_info \
--num-mappers 1 \
--fields-terminated-by '\t';

create database student;
create table stu_info(
id int,
name string
)
row format delimited fields terminated by '\t'

十二、sqoop导出
1、从HDFS导出到mysql

bin/sqoop export \
--connect \
jdbc:mysql://bigdata-01.yushu.com:3306/sqoop \
--username root \
--password 123456 \
--table hdfstomysql \
--export-dir /sqoop \
--num-mappers 1 \
--input-fields-terminated-by '\t'

建表:
create table hdfstomysql(
id int primary key not null,
name varchar(20) not null
);
--options-file  相当于hive中-f选项
create table filetomysql(
id int primary key not null,
name varchar(20) not null
);

执行sqoop 文件
bin/sqoop --options-file sqoop.file

文件内容:
export
--connect
jdbc:mysql://bigdata-01.yushu.com:3306/sqoop
--username
root
--password
123456
--table
filetomysql
--export-dir
/sqoop
--num-mappers
1
--input-fields-terminated-by
'\t'

2、从Hive导出到mysql

bin/sqoop export \
--connect \
jdbc:mysql://bigdata-01.yushu.com:3306/sqoop \
--username root \
--password 123456 \
--table hivetomysql \
--export-dir /user/hive/warehouse/student.db/stu_info \
--num-mappers 1 \
--input-fields-terminated-by '\t'



原创粉丝点击