sqoop export导出 map100% reduce0% 卡住的多种原因及解决
我称这种bug是一个典型的“哈姆雷特”bug,就是指那种“报错情况相同但网上却会有各种五花缭乱解决办法”的bug,让我们不知道哪一个才是症结所在。
先看导入命令:
[root@host25~]# sqoopexport--connect"jdbc:mysql://172.16.xxx.xxx:3306/dbname?useUnicode=true&characterEncoding=utf-8" --username=root--password=xxxxx--tablerule_tag--update-keyrule_code --update-modeallowinsert --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/1109:39:57INFOmapreduce.Job:Theurltotrackthejob:http://dthost25:8088/proxy/application_1554176896418_0537/ 19/06/1109:39:57INFOmapreduce.Job:Runningjob:job_1554176896418_0537 19/06/1109:40:05INFOmapreduce.Job:Jobjob_1554176896418_0537runninginubermode:false 19/06/1109:40:05INFOmapreduce.Job:map0%reduce0% 19/06/1109:40:19INFOmapreduce.Job:map100%reduce0% 19/06/1109:45:34INFOmapreduce.Job:TaskId:attempt_1554176896418_0537_m_000000_0,Status:FAILED AttemptID:attempt_1554176896418_0537_m_000000_0Timedoutafter300secs 19/06/1109:45:36INFOmapreduce.Job:map0%reduce0% 19/06/1109:45:48INFOmapreduce.Job:map100%reduce0% 19/06/1109:51:04INFOmapreduce.Job:TaskId:attempt_1554176896418_0537_m_000000_1,Status:FAILED AttemptID:attempt_1554176896418_0537_m_000000_1Timedoutafter300secs 19/06/1109:51:05INFOmapreduce.Job:map0%reduce0% 19/06/1109:51:17INFOmapreduce.Job:map100%reduce0% 19/06/1109:56:34INFOmapreduce.Job:TaskId:attempt_1554176896418_0537_m_000000_2,Status:FAILED AttemptID:attempt_1554176896418_0537_m_000000_2Timedoutafter300secs 19/06/1109:56:35INFOmapreduce.Job:map0%reduce0% 19/06/1109:56:48INFOmapreduce.Job:map100%reduce0% 19/06/1110:02:05INFOmapreduce.Job:Jobjob_1554176896418_0537failedwithstateFAILEDdueto:Taskfailedtask_1554176896418_0537_m_000000 Jobfailedastasksfailed.failedMaps:1failedReduces:0 19/06/1110:02:05INFOmapreduce.Job:Counters:9 JobCounters Failedmaptasks=4 Launchedmaptasks=4 Otherlocalmaptasks=3 Data-localmaptasks=1 Totaltimespentbyallmapsinoccupiedslots(ms)=2624852 Totaltimespentbyallreducesinoccupiedslots(ms)=0 Totaltimespentbyallmaptasks(ms)=1312426 Totalvcore-secondstakenbyallmaptasks=1312426 Totalmegabyte-secondstakenbyallmaptasks=2687848448 19/06/1110:02:05WARNmapreduce.Counters:GroupFileSystemCountersisdeprecated.Useorg.apache.hadoop.mapreduce.FileSystemCounterinstead 19/06/1110:02:05INFOmapreduce.ExportJobBase:Transferred0bytesin1,333.3153seconds(0bytes/sec) 19/06/1110:02:05WARNmapreduce.Counters:Grouporg.apache.hadoop.mapred.Task$Counterisdeprecated.Useorg.apache.hadoop.mapreduce.TaskCounterinstead 19/06/1110:02:05INFOmapreduce.ExportJobBase:Exported0records. 19/06/1110:02:05ERRORtool.ExportTool:Errorduringexport:Exportjobfailed! Timetaken:1340s taskIDE_TASK_ADE56470-B5A3-4303-EA75-44312FF8AA0C_20190611093945147iscomplete.
可以看到,导入任务在INFOmapreduce.Job:map100%reduce0%时停住了,停了5分钟,然后任务自动重跑,又卡住停了5分钟,最后任务报了个超时的错误。
很显然,任务失败的直接原因是超时,但是超时的原因是因为导入过程的mapreduce任务卡住了,那mapreduce为什么会卡住呢?这个报错日志中并没有提到,这就是查原因时最麻烦的地方。
先说一下结果,最后查了很久才发现,是因为有一行的数据长度,超过了mysql设定的字段长度。也就是在往varchar(50)的字段里导入字符串“字符串很长很长很长很长很长很长很长很长很长”时,任务就阻塞住了。
在这里也跟大家汇总一下网上的各种原因,大家可以逐个检查
在map100%reduce0%时卡住的可能原因:(以往mysql导出为例)
1、长度溢出。导入的数据超过了mysql表的字段设定长度
解决办法:重设字段长度即可
2、编码错误。导入的数据不在mysql的编码字符集内
解决办法:其实在mysql数据库中对应UTF-8字符集的不是utf8编码,而是utf8mb4编码。所以当你的导入数据里有若如Emoji表情或者一些生僻汉字时,就会导不进去造成阻塞卡住。所以你需要注意两点:
(1)导入语句中限定useUnicode=true&characterEncoding=utf-8,表示以utf-8的格式导出;
(2)mysql建表语句中有ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;
3、内存不足。导入数据量可能过大,或者分配内存太少
解决办法:要么分批导入,要么给任务分配更多内存
4、主机名错误。
解决办法:这个好像是涉及到主机名的配置问题
5、主键重复。
解决办法:这是因为你导入的数据中有重复的主键值,要针对性处理一下数据
补充:sqoop从数据库到处数据到hdfs时mapreduce卡住不动解决
在sqoop时从数据库中导出数据时,出现mapreduce卡住的情况
经过百度之后好像是要设置yarn里面关于内存和虚拟内存的配置项.我以前没配置这几项,也能正常运行。但是这次好像运行的比较大。出现此故障的原因应该是,在每个Docker分配的内存和CPU资源太少,不能满足Hadoop和Hive运行所需的默认资源需求。
解决方案如下:
在yarn-site.xml中加入如下配置:
yarn.nodemanager.resource.memory-mb 20480 yarn.scheduler.minimum-allocation-mb 2048 yarn.nodemanager.vmem-pmem-ratio 2.1
关闭yarn重启就好了!!!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。