我正在创建Hadoop MapReduce作业,并且正在对一个HBase表使用两次扫描来提供我的映射器。 HBase表具有10个区域。我创建了两个扫描仪,在它们上调用setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME,tableName),然后执行此操作:

    job.setPartitionerClass(NaturalKeyPartitioner.class);
    job.setGroupingComparatorClass(NaturalKeyGroupingComparator.class);
    job.setSortComparatorClass(CompositeKeyComparator.class);
    TableMapReduceUtil.initTableMapperJob(scans, FaultyRegisterReadMapper.class, MeterTimeKey.class, ReadValueTime.class, job);

由于某些原因,大多数情况下仅创建两个映射器。我希望有更多的映射器,但这并不是什么大不了的事情。

真正糟糕的是,SOMETIMES创建了三个映射器,当它创建时,前两个映射器完成得非常快,而第三个映射器甚至没有启动五分钟。正是这种映射器需要很长时间才能启动,这确实让我感到困扰。 :)

该群集位于具有约60个节点的群集上,并不繁忙。

我怀疑映射器的数量可能取决于表中找到的数据量,但我对此并不乐观。

主要问题:有什么想法为什么一个映射器需要这么长时间才能启动?

最佳答案

除了节点的硬件资源,我还将检查网络流量。您可能正在遭受网络饱和(接口(interface)错误,成帧错误等)的困扰。

之后,我将确保以下几点:

  • RegionServer热点:不均匀的密钥空间分布可能导致对单个区域的大量请求,从而轰炸RegionServer进程,从而导致响应时间变慢。您是否有包含时间序列类数据的键?
  • 非本地数据区域:也许您的工作是请求非DataNode本地的数据(RegionServers在DataNodes上运行),从而迫使HDFS通过网络从其他服务器请求数据块(也涉及网络流量)。
  • 关于hadoop - 一个映射器有时无法启动,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23914522/

    10-12 23:23