Hadoop数据传输工具sqoop

分类:      8875人阅读 (2)  

目录

概述

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

sqoop架构:

spacer.gif

spacer.gif

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

sqoop的进一步发展可以参考:

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

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

Database            version            --direct support            connect string matches

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.4.3

安装

sqoop安装使用可以参考,测试work

工具

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

$ ./sqoop help
usage: sqoop COMMAND [ARGS]
Available commands:
  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import             Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information
See 'sqoop help COMMAND' for information on a specific command.
使用工具list-tables查看表,如下:
$ ./sqoop list-tables --connect jdbc:mysql://127.0.0.1/test --username root --password 123456 
a
t1
可以使用codegen生成代码,但不执行map-reduce,如下:
$ ./sqoop codegen --connect jdbc:mysql://127.0.0.1/test --username root --password 123456 --table a --
class-name zxm_sqoop 
......
13/03/21 21:02:01 INFO orm.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后的数据'SELECT a.*, 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  2)Hive建表  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] 

  1. import  

  2.   

  3. --append  

  4.   

  5. -m  

  6. 3  

  7.   

  8. --connect   

  9. jdbc:mysql://127.0.0.1/test   

  10.   

  11. --username   

  12. root   

  13.   

  14. --password   

  15. 123456   

  16.   

  17. --table   

  18. a  

  19.   

  20. --target-dir  

  21. /tmp/a  

  22.   

  23. --columns  

  24. key1  

  25.   

  26. --where  

  27. 'key1>3'  

运行:

$ ./sqoop --options-file a.conf 
查看输出:
$ hadoop fs -ls /tmp/a/  
Found 3 items
-rw-r--r--   1 work supergroup          4 2013-03-21 23:08 /tmp/a/part-m-00000
-rw-r--r--   1 work supergroup          4 2013-03-21 23:08 /tmp/a/part-m-00001
-rw-r--r--   1 work supergroup          4 2013-03-21 23:08 /tmp/a/part-m-00002  
==》3个文件对应3个mapper
$ hadoop fs -cat /tmp/a/*
4
5
6
7
8
9

Export

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

其具有以下特点:

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

2. 支持insert、update模式

3. 支持并发控制(-m)
实例:
$ hadoop fs -cat /tmp/b/*
1,a
2,b
3,c
$ ./sqoop export --connect jdbc: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-reduce,sqoop提供了良好的并发性和容错,可以作为异构数据库同步工具。

2. Sqoop虽然支持Hive、HBase,但并不完整,某些场景下数据传输后的加工不可避免
3. 大数据传输,也许可以使用--direct