1. 程式人生 > 其它 >sqoop 從sqlserver2008 匯入資料到hadoop

sqoop 從sqlserver2008 匯入資料到hadoop

  今天終於開始上手匯入資料到hadoop了,哈哈,過程蠻崎嶇的,和官方文件的還不太一樣。

  OK,let's go!試驗物件是我第一個名為ST_Statistics的一張表,我要把我表裡的資料匯入到hdfs、hive以及hbase當中,然後試驗才算完成。

  1.匯入資料到hdfs

  sqoop import  --connect 'jdbc:sqlserver://192.168.1.105:1433;username=sa;password=cenyuhai;database=SAMS' 
          --query "SELECT * FROM ST_Statistics WHERE BigReason='OfficeSoftwareFault' AND $CONDITIONS " 
              --split-by ResponseTime --target-dir /user/cenyuhai/sams  

  這裡面有幾個需要注意的點:

  (1)--connect 後面的字元帶上了'',為毛?其實我也不知道,官方文件上可不是這麼說的,加上才可以跑。

  (2)--split-by 後面跟的欄位必須是整形的,因為sqoop是靠這個欄位是給map執行緒分工的,不是整理它強轉的時候就會報錯的。

13/09/06 06:50:31 ERROR security.UserGroupInformation: PriviledgedActionException as:root cause:java.io.IOException: com.microsoft.sqlserver.jdbc.SQLServerException: 運算元資料型別 uniqueidentifier 對於 min 運算子無效。
13/09/06 06:50:31 ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: com.microsoft.sqlserver.jdbc.SQLServerException: 運算元資料型別 uniqueidentifier 對於 min 運算子無效。
    at org.apache.sqoop.mapreduce.db.DataDrivenDBInputFormat.getSplits(DataDrivenDBInputFormat.java:167)
    at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java:1054)
    at org.apache.hadoop.mapred.JobClient.writeSplits(JobClient.java:1071)
    at org.apache.hadoop.mapred.JobClient.access$700(JobClient.java:179)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:983)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:936)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1232)
    at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:936)
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:550)
    at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:580)
    at org.apache.sqoop.mapreduce.ImportJobBase.doSubmitJob(ImportJobBase.java:187)
    at org.apache.sqoop.mapreduce.ImportJobBase.runJob(ImportJobBase.java:16

    (3)只要是語法不對的,它都會報下面這個錯,希望大家注意!

At minimum, you must specify --connect and --table
Arguments to mysqldump and other subprograms may be supplied
after a '--' on the command line.

  2.增量匯入

  sqoop支援兩種增量匯入到hive的模式, 一種是 append,即通過指定一個遞增的列,比如:      --incremental append  --check-column id --last-value 0      另種是可以根據時間戳,比如:   --incremental lastmodified --check-column time --last-value '2013-01-01 11:0:00'   就是隻匯入time比'2013-01-01 11:0:00'更大的資料。

  好,我試驗的是第一種,我在插入了前面插入了差距的基礎上,再插入WorkNo是201309071後面的資料(我新加的)

sqoop import  --connect 'jdbc:sqlserver://192.168.1.105:1433;username=sa;password=cenyuhai;database=SAMS'  --table ST_Statistics 
  --where "BigReason='OfficeSoftwareFault'"   --split-by ResponseTime --target-dir /user/cenyuhai/sams 
  --incremental append  --check-column WorkNo  --last-value 201309071 

  執行成功,命令的提示當中會出現以下的提示,最後的值已經到201308081了。

13/09/06 22:26:15 INFO mapreduce.ImportJobBase: Retrieved 5 records.
13/09/06 22:26:15 INFO util.AppendUtils: Appending to directory sams
13/09/06 22:26:15 INFO util.AppendUtils: Using found partition 8
13/09/06 22:26:15 INFO tool.ImportTool: Incremental import complete! To run another incremental import of all data following this import, supply the following arguments:
13/09/06 22:26:15 INFO tool.ImportTool:  --incremental append
13/09/06 22:26:15 INFO tool.ImportTool:   --check-column WorkNo
13/09/06 22:26:15 INFO tool.ImportTool:   --last-value 201309081

  3.匯入到hive

  sqoop import  --connect 'jdbc:sqlserver://192.168.1.105:1433;username=sa;password=cenyuhai;database=SAMS' 
             --table ST_Statistics --where "BigReason='OfficeSoftwareFault'" --split-by ResponseTime --hive-import  --create-hive-table 

  不知道為什麼,執行hive的匯入語句時,就不能用--query了,老報上面的那個提到的那個錯誤,可能是RP不好,就只能改成這種表加上過濾條件的方式了。

  然後用上面對hdfs的增量插入的方式對hive來操作也不成功,老是報前面提到的那個語法錯誤,真是讓人無語了,報錯都報得如此含蓄!

  4.匯入到hbase

sqoop import  --connect 'jdbc:sqlserver://192.168.1.105:1433;username=sa;password=cenyuhai;database=SAMS' --table ST_Statistics --where "BigReason='OfficeSoftwareFault'" --split-by ResponseTime  --hbase-table ST_Statistics --hbase-create-table   --hbase-row-key WorkNo  --column-family cf 

  這條語句非常長,為毛?我也不知道,這種寫法我試了很多次了,用來分行的寫了很多次,一次都沒成功,最後誤打誤撞,弄成一行它就成功運行了!

  5.把資料從hdfs導回到sqlserver,從hive匯出也和這個一樣,因為都是文字檔案,hbase的話,也是不支援直接的,需要通過和hive結合,才能匯出。  

sqoop export  --connect 'jdbc:sqlserver://192.168.1.105:1433;username=sa;password=cenyuhai;database=SAMS' 
              --table ST_Statistics2 --export-dir /user/cenyuhai/sams