概述
sqoop是Apache頂級項目,主要用來在Hadoop和關係數據庫中傳遞數據。通過sqoop,我們可以方便的將數據從關係數據庫導入到HDFS,或者將數據從HDFS導出到關係數據庫。sqoop架構:
sqoop的進一步發展可以參考:A New Generation of Data Transfer Tools for Hadoop: Sqoop 2
但是,只有一小部分經過sqoop官方測試,如下:
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安裝使用可以參考http://www.54chen.com/java-ee/sqoop-mysql-to-hive.html,測試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 |
+------+--------+
- 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'
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 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)
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
reference:
Apache sqoopSqoop User Guide
Apache Sqoop: A Data Transfer Tool for Hadoop
A New Generation of Data Transfer Tools for Hadoop: Sqoop 2
Sqoop使用
大數據異構環境數據同步工具DataX 與Sqoop 之比較