我正在创建一个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个节点的群集上,它并不忙。
我怀疑地图集的数量可能是由它在表格中找到的数据量所驱动的,但我并不是肯定的。
主要问题:为什么一个映射器需要很长时间才能开始的任何想法?
答案 0 :(得分:0)
除了我的节点的硬件资源,我还会检查网络流量。您可能正在遭受网络饱和(接口错误,帧错误等)。
之后我会确定以下事项:
RegionServer Hotspotting:不均匀的密钥空间分配可能导致对单个区域的大量请求,轰炸RegionServer进程,导致响应时间变慢。你有按时间序组成的密钥数据吗?
非本地数据区域:也许您的工作是请求DataNode不在本地的数据(在DataNode上运行RegionServers),从而迫使HDFS从其他服务器请求数据块网络(也涉及网络流量)。