1、說明:java
將關係型數據庫中的數據導入到 HDFS(包括 Hive, HBase) 中,若是導入的是 Hive,那麼當 Hive 中沒有對應表時,則自動建立。mysql
2、操做sql
一、建立一張跟mysql中的im表同樣的hive表im:數據庫
sqoop create-hive-table \ --connect jdbc:mysql://192.168.200.100:3306/yang \ --username root \ --password 010209 \ --table im \ --hive-table im
過程當中報錯總結:apache
ERROR Could not register mbeans java.security.AccessControlException: access denied vim
("javax.management.MBeanTrustPermission" "registerapp
解決方法:oop
一、將hive-site.xml複製到${SQOOP_HOME}/conf下spa
二、vim $JAVA_HOME/jre/lib/security/java.policy:code
在grant{}內部添加以下內容:
permission javax.management.MBeanTrustPermission "register";
Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR
解決方法:
將hive 裏面的lib下的hive-exec-**.jar 放到sqoop 的lib 下
二、將mysql中的數據導入到HDFS
sqoop import \ --connect jdbc:mysql://192.168.200.100:3306/yang \ --username root \ --password 010209\ --table im \ -m 1
三、將mysql中的數據導入到HDFS(按照指定分隔符和路徑進行導入)
sqoop import \ --connect jdbc:mysql://192.168.200.100:3306/yang \ --username root \ --password 010209 \ --table im \ --target-dir /test/ \ --fields-terminated-by ',' \ -m 1
四、將mysql中的數據導入到HDFS(帶where條件)
sqoop import \ --connect jdbc:mysql://192.168.200.100:3306/yang \ --username root \ --password 010209 \
--where "name='dccc'" \ --table im \ --target-dir /test/ \ -m 1
帶where條件,查詢指定列(至關於select name from im where name="dccc")
sqoop import \
--connect jdbc:mysql://192.168.200.100:3306/yang \
--username root \ --password 010209 \
--columns "name" \ --where "name='dccc'" \ --table im \ --target-dir /test/ \ -m 1
五、將mysql中的數據導入到HDFS(自定義查詢SQL)
sqoop import \ --connect jdbc:mysql://192.168.200.100:3306/yang \ --username root \ --password 010209 \ --target-dir /test/ \ --query 'select id,name from im where $CONDITIONS ' \ --split-by id \ --fields-terminated-by '\t' \ -m 2
說明:
--split-by:
1.split-by 根據不一樣的參數類型有不一樣的切分方法,如int型,Sqoop會取最大和最小split-by字段值,而後根據傳入的num-mappers來 肯定劃分幾個區域。好比select max(split_by),min(split-by) from獲得的max(split-by)和min(split-by)分別爲1000和1,而num-mappers(-m)爲2的話,則會分紅兩個區域 (1,500)和(501-1000),同時也會分紅2個sql給2個map去進行導入操做,分別爲select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000.最後每一個map各自獲取各自SQL中的數據進行導入工做。 2.當split-by不是int型時出現如上場景中的問題。目前想到的解決辦法是:將-m 設置稱1,split-by不設置,即只有一個map運行,缺點是不能並行map錄入數據。(注意,當-m 設置的值大於1時,split-by必須設置字段) 3.split-by即使是int型,若不是連續有規律遞增的話,各個map分配的數據是不均衡的,可能會有些map很忙,有些map幾乎沒有數據處理的狀況
CONDITIONS:
SQoop Query imports自由查詢模式下$CONDITIONS的做用: 1、必須制定目標文件的位置:--target-dir 2、必須使用$CONDITIONS關鍵字 3、選擇使用--split-by分片(分區,結果分紅多個小文件)
六、將mysql中的數據導入到Hive
sqoop import --connect jdbc:mysql://192.168.200.100:3306/yang --username root --password 010209 --table im --hive-import -m 1
七、指定分隔符和列分隔符,指定hive-import,指定覆蓋導入,指定自動建立Hive表,指定表名,指定刪除中間結果數據目錄
sqoop import \ --connect jdbc:mysql://192.168.200.100:3306/yang \ --username root \ --password 010209 \ --table im \ --fields-terminated-by "\t" \ --lines-terminated-by "\n" \ --hive-import \ --hive-overwrite \ --create-hive-table \ --delete-target-dir \ --hive-database yang \ --hive-table im
-m 1
八、將Mysql數據庫中的表數據導入到Hbase(普通導入)
sqoop import \ --connect jdbc:mysql://192.168.200.100:3306/yang \ --username root \ --password 010209 \ --table im \ --hbase-table im \ --column-family cf \ --hbase-row-key keyid