1、hdfs文件的權限問題
問題分析與解決:
根據報錯信息是hdfs文件的權限問題,命令進入集群執行的用戶為null,而hdfs文件所有者為hdfs。
要么以用戶hdfs執行命令,要么調整hdfs文件的權限,因為我只是使用hdfs文件的其中之一,暫時考慮:以hdfs用戶執行命令。
在~/.bash_profile文件增加:
export HADOOP_USER_NAME=hdfs
2、文件格式問題
hive sequencefile導入文件遇到FAILED: SemanticException Unable to load data to destination table. Error: The file that you are trying to load does not match the file format of the destination table.錯誤
原因
這是因為SequenceFile的表不能使用load來加載數據,只能導入sequence類型的數據
解決辦法
- 先創建一個臨時表(save as textfile),將數據導入進去,
- 然后再導入這個表里 insert into table test_sq select * from test_tex
3、錯誤:ERROR tool.ImportTool: Error during import: No primary key could be found for table TRANS_GJJY02. Please specify one with –split-by or perform a sequential import with ‘-m 1’.
根據錯誤提示我們可以知道這是因為表中的數據沒有設置主鍵。而針對這個問題有兩種傑解決方案:
方案一:老老實實地在表中設置主鍵,然后再執行這個導入語句,就不會出錯。
方案二:有些數據無法設置主鍵,比如很多的監測記錄數據,找不到唯一值,針對這種數據,我們可以根據上面的錯誤提示通過以下兩個方法來解決:
(1)將你的map個數設置為1(Sqoop默認是4)
-m 1
(2)使用–split-by,后面跟上表的最后一列名字。從而能夠對數據進行分行 ,命令如下:
–split-by column1
這兩種解決方法,推薦使用方法(2),因為方法(1)只用一個map,效率太低,相比較而言,方法(2)可以自己設置map個數,效率會高一些。
4、Output directory already exists錯誤
增加配置參數 –delete-target-dir \
5、實例:sqoop從MySQL導入數據到Hive
sqoop import \
–connect jdbc:mysql://ip:3306/test \
–username root \
–password 123456\
–table users\
–fields-terminated-by ‘\t’ \
–delete-target-dir \
–num-mappers 1 \
–hive-import \
–hive-database sqoop\
–hive-table users
參數解釋:
import:從MySQL導入到HDFS文件系統數據
–connect:數據庫JDBC連接字符串
–username:數據庫用戶名
–password:數據庫密碼
–table:數據庫表名
–columns:數據庫列名
–where: 查詢條件
–query: 指定查詢sql
–delete-target-dir 導入后刪除hdfs的目錄
–num-mappers 1 指定map數量=1,可以簡寫為 -m 1
–hive-import 導入hive
–hive-database sqoop hive的database
–hive-table users hive表
–hive-partition-key 分區字段
–hive-partition-value 分區值
–hive-overwrite 覆蓋數據
實際上import命令,從MySQL導入到HDFS文的背后依然是執行的MapReduce。執行完map后,又執行了load data
如果導出的數據庫是mysql 則可以添加一個 屬性 –direct ,加了 direct 屬性在導出mysql數據庫表中的數據會快一點 執行的是mysq自帶的導出功能