文章目錄
- @[toc] 目錄:
- 一、利用Sqoop,從Oracle到HDFS
- 二、利用Sqoop,從Oracle到Hive
- 三、遇到的問題
目錄:
文章目錄
- @[toc] 目錄:
- 一、利用Sqoop,從Oracle到HDFS
- 二、利用Sqoop,從Oracle到Hive
- 三、遇到的問題
一、利用Sqoop,從Oracle到HDFS
第一步:把Oracle驅動拷貝到Sqoop安裝路徑中的lib文件夾下。
第二步:切換賬戶su hdfs
第三步:執行import操作
sqoop import --connect jdbc:oracle:thin:@IPAddress:databaseName --username userName --password password --table TABLENAME --target-dir /user/operate -m 1 --where "where子句 and 根據需要添加"
說明:
1、導入的目錄若已經存在則要先刪除已經存在的目錄,否則會報路徑以存在的錯誤提示:
FileAlreadyExistsException: Output directoryhdfs://master:8020/user/operate already exists
刪除路徑語句:hadoop fs –rmr /user/operate
如果多次導入同一個表中的數據,數據要以append的形式插入到HDFS目錄中。
2、-m 1表示使用幾個map任務處理,sqoop默認采用4個map任務,有幾個任務在HDFS中執行,結果中就有幾個part-m文件;若m值不等于1,則導入的表需要有主鍵,否則會報錯:
Error during import: No primary key could befound for table KW_CARENLIST. Please specify one with --split-by or perform asequential import with '-m 1'.
sqoop是根據–splite-by <字段名>進行分區,–m設置map的數量,sqoop根據不同的splite參數進行切分,然后將切分出來的區域分配到不同的map中。Splite-by的參數類型不同則其切分方法不同,如int型,sqoop會取最大和最小splite-by字段。Sqoop會向關系數據庫發送一個命令;select max(id),min(id) from table,然后會把max、min之間的區間平均分成m份,最后m個并行的map會執行任務。–splite-by認是主鍵,如果操作的表沒有主鍵導入時會報錯。splite-by對非數字類型的字段支持不好,一般用于主鍵及數字類型的字段(對于非數字類型有可能會導致數據量丟失。如:a,b,c,d,e,a,a,v,f,g)。在實例測試中,要導入的Oracle一張表(200多萬條數據)中沒有關鍵字,若以數據表的最后一列(NUMBER類型,值存在null,存在重復值)為splite-by對象,則最終檢驗導入的數據只有100多萬條。
3、Sqoop默認從數據庫導入到HDFS的分隔符是逗號,**可用—field –terminated-by 來指定輸出文件中的行字段分隔符。**如果導入數據的字段內容中存在分隔符,可以另外指定父、字段包圍符和轉轉義字符。
4、空列的值使用null。Sqoop默認導入的數據格式為文本文件。另可導入其他幾種文件格式,如SequenceFile、Avro格式。文本文件不能保存二進制字段(如數據庫中類型為VARBINARY的列),且在區分null值和null字符串時可能出現問題。Avro和SequenceFile格式的文件能夠為導入的數據提供最精確的表示方式,同時還允許對數據進行壓縮,并支持MapReduce并行處理同一文件的不同部分。(不過目前版本還不能將Avro或Sequence文件加載到Hive中,盡管可以手動地將Avro數據文件加載到Hive中)。SequenceFile文件格式的最后一個缺點是它只支持Java語言,而Avro數據文件卻可以被很多語言支持。
5、Sqoop中的map數設置原則:一個表的數據抽取不超過3分鐘,否則就增加map數。
輔助操作:
查看路徑下文件:hadoop fs -ls /user/operate/
打開指定文件:hadoop fs –cat/user/operate/tabe_name
統計文件中行數:hadoop fs –cat /路徑/文件名 |wc –l
二、利用Sqoop,從Oracle到Hive
訪問 Hive數據庫:
第一步:進入到hive命令行。
第二步:直接導入Hive數據庫。
sqoop import --connect jdbc:oracle:thin:@IPAddress:1521:databaseName --username userName --password password --table TABLENAME -m 1 --hive-import --hive-database test
相比導入到HDFS中,添加了—hive-import 、–hive-database參數。
–hive-import指定導入方式是導入到hive數據庫中
–hive-database指定導入的目標數據庫test,若無此參數則默認導入到Hive的默認數據庫default中
上面的導入結果是導入到了test.test_table中,Hive自動創建了一張與Oracle導入表一樣的表。也可以自己創建表,指定自己的表名:–hive-table tbName。
注意:因Oracle、Hive數據類型的不一致,導入的數據會存在精度減低的問題。
也可以使用–option-file傳入一個文件,使用這種方式可以重用一些配置參數(該方法為測試,看起來不錯,做下記錄,有興趣的可以baidu一下):
sqoop –option-file /user/hive/import.txt –table test.table
其中,/user/hive/import.txt文件內容如下:
輔助操作:
刪除數據庫:DROP DATABASE IF EXISTS test;
刪除數據庫表:DROP TBALE test.test_table;
退出hive命令行:exit;
三、遇到的問題
在使用Sqoop從Oracle抽數據到Hive表時,有時候會遇到以下報錯
Error: java.lang.RuntimeException: java.lang.RuntimeException: java.sql.SQLRecoverableException: IO Error: Connection resetat org.apache.sqoop.mapreduce.db.DBInputFormat.setDbConf(DBInputFormat.java:170)at org.apache.sqoop.mapreduce.db.DBInputFormat.setConf(DBInputFormat.java:161)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:749)at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)at java.security.AccessController.doPrivileged(Native Method)at javax.security.auth.Subject.doAs(Subject.java:422)at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1714)at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: java.lang.RuntimeException: java.sql.SQLRecoverableException: IO Error: Connection resetat org.apache.sqoop.mapreduce.db.DBInputFormat.getConnection(DBInputFormat.java:223)at org.apache.sqoop.mapreduce.db.DBInputFormat.setDbConf(DBInputFormat.java:168)... 10 more
解決
此問題一般是由于缺少一個生成快速隨機數的工具,一般可以通過在JRE中的java.security中修改securerandom.source的值為以下內容并重新登陸shell解決問題。
cd $JAVA_HOME/jre/lib/securityvi java.securitysecurerandom.source=file:/dev/../dev/urandom