安裝
1.安裝準備工做:
下載的sqoop安裝包
http://mirrors.hust.edu.cn/apache/sqoop/1.99.6/sqoop-1.99.6.tar.gz
2.解壓文件到工做目錄:
hadoop@hadoopMaster:$ sudo tar -xvf /opt/hn/hadoop_family/sqoop-1.99.6-bin-hadoop200.tar.gz
hadoop@hadoopMaster:mv /opt/hn/hadoop_family/sqoop-1.99.6-bin-hadoop200 /usr/local/sqoop
3.修改環境變量:
hadoop@hadoopMaster:~$ vim /etc/profile
添加以下內容:
#sqoop
export SQOOP_HOME=/usr/local/sqoop
export PATH=$SQOOP_HOME/bin:$PATH
export CATALINA_HOME=$SQOOP_HOME/server
export LOGDIR=$SQOOP_HOME/logs
保存退出即時生效:
source /etc/profile
4.修改sqoop配置:
hadoop@hadoopMaster:~$ vim /usr/local/sqoop/server/conf/sqoop.properties
#修改指向個人hadoop安裝目錄
org.apache.sqoop.submission.engine.mapreduce.configuration.directory=/usr/local/hadoop/
#把hadoop目錄下的jar包都引進來
hadoop@hadoopMaster:~$ vim /usr/local/sqoop/server/conf/catalina.properties
common.loader=/usr/local/hadoop/share/hadoop/common/*.jar,/usr/local/hadoop/share/hadoop/common/lib/*.jar,/usr/local/hadoop/share/hadoop/hdfs/*.jar,/usr/local/hadoop/share/hadoop/hdfs/lib/*.jar,/usr/local/hadoop/share/hadoop/mapreduce/*.jar,/usr/local/hadoop/share/hadoop/mapreduce/lib/*.jar,/usr/local/hadoop/share/hadoop/tools/*.jar,/usr/local/hadoop/share/hadoop/tools/lib/*.jar,/usr/local/hadoop/share/hadoop/yarn/*.jar,/usr/local/hadoop/share/hadoop/yarn/lib/*.jar,/usr/local/hadoop/share/hadoop/httpfs/tomcat/lib/*.jar
5.下載mysql驅動包
mysql-connector-java-5.1.16-bin.jar
6.啓動/中止sqoop200
hadoop@hadoopMaster:/usr/local/sqoop/bin$ ./sqoop.sh server start/stop
查看啓動日誌:
hadoop@hadoopMaster:/usr/local/sqoop/server/logs$ vim catalina.out
7.進入客戶端交互目錄
hadoop@hadoopMaster:/usr/local/sqoop/bin$ ./sqoop.sh client
使用
1 查看全部數據庫:java
sqoop list-databases --connect jdbc:mysql://192.168.1.1:3306/ --username root --password 123456mysql
2 查看具體數據庫內的表sql
sqoop list-tables --connect jdbc:mysql://localhost:3306/kellte --username root --password 123456數據庫
3 將關係型數據表結構users複製到Hive默認庫的表users中:apache
sqoop create-hive-table --connect jdbc:mysql://localhost:3306/test --table users --username root --password 123456 vim
--hive-table users --fields-terminated-by "\0001" --lines-terminated-by "\n";tomcat
參數說明: 這兩個參數能夠不加session
--fields-terminated-by "\0001" 是設置每列之間的分隔符,"\0001"是ASCII碼中的1,它也是hive的默認行內分隔符, oracle
而sqoop的默認行內分隔符爲"," app
--lines-terminated-by "\n" 設置的是每行之間的分隔符,此處爲換行符,也是默認的分隔符;
4 將mysql表student數據拷貝到hive默認庫的student表中:這裏使用一個mapreduce來執行
sqoop import --connect jdbc:mysql://192.168.1.1:3306/kettle --username root --passwd 123456 --table student --hive-import --hive-table student -m 1;
5 根據列導入數據: 將kettle庫下student表的name屬性 寫入到 hive表的student1中
sqoop import --connect jdbc:mysql://192.168.1.1:3306/kettle --username root --password 123456
--table student --column 'name' --hive-import --hive-table student1 -m1;
5.1 column和where合用在mysql導出到hive中:
sqoop import --connect jdbc:mysql://192.168.1.1:3306/kettle --username root --password 123456
--table student --columns "id,age,name" --where "id > 3 and (age = 88 or age = 80)" -m 1
--target-dir /user/hive/warehouse/userinfos2 --fields-terminated-by ",";
注意:--target-dir /user/hive/warehouse/userinfos2 能夠用 --hive-import --hive-table userinfos2 進行替換
5.2 將數據表導入到HDFS中
sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD
--target-dir $hdfsPath --m 1 --table $oralceTableName --columns $columns
--fields-terminated-by '\001' --where "data_desc='2011-02-26'"
6 增量添加數據:
Sqoop提供了原生增量導入的特性,包含如下三個關鍵參數:
--check-column (col) 指定一個「標誌列」用於判斷增量導入的數據範圍,該列不能是字符型,最好是數字或者日期型(這個很好理解吧)。
--incremental (mode) 指定增量模式,包含「追加模式」 append 和「最後修改模式」 lastmodified (該模式更知足常見需求)。
--last-value (value) 指定「標誌列」上次導入的上界。若是「標誌列」是最後修改時間,則--last-value爲上次執行導入腳本的時間。
sqoop支持兩種增量MySql導入到hive的模式
一種是 append,即經過指定一個遞增的列,好比:
--incremental append --check-column num_iid --last-value 0
另種是能夠根據時間戳,好比:
--incremental lastmodified --check-column created --last-value '2012-02-01 11:0:00'
就是隻導入created 比'2012-02-01 11:0:00'更大的數據。
sqoop job --create incretest -- import --connect jdbc:oracle:thin:@192.168.0.138:1521:orcl --username HIVE --password hivefbi --table FBI_SQOOPTEST --hive-import --hive-table INCRETEST --incremental lastmodified --check-column LASTMODIFIED --last-value '2014/8/27 13:00:00'
注意
在 導入數據的過程當中,若是碰到列值爲null的狀況,hive中爲null的是以\N代替的,因此你在導入到MySql時,須要加上兩個參數:-- input-null-string '\\N' --input-null-non-string '\\N',多加一個'\',是爲轉義。若是你經過這個還不能解決字段爲null的狀況,仍是報什麼NumberFormalt異常的話,那就是比較另類 的了,沒有關係,咱們仍是要辦法解決,這就是終極武器。呵呵
--direct 只支持mysql 5.0 + 和postgresql 8.3+(只是import)
jdbc的jar包須要放在$SQOOP_HOME/lib目錄下
mysql zeroDateTimeBehavior
mysql容許DATE列使用'0000-00-00\' 若是不處理sqoop默認給轉換爲null
固然你也能夠本身指定爲 round,自動轉換爲('0001-01-01\')
$ sqoop import --table foo --connect jdbc:mysql://db.example.com/someDb?zeroDateTimeBehavior=round
mysql UNSIGNED 列
若是是UNSIGNED的,它是介於0 and 2^32 (4294967295)的,可是數據庫會告訴sqoop,這是整形
整形的大小是介於-2147483648 and \+2147483647的,超過214748364的,它處理不了。
--direct模式不支持BLOB和CLOB,不支持視圖
爲了性能,通常的是32MB提交一次,能夠經過 -D sqoop.mysql.export.checkpoint.bytes=size來指定
它的單位是bytes,設置爲0,就禁用檢查點了。
在對生產環境導入數據時,用戶也在用,咱們經過stage表來解決穩定性的問題,確定會對生產環境產生影響
咱們能夠經過設置 -D sqoop.mysql.export.sleep.ms=time 參數(單位毫秒)來讓它中止一段時間
每傳輸sqoop.mysql.export.checkpoint.bytes個字節就休息一段時間
oracle部分
sqoop支持 ojdbc6.jar
oracle當中的DATE和TIME,都會當作是TIMESTAMP值,sqoop會當作java.sql.Timestamp來存儲
當把數據導回到數據庫的時候,sqoop會把它轉換爲 yyyy-mm-dd HH:MM:SS.ffffffff格式
可是你只但願yyyy-mm-dd格式
時區,默認是GMT
$ sqoop import -D oracle.sessionTimeZone=America/Los_Angeles --connect jdbc:oracle:thin:@//db.example.com/foo --table bar
hive和sql的數據類型匹配
DATE,TIME,TIMESTAMP 會被當作是字符串處置, NUMERIC和DECIMAL會被認爲是double
sqoop會提醒你精度丟失了
Microsoft SQL特殊的參數
--schema <name> Scheme name that sqoop should use. Default is "dbo".
--table-hints <hints> Table hints that Sqoop should use for data movement.
$ sqoop import ... --table custom_table -- --schema custom_schema
$ sqoop import ... --table custom_table -- --table-hints NOLOCK
PostgreSQL
$ sqoop export (generic-args) --connection-manager org.apache.sqoop.manager.PGBulkloadManager (export-args)
支持參數和例子
Property Description
mapred.reduce.tasks map數量
pgbulkload.bin pg_bulkoad binary安裝路徑,每一臺機器都有
pgbulkload.check.constraints 檢查約束,默認是true
pgbulkload.parse.errors 在轉義,加密,過濾,檢查約束,數據類型轉換中產生的錯誤的最大數,默認是無窮大
pgbulkload.duplicate.errors 數據重複的忍耐值. 重複值在數據庫中存儲是badfile,默認是無窮大
pgbulkload.filter 轉換每一行爲輸入的數據
Here is a example of complete command line.
$ sqoop export \
-Dmapred.reduce.tasks=2
-Dpgbulkload.bin="/usr/local/bin/pg_bulkload" \
-Dpgbulkload.input.field.delim=$'\t' \
-Dpgbulkload.check.constraints="YES" \
-Dpgbulkload.parse.errors="INFINITE" \
-Dpgbulkload.duplicate.errors="INFINITE" \
--connect jdbc:postgresql://pgsql.example.net:5432/sqooptest \
--connection-manager org.apache.sqoop.manager.PGBulkloadManager \
--table test --username sqooptest --export-dir=/test -m 2
參數
import的主要參數:
--connect <jdbc-uri> jdbc鏈接地址
--connection-manager <class-name> 鏈接管理者
--driver <class-name> 驅動類
--hadoop-mapred-home <dir> $HADOOP_MAPRED_HOME
--password <password> 密碼
--username <username> 帳號
--verbose 打印信息
--help help信息
--connection-param-file <filename> 可選參數
--append 添加到hdfs中已經存在的dataset
--as-avrodatafile 導入數據做爲avrodata
--as-sequencefile 導入數據位SequenceFiles
--as-textfile 默認導入數據爲文本
--boundary-query <statement> 建立splits的邊界
--columns <col,col,col…> 選擇列
--direct 使用直接導入快速路徑
--direct-split-size <n> 在快速模式下每n字節使用一個split
--fetch-size <n> 一次讀入的數量
--inline-lob-limit <n> 最大數值 an inline LOB
-m,--num-mappers <n> 經過實行多少個map,默認是4個,某些數據庫8 or 16性能不錯
-e,--query <statement> 經過查詢語句導入
--split-by <column-name> 建立split的列,默認是主鍵
--table <table-name> 要導入的表名
--target-dir <dir> HDFS 目標路徑
--warehouse-dir <dir> HDFS parent for table destination
--where <where clause> where條件
-z,--compress Enable compression
--compression-codec <c> 壓縮方式,默認是gzip
--null-string <null-string> 字符列null值
--null-non-string <null-string> 非字符列null值
export主要參數
--direct 快速導入
--export-dir <dir> HDFS處處數據的目錄
-m,--num-mappers <n> 都少個map線程
--table <table-name> 導出哪一個表
--call <stored-proc-name> 存儲過程
--update-key <col-name> 經過哪一個字段來判斷更新
--update-mode <mode> 插入模式,默認是隻更新,能夠設置爲allowinsert.
--input-null-string <null-string> 字符類型null處理
--input-null-non-string <null-string> 非字符類型null處理
--staging-table <staging-table-name> 臨時表
--clear-staging-table 清空臨時表
--batch 批量模式
轉義字符相關參數
--enclosed-by <char> 設置字段結束符號 --escaped-by <char> 用哪一個字符來轉義 --fields-terminated-by <char> 字段之間的分隔符 --lines-terminated-by <char> 行分隔符 --mysql-delimiters 使用mysql的默認分隔符: , lines: \n escaped-by: \ optionally-enclosed-by: ' --optionally-enclosed-by <char> 複製結束符