有没有人在提交大数据作业时遇到任何问题。未压缩的数据约为 5-10 TB,文件大小约为 500K。当我们尝试提交一个简单的 java map reduce 作业时,它通常会花费一个多小时在 getsplits() 函数调用上。并且需要几个小时才能出现在工作跟踪器中。有没有可能的解决方案来解决这个问题?
2 回答
对于 500k 个文件,您需要花费大量时间树遍历来查找所有这些文件,然后需要将这些文件分配给 InputSplits 列表(getSplits 的结果)。
正如 Thomas 在他的回答中指出的那样,如果执行作业提交的机器分配给 JVM 的内存量很少,那么您将看到 JVM 执行垃圾收集以尝试查找构建所需的内存的问题这些 500K 文件的拆分。
更糟糕的是,如果这 500K 文件是可拆分的,并且大于单个块大小,那么您将获得更多输入拆分来处理文件(大小为 1GB 的文件,块大小为 256MB,您ll默认获取4个map任务来处理这个文件,假设输入格式和文件压缩支持拆分文件)。如果这适用于您的工作(查看为您的工作生成的映射任务的数量,是否超过 500k?),那么您可以通过将mapred.min.split.size
配置属性修改为大于当前块的大小来强制创建更少的映射器大小(对于上一个示例,将其设置为 1GB 意味着您将获得一个映射器来处理文件,而不是 4 个)。这将有助于 getSplits 方法的性能,getSplits 的结果列表将更小,需要更少的内存。
问题的第二个症状是将输入拆分序列化为文件(客户端)所需的时间,然后是作业跟踪器端的反序列化时间。500K+ 的拆分需要时间,如果 JVM 内存限制较低,jobtracker 也会出现类似的 GC 问题。
这在很大程度上取决于您的提交服务器(或您的笔记本电脑客户端)有多“强大”,也许您需要升级 RAM 和 CPU 以使 getSplits 调用更快。
我相信您在那里遇到了交换问题,因此计算时间是平时的数倍。