1 概述
sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。
导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统;
导出数据:从Hadoop的文件系统中导出数据到关系数据库

2 工作机制
将导入或导出命令翻译成mapreduce程序来实现
在翻译出的mapreduce中主要是对inputformat和outputformat进行定制
sqoop安装
1、下载并解压
最新版下载地址http://ftp.wayne.edu/apache/sqoop/1.4.6/
修改配置文件 conf 下面的的 sqoop-env.sh 文件
配置 haddop hive hbases环境变量
3、加入mysql的jdbc驱动包
cp /home/hadoop/mysql-connector-java-5.1.28.jar $SQOOP_HOME/lib/
安装 就完成了
启动Sqoop bin/sqoop
出现这个的原因是因为 我没有配置 hbases, accumulo 的环境变量
sqoop 的基本操作 为了演示操作 必须创建数据库 测试数据
drop database if exists userdb;
create database userdb;
use userdb;
drop table if exists emp;
drop table if exists emp_add;
drop table if exists emp_conn;
CREATE TABLE emp(
id INT NOT NULL,
name VARCHAR(100),
deg VARCHAR(100),
salary BIGINT,
dept VARCHAR(50)
);
CREATE TABLE emp_add(
id INT NOT NULL,
hno VARCHAR(50),
street VARCHAR(50),
city VARCHAR(50)
);
CREATE TABLE emp_conn(
id INT NOT NULL,
phno VARCHAR(50),
email VARCHAR(50)
);
insert into emp values(1201,'gopal','manager','50000','TP');
insert into emp values(1202,'manisha','Proof reader','50000','TP');
insert into emp values(1203,'khalil','php dev','30000','AC');
insert into emp values(1204,'prasanth','php dev','30000','AC');
insert into emp values(1205,'kranthi','admin','20000','TP');
insert into emp_add values(1201,'288A','vgiri','jublee');
insert into emp_add values(1202,'108I','aoc','sec-bad');
insert into emp_add values(1203,'144Z','pgutta','hyd');
insert into emp_add values(1204,'78B','old city','sec-bad');
insert into emp_add values(1205,'720X','hitec','sec-bad');
insert into emp_conn values(1201,'2356742','gopal@tp.com');
insert into emp_conn values(1202,'1661663','manisha@tp.com');
insert into emp_conn values(1203,'8887776','khalil@ac.com');
insert into emp_conn values(1204,'9988774','prasanth@ac.com');
insert into emp_conn values(1205,'1231231','kranthi@tp.com');
4 Sqoop的数据导入
“导入工具”导入单个表从RDBMS到HDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据(或者Avro、sequence文件等二进制数据)
1 语法
下面的语法用于将数据导入HDFS。
sqoop import (generic-args) (import-args)
下面的命令用于从MySQL数据库服务器中的emp表导入HDFS。
bin/sqoop import \
--connect jdbc:mysql://192.168.111.130:3306/userdb \
--username root \
--password root \
--table emp \
--m 1
参数说明
import 导入表
--connect jdbc:mysql://hdp-node-01:3306/test --username root --password root 数据库连接
--m 1 设置 mapreducer 的个数
当语句执行完成之后 表被储存在默认的位置 /user/用户名/表名 /user/hadoop/emp
文件中字段默认以 , 来区分
hadoop fs -cat /user/hadoop/emp/part-m-00000

指定导入的目录 --target-dir <new or exist directory in HDFS>
bin/sqoop import --connect jdbc:mysql://192.168.111.130:3306/userdb --username root --password root --table emp2 --target-dir /a1/emp --m 1
导入关系表到HIVE
bin/sqoop import --connect jdbc:mysql://192.168.111.130:3306/userdb --username root --password root --table emp --hive-import --m 1
导入hive的时候 默认目录中不能 有当前表 应为 sqoop 会先把文件上传倒hdfs 中 在上传到hive 上 的默认库中
导入表数据子集
我们可以导入表的使用Sqoop导入工具,"where"子句的一个子集。它执行在各自的数据库服务器相应的SQL查询,并将结果存储在HDFS的目标目录。
where子句的语法如下。
--where <condition>
下面的命令用来导入emp_add表数据的子集。子集查询检索员工ID和地址,居住城市为:sec-bad
bin/sqoop import \
--connect jdbc:mysql://192.168.111.130:3306/userdb \
--username root \
--password root \
--where "city ='sec-bad'" \
--target-dir /wherequery \
--table emp_add --m 1
按需导入
bin/sqoop import \
--connect jdbc:mysql://192.168.111.130:3306/userdb \
--username root \
--password root \
--target-dir /a1/wherequery2 \
--query 'select id,name,deg from emp WHERE id>1203 and $CONDITIONS' \
--split-by id \
--fields-terminated-by '\t' \
--m 1
查看导入是否成功
hadoop fs -cat /wherequery/part-m-*

增量导入
增量导入是仅导入新添加的表中的行的技术。
它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入。
下面的语法用于Sqoop导入命令增量选项。
--incremental <mode>
--check-column <column name>
--last value <last check column value>
假设字段对数据库字段添加了
bin/sqoop import \
--connect jdbc:mysql://192.168.111.130:3306/userdb \
--username root \
--password root \
--table emp --m 1 \
--incremental append \
--check-column id \
--last-value 1208 上一次导入的id的最大值
5 Sqoop的数据导出
将数据从HDFS导出到RDBMS数据库
导出前,目标表必须存在于目标数据库中。
默认操作是从将文件中的数据使用INSERT语句插入到表中
更新模式下,是生成UPDATE语句更新表数据
语法bin/sqoop export (generic-args) (export-args)
先在数据库中创建一个表 准备接受导出数据 以导出emp 为例
CREATE TABLE employee (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20),
deg VARCHAR(20),
salary INT,
dept VARCHAR(10));
2、然后执行导出命令
bin/sqoop export \
--connect jdbc:mysql://192.168.111.130:3306/userdb \
--username root \
--password root \
--table employee \
--export-dir /user/hadoop/emp/
查看一下导出是否成功
select * from employee;
