利用sqoop1.6對mysql和hive進行同步的問題

問題1:java

從mysql數據庫中導入到hive中能夠執行:mysql

sqoop import --connect jdbc:mysql://localhost/gamewave --username root --password 123456 --table log --hive-import -m 1sql

其中-m 1 參數表明的含義是使用多少個並行,這個參數的值是1,說明沒有開啓並行功能。數據庫

將m參數的數值調爲5或者更大,Sqoop就會開啓5個進程,同時進行數據的導入操做。apache

注意, 若是報如下錯誤:服務器

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at org.apache.sqoop.mapreduce.db.DBInputFormat.setConf(DBInputFormat.java:167)
    at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:73)
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:133)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:726)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:340)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:167)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1556)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)
Caused by: java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

這是由於在並行導入,集羣中的其餘節點並無mysql的訪問權限(設置爲%也不行, 須要在mysql中x顯式指定IP),執行以下命令:app

GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'192.168.64.16' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

若是你的mysql不能顯式指定IP,好比咱們公司服務器是用的阿里雲的rds,就只有把其餘節點的ip加入白名單。oop

 

 

問題2: 阿里雲

在同步過程當中,若是不加其餘參數,導入的數據默認的列分隔符是'\001',默認的行分隔符是'\n'。這樣問題就來了,若是導入的數據中有'\n',hive會認爲一行已經結束,後面的數據被分割成下一行,並且會出現數據不一致的狀況。spa

Sqoop也指定了參數 --fields-terminated-by和 --lines-terminated-by來自定義行分隔符和列分隔符。可是目前行分隔符只支持'\n', 因此該方法行不通.

查看幫助文檔後發現有以下2個參數:

--hive-drop-import-delims                                   

Drops \n\r, and \01 from string fields when importing to Hive.

--hive-delims-replacement

Replace \n\r, and \01 from string fields with user defined string when importing to Hive.

所以加上這2個參數來把導入數據中包含的hive默認的分隔符去掉或替換。

sqoop import --connect jdbc:mysql://100.99.74.222:3306/fmcm_cms --username thecover --password Thecover_2016 --table fm_pgc_news --fields-terminated-by '\t' --hive-import --hive-database fmcm --create-hive-table --hive-delims-replacement ' '
相關文章
相關標籤/搜索