Sqoop(三)將關係型數據庫中的數據導入到HDFS(包括hive,hbase中)

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
相關文章
相關標籤/搜索