sqoop export導出 map100% reduce0% 卡住的多種原因及解決
我稱這種bug是一個典型的“哈姆雷特”bug,就是指那種“報錯情況相同但網上卻會有各種五花繚亂解決辦法”的bug,讓我們不知道哪一個才是癥結所在。
先看導入命令:
[root@host25 ~]# sqoop export --connect "jdbc:mysql://172.16.xxx.xxx:3306/dbname?useUnicode=true&characterEncoding=utf-8" --username=root --password=xxxxx --table rule_tag --update-key rule_code --update-mode allowinsert --export-dir /user/hive/warehouse/lmj_test.db/rule_tag --input-fields-terminated-by '\t' --input-null-string '\\N' --input-null-non-string '\\N' -m1
這個導入命令語法上其實是完全沒問題的。
接下來是報錯:
#截取部分 19/06/11 09:39:57 INFO mapreduce.Job: The url to track the job: http://dthost25:8088/proxy/application_1554176896418_0537/ 19/06/11 09:39:57 INFO mapreduce.Job: Running job: job_1554176896418_0537 19/06/11 09:40:05 INFO mapreduce.Job: Job job_1554176896418_0537 running in uber mode : false 19/06/11 09:40:05 INFO mapreduce.Job: map 0% reduce 0% 19/06/11 09:40:19 INFO mapreduce.Job: map 100% reduce 0% 19/06/11 09:45:34 INFO mapreduce.Job: Task Id : attempt_1554176896418_0537_m_000000_0, Status : FAILED AttemptID:attempt_1554176896418_0537_m_000000_0 Timed out after 300 secs 19/06/11 09:45:36 INFO mapreduce.Job: map 0% reduce 0% 19/06/11 09:45:48 INFO mapreduce.Job: map 100% reduce 0% 19/06/11 09:51:04 INFO mapreduce.Job: Task Id : attempt_1554176896418_0537_m_000000_1, Status : FAILED AttemptID:attempt_1554176896418_0537_m_000000_1 Timed out after 300 secs 19/06/11 09:51:05 INFO mapreduce.Job: map 0% reduce 0% 19/06/11 09:51:17 INFO mapreduce.Job: map 100% reduce 0% 19/06/11 09:56:34 INFO mapreduce.Job: Task Id : attempt_1554176896418_0537_m_000000_2, Status : FAILED AttemptID:attempt_1554176896418_0537_m_000000_2 Timed out after 300 secs 19/06/11 09:56:35 INFO mapreduce.Job: map 0% reduce 0% 19/06/11 09:56:48 INFO mapreduce.Job: map 100% reduce 0% 19/06/11 10:02:05 INFO mapreduce.Job: Job job_1554176896418_0537 failed with state FAILED due to: Task failed task_1554176896418_0537_m_000000 Job failed as tasks failed. failedMaps:1 failedReduces:0 19/06/11 10:02:05 INFO mapreduce.Job: Counters: 9 Job Counters Failed map tasks=4 Launched map tasks=4 Other local map tasks=3 Data-local map tasks=1 Total time spent by all maps in occupied slots (ms)=2624852 Total time spent by all reduces in occupied slots (ms)=0 Total time spent by all map tasks (ms)=1312426 Total vcore-seconds taken by all map tasks=1312426 Total megabyte-seconds taken by all map tasks=2687848448 19/06/11 10:02:05 WARN mapreduce.Counters: Group FileSystemCounters is deprecated. Use org.apache.hadoop.mapreduce.FileSystemCounter instead 19/06/11 10:02:05 INFO mapreduce.ExportJobBase: Transferred 0 bytes in 1,333.3153 seconds (0 bytes/sec) 19/06/11 10:02:05 WARN mapreduce.Counters: Group org.apache.hadoop.mapred.Task$Counter is deprecated. Use org.apache.hadoop.mapreduce.TaskCounter instead 19/06/11 10:02:05 INFO mapreduce.ExportJobBase: Exported 0 records. 19/06/11 10:02:05 ERROR tool.ExportTool: Error during export: Export job failed! Time taken: 1340 s task IDE_TASK_ADE56470-B5A3-4303-EA75-44312FF8AA0C_20190611093945147 is complete.
可以看到,導入任務在INFO mapreduce.Job: map 100% reduce 0%時停住瞭,停瞭5分鐘,然後任務自動重跑,又卡住停瞭5分鐘,最後任務報瞭個超時的錯誤。
很顯然,任務失敗的直接原因是超時,但是超時的原因是因為導入過程的mapreduce任務卡住瞭,那mapreduce為什麼會卡住呢?這個報錯日志中並沒有提到,這就是查原因時最麻煩的地方。
先說一下結果,最後查瞭很久才發現,是因為有一行的數據長度,超過瞭mysql設定的字段長度。也就是在往varchar(50)的字段裡導入字符串“字符串很長很長很長很長很長很長很長很長很長”時,任務就阻塞住瞭。
在這裡也跟大傢匯總一下網上的各種原因,大傢可以逐個檢查
在map 100% reduce 0%時卡住的可能原因:(以往mysql導出為例)
1、長度溢出。導入的數據超過瞭mysql表的字段設定長度
解決辦法:重設字段長度即可
2、編碼錯誤。導入的數據不在mysql的編碼字符集內
解決辦法:其實在mysql數據庫中對應UTF-8字符集的不是utf8編碼,而是utf8mb4編碼。所以當你的導入數據裡有若如Emoji表情或者一些生僻漢字時,就會導不進去造成阻塞卡住。所以你需要註意兩點:
(1)導入語句中限定useUnicode=true&characterEncoding=utf-8,表示以utf-8的格式導出;
(2)mysql建表語句中有ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3、內存不足。導入數據量可能過大,或者分配內存太少
解決辦法:要麼分批導入,要麼給任務分配更多內存
4、主機名錯誤。
解決辦法:這個好像是涉及到主機名的配置問題
5、主鍵重復 。
解決辦法:這是因為你導入的數據中有重復的主鍵值,要針對性處理一下數據
補充:sqoop從數據庫到處數據到hdfs時mapreduce卡住不動解決
在sqoop時從數據庫中導出數據時,出現mapreduce卡住的情況
經過百度之後好像是要設置yarn裡面關於內存和虛擬內存的配置項.我以前沒配置這幾項,也能正常運行。但是這次好像運行的比較大。出現此故障的原因應該是,在每個Docker分配的內存和CPU資源太少,不能滿足Hadoop和Hive運行所需的默認資源需求。
解決方案如下:
在yarn-site.xml中加入如下配置:
<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>20480</value> </property> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>2048</value> </property> <property> <name>yarn.nodemanager.vmem-pmem-ratio</name> <value>2.1</value> </property>
關閉yarn重啟就好瞭!!!
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- Linux下安裝Hadoop集群詳細步驟
- Spark簡介以及與Hadoop對比分析
- Hadoop運行時遇到java.io.FileNotFoundException錯誤的解決方法
- Windows下使用IDEA搭建Hadoop開發環境的詳細方法
- Linux下Hadoop 2.7.3 安裝搭建過程