sqoop數據導入工具import:
sqoop數據導入hdfs和hive沒什麼區別,導入hdfs就是把數據按行一行一行地寫入hdfs文件系統,
導入hive表,相似於在hdfs上有一個網格,按網格的指定一個個去存放,網格的位置是獨立存在的
下面是從網上找的sqoop的一些命令選項,(沒辦法,記性很差,只能每次寫sqoop命令就拿出來遛遛)java
選項 含義說明
--connect <jdbc-uri> 指定JDBC鏈接字符串
--connection-manager <class-name> 指定要使用的鏈接管理器類
--driver <class-name> 指定要使用的JDBC驅動類
--hadoop-mapred-home <dir> 指定$HADOOP_MAPRED_HOME路徑
--help 打印用法幫助信息
--password-file 設置用於存放認證的密碼信息文件的路徑
-P 從控制檯讀取輸入的密碼
--password <password> 設置認證密碼
--username <username> 設置認證用戶名
--verbose 打印詳細的運行信息
--connection-param-file <filename> 可選,指定存儲數據庫鏈接參數的屬性文件mysql
下面是我腳本里面的sqoop命令,相似的一些庫均可以導的,把驅動和鏈接設置很久ok的
sqoop import --driver com.microsoft.sqlserver.jdbc.SQLServerDriver \
--connect "jdbc:sqlserver://$HOST:$PORT;database=$SERVERDB" --username $USER --password "$PASSWD" \
--table $TABLE --fields-terminated-by '\001' --warehouse-dir /user/hive/warehouse/feidaiwebsite.db \
--null-string '\\N' --null-non-string '\0' -m $NUM_MAPPERSweb
我喜歡把鏈接配置信息存放到庫裏面,因此上面的命令我基本不改sql
這是我切換sqlserver的記錄
ln -s /root/tanj/sqlserver/sqljdbc4.jar /opt/cloudera/parcels/CDH-5.10.0-1.cdh5.10.0.p0.41/lib/sqoop/lib/
export MSSQL_CONNECTOR_HOME=/root/tanj/sqlserver/sqoop-sqlserver-1.0
chmod +x /root/tanj/sqlserver/sqoop-sqlserver-1.0/install.sh
sh /root/tanj/sqlserver/sqoop-sqlserver-1.0/install.sh
ln -s /root/tanj/sqlserver/sqoop-sqlserver-1.0/lib/sqoop-sqlserver-1.0.jar /opt/cloudera/parcels/CDH-5.10.0-1.cdh5.10.0.p0.41/lib/sqoop/lib/
ln -s /root/tanj/sqlserver/sqoop-sqlserver-1.0/conf/managers.d/mssqoop-sqlserver /etc/sqoop/conf/managers.dshell
--append 將數據追加到HDFS上一個已存在的數據集上
--as-avrodatafile 將數據導入到Avro數據文件
--as-sequencefile 將數據導入到SequenceFile
--as-textfile 將數據導入到普通文本文件(默認)
--boundary-query <statement> 邊界查詢,用於建立分片(InputSplit)
--columns <col,col,col…> 從表中導出指定的一組列的數據
--delete-target-dir 若是指定目錄存在,則先刪除掉
--direct 使用直接導入模式(優化導入速度)
--direct-split-size <n> 分割輸入stream的字節大小(在直接導入模式下)
--fetch-size <n> 從數據庫中批量讀取記錄數
--inline-lob-limit <n> 設置內聯的LOB對象的大小
-m,--num-mappers <n> 使用n個map任務並行導入數據
-e,--query <statement> 導入的查詢語句
--split-by <column-name> 指定按照哪一個列去分割數據
--table <table-name> 導入的源表表名
--target-dir <dir> 導入HDFS的目標路徑
--warehouse-dir <dir> HDFS存放表的根路徑
--where <where clause> 指定導出時所使用的查詢條件
-z,--compress 啓用壓縮
--compression-codec <c> 指定Hadoop的codec方式(默認gzip)
--null-string <null-string> 果指定列爲字符串類型,使用指定字符串替換值爲null的該類列的值
--null-non-string <null-string> 若是指定列爲非字符串類型,使用指定字符串替換值爲null的該類列的值數據庫
(備註一下啊,這是網上1.4版本的,)app
sqoop import --connect jdbc:mysql://$HOST:$PORT/$MYSQL_DB --username $USER --password ''${PASSWD}'' --table $MYSQL_TABLE \
--hive-import --hive-overwrite --hive-database $HIVE_DB --fields-terminated-by '\001' --target-dir $TEMPDIR --delete-target-dir --outdir /root/tanj/sh/java \
--hive-drop-import-delims --null-string '\\N' --null-non-string '\0' -m $NUMMAPPERS工具
說說一些坑吧
我在密碼那裏加了倆單引號,是由於有的密碼裏面含有特殊符號,致使sqoop讀取命令的時候會出錯,因此我喜歡乾脆的,直接在shell 的參數上所有加上''''
--hive-overwrite 我是作全量導數,(後面也有增量的腳本), 因此每次全量覆蓋,否則還得去刪除,不然就會add了
--fields-terminated-by 分割符啦,用了幾個,都很差,它涉及到字段之間的區分,因此它必須不能在內容裏面出現該符號
--target-dir 是sqoop生成的目標目錄,只是個臨時目錄,最終會轉移數據到表目錄去,--delete-target-dir 因此建議用 不然任務失敗後後面的任務會報錯
--outdir 是java文件生成存放的目錄,會自動生成,否則會存放在當前目錄,生成一推的java文件
--null-string --null-non-string 處理空值
-m map任務並行數,貌似主鍵是int類型才行,不然會生成重複數據oop
hive導入參數
--hive-home <dir> 重寫$HIVE_HOME
--hive-import 插入數據到hive當中,使用hive的默認分隔符
--hive-overwrite 重寫插入
--create-hive-table 建表,若是表已經存在,該操做會報錯!
--hive-table <table-name> 設置到hive當中的表名
--hive-drop-import-delims 導入到hive時刪除 \n, \r, and \01
--hive-delims-replacement 導入到hive時用自定義的字符替換掉 \n, \r, and \01
--hive-partition-key hive分區的key
--hive-partition-value <v> hive分區的值
--map-column-hive <map> 類型匹配,sql類型對應到hive類型(--map-column-java)sqlserver
sqoop增量導數
–check-column (col) 用來做爲判斷的列名,如id
–incremental (mode) append:追加,好比對大於last-value指定的值以後的記錄進行追加導入。lastmodified:最後的修改時間,追加last-value指定的日期以後的記錄
–last-value (value) 指定自從上次導入後列的最大值(大於該指定的值),也能夠本身設定某一值
sqoop增量導數的例子
sqoop import --connect jdbc:mysql://${APPENDHOST}:$APPENDPORT/$APPENDMYSQL_DB --username $APPENDUSER --password $APPENDPASSWD \
--table $HIVE_TABLE --incremental append --check-column $APPENDCOLUMN --outdir /root/tanj/sh/java \
--hive-import --hive-database $HIVE_DB --hive-table $HIVE_TABLE \
--target-dir $APPENDTEMPDIR --fields-terminated-by "\001" \
--hive-drop-import-delims --null-string '\\N' --null-non-string "\0" -m $APPENDNUMMAPPERS --last-value "${APPENDLASTVALUE};";
import-all-tables
sqoop import-all-tables --connect jdbc:mysql://10.64.4.95:3306/financesys_move --username root --password d6f0fe881f69edec \
--hive-import --hive-overwrite --hive-database financesys_move --fields-terminated-by '\001' \
--hive-drop-import-delims --null-string '\\N' --null-non-string '\0' -m 1
不能和--delete-target-dir 同時使用