从MySQL数据库中的数据导入到Hadoop的HDFS。 “导入工具”导入单个表从RDBMS到HDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据或者在阿夫罗(Avro )和序列文件的二进制数据。
下面的语法用于将数据导入HDFS。
$ sqoop import (generic-args) (import-args) |
$ sqoop-import (generic-args) (import-args) |
让我们以命名为emp, emp_add和emp_contact,这是一个在MySQL数据库服务器名为userdb 数据库的一个例子。
三个表及其数据如下。
id | name | deg | salary | dept |
---|---|---|---|---|
1201 | gopal | manager | 50,000 | TP |
1202 | manisha | Proof reader | 50,000 | TP |
1203 | khalil | php dev | 30,000 | AC |
1204 | prasanth | php dev | 30,000 | AC |
1204 | kranthi | admin | 20,000 | TP |
id | hno | street | city |
---|---|---|---|
1201 | 288A | vgiri | jublee |
1202 | 108I | aoc | sec-bad |
1203 | 144Z | pgutta | hyd |
1204 | 78B | old city | sec-bad |
1205 | 720X | hitec | sec-bad |
id | phno | |
---|---|---|
1201 | 2356742 | gopal@tp.com |
1202 | 1661663 | manisha@tp.com |
1203 | 8887776 | khalil@ac.com |
1204 | 9988774 | prasanth@ac.com |
1205 | 1231231 | kranthi@tp.com |
Sqoop工具'import'是用来从表中导入表数据到Hadoop的文件系统作为文本文件或二进制文件。
下面的命令用于从MySQL数据库服务器中的emp表导入HDFS。
$ sqoop import \ |
--connect jdbc:mysql://localhost/userdb \ |
--username root \ |
--table emp --m 1 |
如果成功执行,那么会得到下面的输出。
14/12/22 15:24:54 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5 |
14/12/22 15:24:56 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset. |
14/12/22 15:24:56 INFO tool.CodeGenTool: Beginning code generation |
14/12/22 15:24:58 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `emp` AS t LIMIT 1 |
14/12/22 15:24:58 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `emp` AS t LIMIT 1 |
14/12/22 15:24:58 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/local/hadoop |
14/12/22 15:25:11 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hadoop/compile/cebe706d23ebb1fd99c1f063ad51ebd7/emp.jar |
----------------------------------------------------- |
----------------------------------------------------- |
14/12/22 15:25:40 INFO mapreduce.Job: The url to track the job: http://localhost:8088/proxy/application_1419242001831_0001/ |
14/12/22 15:26:45 INFO mapreduce.Job: Job job_1419242001831_0001 running in uber mode : false |
14/12/22 15:26:45 INFO mapreduce.Job: map 0% reduce 0% |
14/12/22 15:28:08 INFO mapreduce.Job: map 100% reduce 0% |
14/12/22 15:28:16 INFO mapreduce.Job: Job job_1419242001831_0001 completed successfully |
----------------------------------------------------- |
----------------------------------------------------- |
14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Transferred 145 bytes in 177.5849 seconds (0.8165 bytes/sec) |
14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Retrieved 5 records. |
$ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-* |
1201, gopal, manager, 50000, TP |
1202, manisha, preader, 50000, TP |
1203, kalil, php dev, 30000, AC |
1204, prasanth, php dev, 30000, AC |
1205, kranthi, admin, 20000, TP |
在导入表数据到HDFS使用Sqoop导入工具,我们可以指定目标目录。
以下是指定目标目录选项的Sqoop导入命令的语法。
--target-dir <new or exist directory in HDFS> |
$ sqoop import \ |
--connect jdbc:mysql://localhost/userdb \ |
--username root \ |
--table emp_add \ |
--m 1 \ |
--target-dir /queryresult |
$ $HADOOP_HOME/bin/hadoop fs -cat /queryresult/part-m-* |
1201, 288A, vgiri, jublee |
1202, 108I, aoc, sec-bad |
1203, 144Z, pgutta, hyd |
1204, 78B, oldcity, sec-bad |
1205, 720C, hitech, sec-bad |
我们可以导入表的使用Sqoop导入工具,"where"子句的一个子集。它执行在各自的数据库服务器相应的SQL查询,并将结果存储在HDFS的目标目录。
where子句的语法如下。
--where <condition> |
$ sqoop import \ |
--connect jdbc:mysql://localhost/userdb \ |
--username root \ |
--table emp_add \ |
--m 1 \ |
--where “city =’sec-bad’” \ |
--target-dir /wherequery |
$ $HADOOP_HOME/bin/hadoop fs -cat /wherequery/part-m-* |
1202, 108I, aoc, sec-bad |
1204, 78B, oldcity, sec-bad |
1205, 720C, hitech, sec-bad |
增量导入是仅导入新添加的表中的行的技术。它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入。
下面的语法用于Sqoop导入命令增量选项。
--incremental <mode> |
--check-column <column name> |
--last value <last check column value> |
1206, satish p, grp des, 20000, GR |
$ sqoop import \ |
--connect jdbc:mysql://localhost/userdb \ |
--username root \ |
--table emp \ |
--m 1 \ |
--incremental append \ |
--check-column id \ |
-last value 1205 |
$ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-* |
1201, gopal, manager, 50000, TP |
1202, manisha, preader, 50000, TP |
1203, kalil, php dev, 30000, AC |
1204, prasanth, php dev, 30000, AC |
1205, kranthi, admin, 20000, TP |
1206, satish p, grp des, 20000, GR |
$ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-*1 |
1206, satish p, grp des, 20000, GR |