概述

sqoopApache顶级项目,主要用来在Hadoop和关系数据库中传递数据。通过sqoop,我们可以方便的将数据从关系数据库导入到HDFS,或者将数据从HDFS导出到关系数据库。

sqoop架构:

sqoop架构非常简单,其整合了HiveHbaseOozie,通过map-reduce任务来传输数据,从而提供并发特性和容错。

sqoop主要通过JDBC和关系数据库进行交互。理论上支持JDBCdatabase都可以使用sqoophdfs进行数据交互。

但是,只有一小部分经过sqoop官方测试,如下:

Database          version       --direct support     connect string

HSQLDB           1.8.0+            No            jdbc:hsqldb:*//

MySQL            5.0+             Yes            jdbc:mysql://

Oracle            10.2.0+           No            jdbc:oracle:*//

PostgreSQL        8.3+             Yes           (import only)jdbc:postgresql://

较老的版本有可能也被支持,但未经过测试。

出于性能考虑,sqoop提供不同于JDBC的快速存取数据的机制,可以通过--direct使用。

以下基于sqoop-1.99

工具

sqoop包含一系列的工具,运行sqoop help可以查看相关帮助,

$ ./sqoop help

usage: sqoop COMMAND [ARGS]

Available commands:

codegen            Generate codeto interact with database records

create-hive-table  Import a tabledefinition into Hive

eval               Evaluate a SQLstatement and display the results

export             Export an HDFSdirectory to a database table

help               List availablecommands

import             Import a tablefrom a database to HDFS

import-all-tables  Import tablesfrom a database to HDFS

job                Work with savedjobs

list-databases     List availabledatabases on a server

list-tables        List availabletables in a database

merge              Merge resultsof incremental imports

metastore          Run astandalone Sqoop metastore

version            Display version information

See 'sqoop help COMMAND' for information ona specific command.

使用工具list-tables查看表,如下:

$ ./sqoop list-tables --connectjdbc:mysql://127.0.0.1/test --username root --password 123456

a

t1

可以使用codegen生成代码,但不执行map-reduce,如下:

$ ./sqoop codegen --connectjdbc:mysql://127.0.0.1/test --username root --password 123456 --table a --

class-name zxm_sqoop

......

13/03/21 21:02:01 INFOorm.CompilationManager: Writing jar file:/tmp/sqoop-work/compile/29864e3980ab5630b699e8e1e2145369/zxm_sqoop.jar

此处相关代码和java包可在 /tmp/sqoop-work/compile/29864e3980ab5630b699e8e1e2145369/找到

Import

sqoop 数据导入具有以下特点:

1.支持文本文件(--as-textfile)avro(--as-avrodatafile)SequenceFiles(--as-sequencefile) RCFILE暂未支持,默认为文本

2.支持数据追加,通过--apend指定

3.支持table列选取(--column),支持数据选取(--where),和--table一起使用

4.支持数据选取,例如读入多表join后的数据'SELECTa.*, b.* FROM a JOIN b on (a.id == b.id) ‘,不可以和--table同时使用

5.支持map数定制(-m)

6.支持压缩(--compress)

7.支持将关系数据库中的数据导入到Hive(--hive-import)HBase(--hbase-table)

数据导入Hive分三步:1)导入数据到HDFS  2Hive建表  3)使用“LOAD DATA INPAHT”将数据LOAD到表中

数据导入HBase分二部:1)导入数据到HDFS 2)调用HBase put操作逐行将数据写入表

示例:

mysql文件内容:

mysql> select * from a;                          

+------+--------+

| key1 | value1 |

+------+--------+

|   1 | a1     |

|   2 | a2     |

|   3 | a3     |

|   4 | a4     |

|   5 | a5     |

|   6 | a6     |

|   7 | a7     |

|   8 | a8     |

|   9 | a9     |

+------+--------+

编写文件a.conf,内容:

[html] view plaincopy

import

--append

-m  

3  

--connect  

jdbc:mysql://127.0.0.1/test  

--username  

root  

--password  

123456  

--table  

a  

--target-dir  

/tmp/a

--columns

key1

--where

'key1>3'

运行:

$ ./sqoop --options-file a.conf

查看输出:

$ hadoop fs -ls /tmp/a/  

Found 3 items

-rw-r--r--  1 work supergroup          42013-03-21 23:08 /tmp/a/part-m-00000

-rw-r--r--  1 work supergroup          42013-03-21 23:08 /tmp/a/part-m-00001

-rw-r--r--  1 work supergroup          42013-03-21 23:08 /tmp/a/part-m-00002  

==3个文件对应3mapper

$ hadoop fs -cat /tmp/a/*

4

5

6

7

8

9

Export

sqoop export 能将HDFS上的文件导出到关系数据库。其工作原理是根据用户指定的分隔符(字段分隔符:--fields-terminated-by)读入并解析数据,然后转换成insert/update语句导入数据到关系数据库。

其具有以下特点:

1. 支持将数据导出到表(--table)或者调用存储过程(--call)

2. 支持insertupdate模式

3. 支持并发控制(-m

实例:

$ hadoop fs -cat /tmp/b/*

1,a

2,b

3,c

$ ./sqoop export --connectjdbc:mysql://127.0.0.1/test --table b -username root -password 123456 --ex

port-dir /tmp/b

mysql> select * from b;        

+------+--------+

| key1 | value1 |

+------+--------+

|   1 | a      |

|   2 | b      |

|   3 | c      |

+------+--------+

出了上述提到的工具外,sqoop还提供了一些有意思的工具,例如sqoop job,有兴趣的同学可以研究下

其它:

1. 通过使用map-reducesqoop提供了良好的并发性和容错,可以作为异构数据库同步工具。

2. Sqoop虽然支持HiveHBase,但并不完整,某些场景下数据传输后的加工不可避免

3. 大数据传输,也许可以使用—direct