第一次查询
我不确定 cmd 语法,但您可以在作业完成后使用 java api 本身。例如:
job.waitForCompletion(false);
if(job.isSuccessful()){
System.out.println("completionTime :"
+ (job.getFinishTime() - job.getStartTime())/1000 + "s");
}
第二次查询
会影响工作绩效。因为现在这项工作将无法利用本地化
复制因子为 3 时的数据量。必须将数据传输到可用插槽的 taskTracker,从而导致更多的网络 IO 和性能下降。
第三次查询
映射器的数量始终等于输入吐出的数量。正统的方法是编写一个自定义的InputFormat,它根据指定的标准拆分数据文件。假设你有一个 1GB 的文件并且你想要 5 个映射器,只需让 InputFormat 在 200MB 上进行拆分(这将消耗更多
在默认的 64 MB 块大小上超过 3 个块)。
另一方面,使用默认 InputFormat 并在提交作业之前将文件手动拆分为所需的映射器数量。为此,约束是每个子文件的大小应小于或等于块大小。因此,对于 5 个映射器,您最多可以使用 5*64=320MB 文件大小。
第三种更改块大小的方法可以解决问题而没有这些麻烦,但根本不推荐。因为它每次都需要重新启动集群。
更新
第三次查询最简单,也最可能是最好的解决方案是在每个作业基础上使用mapred.max.split.size 配置。要为 1GB 文件运行 5 个地图,在提交作业之前执行以下操作:
conf.set("mapred.max.split.size", "209715200"); // 200*1024^2 bytes
很简单,哈。还有另一个属性mapred.min.split.size,我仍然对它的使用感到困惑。 This SE post 可以在这方面为您提供帮助。
相反,您也可以在运行作业时利用-D 选项。例如:
hadoop jar job.jar com.test.Main -Dmapred.map.max.split.size=209715200
注意:这些属性在 Hadoop 2.5.0 中被弃用。 Have a look if are using it。