Sqoop从Oracle导入大表至HDFS的并行与故障处理问题咨询
针对你用Sqoop导入Oracle大表时遇到的两个问题,我来逐一拆解说明:
问题1:单个mapper抛异常,整个作业会失败吗?
默认情况下,整个作业会直接失败,而且HDFS上已经写入的所有数据都会被MapReduce框架清理掉——不会留下任何部分导入的数据。
这是因为Sqoop导入本质上是一个MapReduce作业,而MapReduce的默认容错逻辑是:只要有一个mapper(task)失败,整个作业就会标记为失败,并且会自动删除输出目录里的临时数据。
不过你可以通过调整MapReduce的容错参数来改变这个行为,比如设置mapreduce.map.failures.maxpercent(允许失败的mapper百分比)。举个例子,如果你设置了--m 4,同时把这个参数设为25,那么即使1个mapper失败,作业依然会被标记为成功,此时成功的3个mapper对应的数据会保留在HDFS中。但要注意,这种情况你需要自己手动补导失败mapper对应的那部分主键范围的数据,不然会有数据缺失。
问题2:指定--m参数时,Sqoop能智能运行并行mapper吗?
这得看你的表是否满足前提条件:
- 首先,你的表有主键(你已经提到了),Sqoop默认会把主键作为拆分键。当你指定
--m N时,Sqoop会先查询主键的最小值和最大值,然后把这个范围平均拆分成N个区间,每个mapper负责处理一个区间的数据,这时候确实是“智能”拆分的。 - 但如果你的表没有主键,也没手动用
--split-by指定拆分键,那即使你设置了--m参数,Sqoop也只会启动1个mapper,根本不会并行。 - 另外还要注意拆分键的数据分布:如果主键的数据倾斜很严重(比如大部分数据集中在某个区间),那拆分后的mapper任务量会不均,有的mapper要处理巨量数据,有的几乎没活干,这种情况下所谓的“智能”并行效果就会大打折扣。
内容的提问来源于stack exchange,提问作者Chandru
相关产品推荐
相关产品推荐

