我有一个456kb的文件,它正在从hdfs读取,并作为映射器函数的输入给出。每一行都包含一个整数,我正在为其下载一些文件并将它们存储在本地系统上。我在双节点集群上设置了 hadoop,拆分大小从程序更改为打开 8 个映射器:
Configuration configuration = new Configuration();
configuration.setLong("mapred.max.split.size", 60000L);
configuration.setLong("mapred.min.split.size", 60000L);
创建了 8 个映射器,但在两台服务器上都下载了相同的数据,我认为这是因为块大小仍设置为默认 256mb 并且输入文件被处理了两次。所以我的问题是我们可以用mapreduce处理一个小尺寸的文件吗?
如果你下载文件需要时间,你可能已经遭受了所谓的Hadoop推测执行,默认情况下是启用的。不过这只是一个猜测,因为您说您不止一次下载了相同的文件。
通过推测执行打开,可以并行多次处理相同的输入,以利用机器功能的差异。由于作业中的大多数任务即将结束,Hadoop平台将跨多个节点安排剩余任务的冗余副本,这些节点没有其他工作要执行。
您可以通过将 mapred.map.tasks.speculative.execution 和 mapred.reduce.tasks.speculative.execute JobConf 选项分别设置为 false 来禁用映射器和化简器的推测执行。