Sqoop 1.99.6 安裝和使用

rilley發表於2016-06-24
 
 
安裝
 
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 檢視所有資料庫:

 

sqoop list-databases --connect  jdbc:mysql://192.168.1.1:3306/ --username root --password 123456

 

2 檢視具體資料庫內的表

 

sqoop list-tables --connect jdbc:mysql://localhost:3306/kellte --username root --password 123456

 

3  將關係型資料表結構users複製到Hive預設庫的表users中:

 

sqoop create-hive-table --connect jdbc:mysql://localhost:3306/test --table users --username root  --password 123456 

    --hive-table users --fields-terminated-by "\0001"  --lines-terminated-by "\n";

 

引數說明:  這兩個引數可以不加

--fields-terminated-by "\0001"  是設定每列之間的分隔符,"\0001"是ASCII碼中的1,它也是hive的預設行內分隔符,

而sqoop的預設行內分隔符為","  

--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>     複製結束符
 
 
 
 
 
 
 
 
 
 
 
 

相關文章