我有一个数据集,我试图在hadoop中进行分析。据我所知,它在少量数据中运行平稳。
第一个查询:
我想在大数据上对此进行测试,并找出在文件大小增加时完成任务需要多少时间。如何获得完成任务需要多少秒?是否有任何cmd行语法之类的?
第二个查询:
dfs.replication
设置为 1 个in hdfs-core.xml
文件。它只复制输入数据,还是对地图缩减作业有一定影响?
第三个查询:
现在,我有一个单节点Hadoop集群。如何知道它为给定输入文件生成的映射器的确切数量以及如何更改编号。的映射器?实际上,我想获得完成不同编号下的任务所需的时间。的映射器。
例如:首先,我想用 10 个映射器测试数据,然后是 20 个,依此类推,这样我就可以得到在不同映射器编号下完成任务所需的时间。
第三个查询:
你可以玩 块大小 .
默认情况下,如果您没有在 hadoop 1.x 中配置块大小,则其 64 MB
Hadoop 2.x 其 128 MB
假设你有 1 GB 的文件,如果块大小为 64 MB,所以默认情况下,如果您为输入分割大小配置了任何内容,那么您的输入分割大小将等于块大小,因此 16 个 64 MB 的分割将用于 1 GB,每个分割对应的 1 个映射器意味着 16 个映射器将被调用 1 Gb 的数据
如果将块大小更改为 128 MB,则 8 个映射器将类似地用于 256MB 块大小 4,而对于 512 MB 块大小 2
,将使用映射器。第二个查询:复制因子可以改善您的映射 - 降低任务性能,因为如果数据被正确复制,那么任务跟踪器可以直接在块上运行,否则它将不得不从其他节点复制该块可能会使用网络带宽,从而降低性能。
第一个查询 :
一旦任何作业在该作业结束时完成,它就会拥有所有统计信息,例如使用了多少映射器和多少化简器,写入了多少字节以及执行了多长时间,并且具有所有详细信息。
查询
我不确定cmd语法,但是您可以在作业完成后使用java api本身。例如:
job.waitForCompletion(false);
if(job.isSuccessful()){
System.out.println("completionTime :"
+ (job.getFinishTime() - job.getStartTime())/1000 + "s");
}
第二个查询
它会影响工作绩效。 因为现在工作将无法利用地方性的数据与复制因子为 3 时一样多。数据必须传输到有插槽可用的任务跟踪器,从而最终导致更多的网络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
,我仍然对它的使用感到困惑。这篇SE帖子可能会在这方面为您提供帮助。
相反,您也可以在运行作业时利用-D
选项。 例如:
hadoop jar job.jar com.test.Main -Dmapred.map.max.split.size=209715200
注意:这些属性在Hadoop 2.5.0中被弃用。看看是否正在使用它。
@namanamu,
查询 1:
如果您使用的是单独的驱动程序类,那么您可以使用 Java 计时器通过在 long start = System.currentTimeMillis();
和 long stop = System.currentTimeMillis();
之间添加主代码来了解它所花费的时间,所花费的时间是 (stop-start)/1000
秒。
查询 3:当您使用 hadoop jar myfile.jar 通过命令行执行作业时,最终您会发现所有属性都像 no。映射器、化简器、输入组、归约组和所有其他信息。