初次寫文章,之前都是學習別人寫的東西,從今天開始學會記錄、學會分享。
這段時間開始了Hadoop的學習,今天主要學習利用Sqoop從MySQL數據源向Hive中導入數據。
1.執行導入的操作命令:在Sqoop的安裝目錄下輸入命令 bin/sqoop import --connect jdbc:mysql://數據庫主機ip:3306/數據庫名 --username root --P --table tablename --hive-import -m 1;
2.對命令及出現的問題說明:
(1)執行導入時,實際上在內部執行了三個步驟:
-
- 第一步將數據導入hdfs,
- 第二步創建hive表名相同的表,
- 第三步將hdfs上數據傳入hive表中
(2)最開始執行導入后,可在Hadoop下使用fs命令在HDFS中看見導入的數據,在Hive中使用“show tables;”沒法看見對應的表,原因是之前執行導入的命令中,沒有加入 “--hive-import”參數;
(3)Hive exited with status 1的問題:
報異常:hive.HiveImport: Exception in thread "main" java.lang.NoSuchMethodError: org.apache.thrift.EncodingUtils.setBit(BIZ)B。
解決辦法:這是因為在同路徑下安裝了hive和hbase,而hbase和hive的lib目錄下的thrift版本不同。hbase下的為libthrift-0.8.0.jar,hive下的為libthrift-0.9.0.jar。將Hbase下的0.8.0版的刪除,換為0.9.0的即可。ps:不知為什么Sqoop向Hive中導入數據還有Hbase的事;
(4)Hive exited with status 64的問題:
報異常:“FAILED: SemanticException Line 2:17 Invalid path ''hdfs://10.144.101.126:9000/user/root/machineinfo'': source contains directory: hdfs://10.144.101.126:9000/user/root/***/_logs-00000
13/07/25 10:34:07 ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: Hive exited with status 64
”。根據提示,存在一個log文件。
解決辦法:經分析,原來在之前的導入中,雖然沒有正確的將數據導入到Hive中,但在HDFS中形成了相應的中間文件,可先將之前HDFS中的相應的目錄刪除(bin/hadoop fs -rmr /user/root/***),這個目錄往往就是要導入的MySQL中的表名命名的目錄。然后再使用Sqoop執行導入,會正確的在Hive中創建對應的表,且創建成功后,HDFS中創建的目錄會被自動刪除。看來這個目錄只是中間形成的臨時目錄。