sqoop import

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 同時使用

相關文章
相關標籤/搜索