sqoop数据导出导入
一 Sqoop简介:
二 Sqoop原理:
sqoop list-databases --connect jdbc:mysql://HadoopNode1:3306/test(数据库名称) --username root --password 123456

三 导入导出数据
在 Sqoop 中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS, HIVE, HBASE)传输数据的操作被称为导入操作,并采用 import 关键字完成该过程。“导出”则相反:将大数据集群中的数据输出到非大数据集群中称为导出操作,并使用 export 关键字实现数据迁移。
在Sqoop框架中,“导出”概念定义为:将HDFS、HIVE和HBASE中的大数据集群中的数据传输至非大数据存储系统(如RDBMS)中存储,并称此操作为"导出"过程;实现这一操作的关键在于使用export关键字。
1 mysql----hdfs:
#语法:
sqoop import --connect JDBCURL --table 表名 --username 帐号 --password 密码 --target-dir 导出至HDFS目标 --fields-terminated-by '\t' -m mapper的个数
sqoop import --connect jdbc:mysql://HadoopNode1:3306/test --table emp --username root --password 123456 --target-dir /user/sheng/input/sqoop1/stu --fields-terminated-by '\t' -m 1
2 mysql ---- > HDFS的增量导入:
随着mysql数据库随着时间的推移而导致的数据积累,并且仅将新增的数据部分导入HDFS。
在实际工作中,数据库中的表数据通常会持续增长。例如我们之前提到过的consumer表,在这种情况下每次新增操作后我们只需导出新增的数据而不必重复整个表格的内容(节省时间和资源)。也就是说,在这些情况下如果我们想要高效管理数据库的增长我们可以通过增量导出的方式实现这一点:将增量部分直接上传至Hadoop存储平台而无需重新导出整个表格的内容(这不仅减少了工作量还能提高系统的效率)。这就是增量导入法的基本原理。
-incremental append:增量导入
-check-column:(增量导入时需要指定增量的标准—哪一列作为增量的标准)
在增量导入过程中需明确引用前一阶段的数据列表(即last-value),以避免导致表中数据被错误地重新加载。
#语法:
sqoop import --connect JDBCURL --table 表名 --username 帐号 --password 密码 --target-dir 导出至HDFS目标 --fields-terminated-by '\t' -m mapper的个数 --incremental append --check-column 以什么字段来标识增加 --last-value 最大记录数
#例:
sqoop import --connect jdbc:mysql://HoodpNode3:3306/test --table student --username root --password 123456 --target-dir /user/sheng/input/sqoop1/stu --fields-terminated-by '\t' -m 1 --incremental append --check-column empno --last-value 7934
3 mysql ---- > Hive
语法:
sqoop import --connect JDBCURL --table 表名 --username 帐号 --password 密码 --hive-import --create-hive-table --hive-table 数据库名.表名 --fields-terminated-by '\t' -m 1
sqoop import --connect jdbc:mysql://HadoopNode1:3306/test --table emp --username root --password 123456 --hive-import --create-hive-table --hive-table default.emp --fields-terminated-by '\t' -m 1
4 mysql— >hbase
sqoop import --connect jdbc:mysql://HadoopNode1:3306/test --username root --password 123456 --table mysql_hbase --columns "id,name,sex" --column-family "info" --hbase-create-table --hbase-row-key "id" --hbase-table "mysql_hbase" --num-mappers 1 --split-by id
提示信息表明, sqoop 1\mbox{4}\mbox{6} 仅限于 HBase 1\mbox{0}\mbox{1} 早期版本的自动建立表的功能
4 HDFS ---- > mysql:
#语法:
sqoop export --connect JDBCURL --table 表名 --username 帐号 --password 密码 --table 表名 -export-dir HDFS的路径 --input-fields-terminated-by '\t'
#例:
sqoop export --connect jdbc:mysql://HadoopNode1:3306/test --table hdfs_mysql --username root --password 123456 --export-dir /user/sheng/input/sqoop1/stu/part-m-00000
--fields-terminated-by '\t' -m 1
5 HIVE ---- > mysql:
#语法:
sqoop export --connect JDBCURL --table 表名 --username 帐号 --password 密码 --table 表名 -export-dir hive数据仓库及表的路径 --input-fields-terminated-by '\t'
#例:
sqoop export --connect jdbc:mysql://HadoopNode1:3306/test --username root --password 123456 --table hive_mysql -export-dir /user/hive/warehouse/emp/emp.txt --input-fields-terminated-by '\t'
--table hive_mysql
--direct
6 hbas—>mysql
从HBase流向Hive的外部表再到内部表,并通过Sqoop完成数据迁移至MySQL
a) 在MySQL中创建空数据库。
mysql> create table test.employee(rowkey int(11),id int(11),name varchar(20),primary key (id));
b) hbase创建内部表
hbase(main):001:0> create 'employee','info'
hbase(main):002:0> put 'employee',1,'info:id',1
hbase(main):003:0> put 'employee',1,'info:name','peter'
hbase(main):004:0> put 'employee',2,'info:id',2
hbase(main):005:0> put 'employee',2,'info:name','paul'
c) hive创建外部表
CREATE EXTERNAL TABLE test.h_employee (key int,id int,name string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" =
":key,info:id, info:name"
)
TBLPROPERTIES( "hbase.table.name" = "employee",
"hbase.mapred.output.outputtable" = "employee");
d) hive创建内部表
hive> CREATE TABLE test.employee(key INT,id INT,name STRING);
e) hive外部表的数据导入内部表中
hive> insert overwrite table test.employee select * from test.h_employee;
f) sqoop导出hive表至mysql中
[root@master bin]# sqoop export -connect jdbc:mysql://192.168.220.20:3306/test -username root -password 123456 -tablemployee -export-dir /user/hive/warehouse/test.db/employee --input-fields-terminated-by '\001' --input-null-string '\ N' --input-null-non-string '\ N';
