1 Sqoop概述
传统的应用程序管理系统,即应用程序与使用RDBMS的关系数据库的交互,是产生大数据的来源之一。由RDBMS生成的这种大数据存储在关系数据库结构中的关系数据库服务器中。
当大数据存储和Hadoop生态系统的MapReduce,Hive,HBase,Cassandra,Pig等分析器出现时,他们需要一种工具来与关系数据库服务器进行交互,以导入和导出驻留在其中的大数据。在这里,Sqoop在Hadoop生态系统中占据一席之地,以便在关系数据库服务器和Hadoop的HDFS之间提供可行的交互。
Sqoop - “SQL到Hadoop和Hadoop到SQL”
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。它由Apache软件基金会提供。
Sqoop如何工作?
下图描述了Sqoop的工作流程。
Sqoop导入
导入工具从RDBMS向HDFS导入单独的表。表中的每一行都被视为HDFS中的记录。所有记录都以文本文件的形式存储在文本文件中或作为Avro和Sequence文件中的二进制数据存储。
Sqoop导出
导出工具将一组文件从HDFS导出回RDBMS。给Sqoop输入的文件包含记录,这些记录在表中被称为行。这些被读取并解析成一组记录并用用户指定的分隔符分隔。
2 验证Sqoop
以下命令用于验证Sqoop版本。
$ cd $SQOOP_HOME/bin
$ sqoop-version
输出 -
14/12/17 14:52:32 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
Sqoop 1.4.5 git commit id 5b34accaca7de251fc91161733f906af2eddbe83
Compiled by abe on Fri Aug 1 11:19:26 PDT 2014
Sqoop安装完成,如何安装百度下就可以了。
3 从MySQL数据库导入到Hadoop HDFS
本章介绍如何将数据从MySQL数据库导入到Hadoop HDFS。“导入工具”从RDBMS将单个表导入HDFS。表中的每一行都被视为HDFS中的记录。所有记录均以文本数据的形式存储在文本文件中,或作为Avro和Sequence文件中的二进制数据存储。
语法
以下语法用于将数据导入HDFS。
-
$ sqoop import (generic-args) (import-args)
让我们举一个名为emp,emp_add和emp_contact的三个表的示例,这些表位于MySQL数据库服务器中名为test的数据库中。
这三张表格及其数据如下。
CREATE TABLE `emp` (
`id` bigint(20) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`deg` varchar(255) DEFAULT NULL,
`salary` decimal(10,2) DEFAULT NULL,
`dept` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test`.`emp` (`id`, `name`, `deg`, `salary`, `dept`) VALUES ('1201', 'gopal', 'manager', '50000.00', 'TP');
INSERT INTO `test`.`emp` (`id`, `name`, `deg`, `salary`, `dept`) VALUES ('1202', 'manisha', 'Proof reader', '50000.00', 'TP');
INSERT INTO `test`.`emp` (`id`, `name`, `deg`, `salary`, `dept`) VALUES ('1203', 'dashan', 'manager', '25000.00', 'CP');
INSERT INTO `test`.`emp` (`id`, `name`, `deg`, `salary`, `dept`) VALUES ('1204', 'zhangshan', 'manager', '54200.00', 'VU');
CREATE TABLE `emp_add` (
`id` bigint(20) NOT NULL,
`hno` varchar(256) DEFAULT NULL,
`street` varchar(255) DEFAULT NULL,
`city` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test`.`emp_add` (`id`, `hno`, `street`, `city`) VALUES ('1201', '288A', 'vgiri', 'jublee');
INSERT INTO `test`.`emp_add` (`id`, `hno`, `street`, `city`) VALUES ('1202', '288B', 'guizhou', 'guiyang');
CREATE TABLE `emp_contact` (
`id` int(11) NOT NULL,
`phno` varchar(256) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test`.`emp_contact` (`id`, `phno`, `email`) VALUES ('1201', '2356742', 'gopal@tp.com');
INSERT INTO `test`.`emp_contact` (`id`, `phno`, `email`) VALUES ('1202', '12345678', 'manisha@tp.com');
导入表格
Sqoop工具“导入”用于将表格数据从表格导入到Hadoop文件系统,作为文本文件或二进制文件。
(1)以下命令用于将emp表从MySQL数据库服务器导入到HDFS。
sqoop import \
--connect jdbc:mysql://node0:3306/test \
--username ambari \
--password 123 \
--table emp --m 1
(2)我们可以在使用Sqoop导入工具将表格数据导入HDFS时指定目标目录。
以下是将目标目录指定为Sqoop导入命令的选项的语法。
--target-dir <new or exist directory in HDFS>
sqoop import \
--connect jdbc:mysql://node0:3306/test \
--username ambari \
--password 123 \
--table emp_add --m 1
--target-dir /emp_add
(3)我们可以使用Sqoop导入工具中的'where'子句导入表的一个子集。它在相应的数据库服务器中执行相应的SQL查询,并将结果存储在HDFS中的目标目录中。
sqoop import \
--connect jdbc:mysql://node0:3306/test \
--username ambari \
--password 123 \
--table emp_add --m 1 \
--where "city ='guiyang'" \
--target-dir /emp_add
(4)将mysql数据增量导入到hdfs
增量导入是一种仅导入表中新添加的行的技术。需要添加'incremental','check-column'和'last-value'选项来执行增量导入。
以下语法用于Sqoop导入命令中的增量选项。
--incremental <mode> --check-column <column name> --last value <last check column value>
新增一行数据:1205, satish p, grp des, 20000, GR
sqoop import \
--connect jdbc:mysql://node0:3306/test \
--username ambari \
--password 123 \
--table emp --m 1 \
--incremental append \
--check-column id \
--last-value 1206
(5)导入所有表格
以下语法用于导入所有表。
$ sqoop import-all-tables (generic-args) (import-args)
让我们举一个从userdb数据库导入所有表的例子。数据库userdb包含的表的列表如下所示。
+--------------------+
| Tables |
+--------------------+
| emp |
| emp_add |
| emp_contact |
+--------------------+
以下命令用于从userdb数据库中导入所有表。
sqoop import-all-tables \
--connect jdbc:mysql://node0:3306/test \
--username ambari \
--password 123
注 - 如果使用的是全部导入表,则该数据库中的每个表都必须具有主键字段。
以下命令用于验证HDFS中的所有表数据到test数据库。
hadoop fs -ls
它将向您显示userdb数据库中的表名称列表作为目录。
输出
drwxr-xr-x - hadoop supergroup 0 2014-12-22 22:50 _sqoop drwxr-xr-x - hadoop supergroup 0 2014-12-23 01:46 emp drwxr-xr-x - hadoop supergroup 0 2014-12-23 01:50 emp_add drwxr-xr-x - hadoop supergroup 0 2014-12-23 01:52 emp_contact
(6) 将mysql数据导入hbase和phoenix关联中(在hbse中如果没有存在的表,将会创建emp表)
sqoop import \
--connect jdbc:mysql://node0:3306/test \
--username ambari \
--password 123 \
--table emp \
--hbase-table emp \
--column-family info \
--hbase-create-table \
--hbase-row-key id
--hbase-table:在hbase中创建的表
--column-family:列族
--hbase-create-table:如果hbase没有该表则会创建
--hbase-row-key id:主键
4 HDFS导出回RDBMS数据库
本章介绍如何将数据从HDFS导出回RDBMS数据库。目标表必须存在于目标数据库中。输入给Sqoop的文件包含记录,这些记录在表中称为行。这些被读取并解析成一组记录并用用户指定的分隔符分隔。
缺省操作是使用INSERT语句将输入文件中的所有记录插入到数据库表中。在更新模式下,Sqoop生成将现有记录替换到数据库中的UPDATE语句。
语法
以下是导出命令的语法。
$ sqoop export (generic-args) (export-args)
例
让我们以HDFS中的文件中的员工数据为例。雇员数据在HDFS的'emp /'目录中的emp_data文件中可用。该emp_data如下。
1201, gopal, manager, 50000.00, TP
1202, manisha, Proof reader,50000.00, TP
1203, dashan, manager, 25000.00, CP
1204, zhangshan,manager, 54200.00, VU
以下查询用于在mysql命令行中创建表'employee'。
CREATE TABLE `employee` (
`id` bigint(20) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`deg` varchar(255) DEFAULT NULL,
`salary` decimal(10,2) DEFAULT NULL,
`dept` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
sqoop export \
--connect jdbc:mysql://node0:3306/test \
--username ambari \
--password 123 \
--table employee \
--export-dir emp/*
5 Sqoop作业Job
本章介绍如何创建和维护Sqoop作业。Sqoop作业创建并保存导入和导出命令。它指定参数来识别和调用保存的作业。这种重新调用或重新执行用于增量导入,它可以将更新的行从RDBMS表导入HDFS。
语法
以下是创建Sqoop作业的语法。
$ sqoop job (generic-args) (job-args)[-- [subtool-name] (subtool-args)]
创建作业(--create)
我们在这里创建一个名为myjob的作业,它可以将表数据从RDBMS表导入HDFS。以下命令用于创建将数据从db数据库中的employee表导入到HDFS文件的作业。
sqoop job --create addjob \
-- import \
--connect jdbc:mysql://node0:3306/test \
--username ambari \
--password 123 \
--table employee --m 1
查看创建作业:
sqoop job --list
检查作业:
sqoop job --show myjob
执行作业:
sqoop job --exec myjob
创建增量作业:
sqoop job --create addjob \
-- import \
--connect jdbc:mysql://node0:3306/test \
--username ambari \
--password 123 \
--query "SELECT id, name, deg, salary, dept FROM emp where \$CONDITIONS" \
--split-by id \
--target-dir /user/hdfs/emp \
--split-by id \
--incremental append \
--check-column id \
--last-value 0
6 Eval
本章介绍如何使用Sqoop'eval'工具。它允许用户针对各自的数据库服务器执行用户定义的查询,并在控制台中预览结果。所以,用户可以期望导入结果表数据。使用eval,我们可以评估任何类型的可以是DDL或DML语句的SQL查询。
语法
以下语法用于Sqoop eval命令。
$ sqoop eval (generic-args) (eval-args)
$ sqoop-eval (generic-args) (eval-args)
选择查询评估
使用eval工具,我们可以评估任何类型的SQL查询。让我们举一个在db数据库的employee表中选择有限行的例子。以下命令用于评估使用SQL查询的给定示例。
$ sqoop eval \
--connect jdbc:mysql://localhost/db \
--username root \
--query “SELECT * FROM employee LIMIT 3”
如果该命令执行成功,则它将在终端上产生以下输出。
+------+--------------+-------------+-------------------+--------+
| Id | Name | Designation | Salary | Dept |
+------+--------------+-------------+-------------------+--------+
| 1201 | gopal | manager | 50000 | TP |
| 1202 | manisha | preader | 50000 | TP |
| 1203 | khalil | php dev | 30000 | AC |
+------+--------------+-------------+-------------------+--------+
插入查询评估
Sqoop评估工具可适用于建模和定义SQL语句。这意味着,我们也可以使用eval来插入语句。以下命令用于在db数据库的employee表中插入新行。
$ sqoop eval \
--connect jdbc:mysql://localhost/db \
--username root \
-e “INSERT INTO employee VALUES(1207,‘Raju’,‘UI dev’,15000,‘TP’)”
如果该命令成功执行,则会在控制台上显示更新行的状态。
否则,您可以在MySQL控制台上验证雇员表。以下命令用于使用select'query来验证db数据库的employee表的行。
mysql>
mysql> use db;
mysql> SELECT * FROM employee;
+------+--------------+-------------+-------------------+--------+
| Id | Name | Designation | Salary | Dept |
+------+--------------+-------------+-------------------+--------+
| 1201 | gopal | manager | 50000 | TP |
| 1202 | manisha | preader | 50000 | TP |
| 1203 | khalil | php dev | 30000 | AC |
| 1204 | prasanth | php dev | 30000 | AC |
| 1205 | kranthi | admin | 20000 | TP |
| 1206 | satish p | grp des | 20000 | GR |
| 1207 | Raju | UI dev | 15000 | TP |
+------+--------------+-------------+-------------------+--------+
7 列出数据库和表
本章介绍如何使用Sqoop列出数据库。Sqoop list-databases工具解析并执行针对数据库服务器的'SHOW DATABASES'查询。此后,它列出了服务器上的当前数据库。
语法
以下语法用于Sqoop list-databases命令。
$ sqoop list-databases (generic-args) (list-databases-args)
示例查询
以下命令用于列出MySQL数据库服务器中的所有数据库。
sqoop list-databases --connect jdbc:mysql://node0:3306 --username ambari --password 123
本章介绍如何使用Sqoop列出MySQL数据库服务器中特定数据库的表。Sqoop列表表工具解析并执行针对特定数据库的“SHOW TABLES”查询。此后,它列出了数据库中的当前表格。
语法
以下语法用于Sqoop list-tables命令。
$ sqoop list-tables (generic-args) (list-tables-args)
示例查询
以下命令用于列出MySQL数据库服务器的userdb数据库中的所有表。
sqoop list-tables --connect jdbc:mysql://node0:3306/test --username ambari --password 123
参考文章:
https://blog.youkuaiyun.com/ancony_/article/details/80012908