背景
我们在进行两个集群间数据同步的时候,使用的是hdfs的distcp的方式进行跨集群跨版本的数据同步,但是在执行hdfs distcp 命令时,发现在运行到 with build listing处就卡住了 .
具体问题如下图:
针对问题解决,中间我们试过了哪些办法
1 首先查看hdfs本身服务状态是否正常,get命令是否可用? 这里我们尝试使用get的方式从源集群中下载一个文件来进行测试, hadoop fs -get hdfs://namenode:8020 . 以及使用cp命令是否也是可用的? Hadoop fs -cp hdfs://namenode:8020 hdfs://namenode:8020/ 结果发现get命令和cp命令都是没有问题的,那么这里其实就证明一方面hdfs服务本身是没有问题的,另一方面是网络是通的,不是网络原因.
2 检查yarn application 并没有启动yarn任务,也就是mr任务就没有执行,那么这里我们可以试验一下正常的提交一个mr任务看看是否能够正常的在yarn上面running起来.
执行任务报下面的异常信息:
3 我们查找集群中mapreduce.task.io.sort.mb的设置值为4096,这个配置的意思大概是
“在排序文件时使用的缓冲内存的总量,以兆字节为单位”。有人可能已经为每个任务使用大量内存的应用程序全局设置了该值。在删除该配置(并使用其默认值100)之后,DistCp就可以工作了。
mapreduce.task.io.sort.mb的问题根本分析
MapTask.MapOutputBuffer使用byte[] 大小的数组来实现缓冲区mapreduce.task.io.sort.mb,在分配数组之前检查大小是否正确。问题是Java数组不能有超过2^31 - 1的元素(即使是64位JVM),这是Java语言专门化本身的一个限制。这意味着配置mapreduce.task.io.sort。mb实际上被限制为<= 2047。指定值4096对每个任务占用大量内存的应用程序没有帮助,相反,它会破坏所有MapReduce应用程序
但是由于这个原因,distcp并不会有任何的失败提示,它在SortPass.run()方法的内部循环中不断重试sort传递,所以会一直卡住..
希望本文对你有帮助!
感谢关注“码农星球”。本文版权属于“码农星球”。我们提供咨询和培训服务,关于本文有任何困惑,请关注并联系我们。