MapReduce计数器和毗连
在MapReduce的计数器是用于收集关于 MapReduce 事情的统计信息的机制。这个信息在MapReduce的功课处理惩罚的问题的诊断是很有用的。 计数器雷同于将在 map 或 reduce 在代码日志信息中。
凡是环境下,这些计数器在一个措施(map 或 reduce)中界说,当一个特定事件或条件(特定于该计数器)产生执行期间递增。计数器是一个很好的应用来从输入数据集跟踪有效和无效的记录。
有两种范例的计数器:
1. Hadoop 内置计数器: 有一些内置计数器存在每个功课中。下面是内置计数器组:
2. 用户界说的计数器
除了内置的计数器,用户可以界说本身的计数器,通过利用编程语言提供了雷同的成果。 譬喻,在 Java 的列举用于界说用户界说的计数器。
一个MapClass例子利用计数器计较缺失和无效值的数量:
|
publicstaticclassMapClass extendsMapReduceBase implementsMapper<LongWritable, Text, Text, Text> { staticenumSalesCounters { MISSING, INVALID }; publicvoidmap ( LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throwsIOException {
//Input string is split using ',' and stored in 'fields' array String fields[] = value.toString().split(",", -20); //Value at 4th index is country. It is stored in 'country' variable String country = fields[4];
//Value at 8th index is sales data. It is stored in 'sales' variable String sales = fields[8];
if(country.length() == 0) { reporter.incrCounter(SalesCounters.MISSING, 1); } elseif(sales.startsWith("\"")) { reporter.incrCounter(SalesCounters.INVALID, 1); } else{ output.collect(newText(country), newText(sales + ",1")); } } } |
上面的代码片断显示在 Map Reduce 实现计数器的示例。
在这里,SalesCounters是用“列举”界说的计数器。它被用来计较 MISSING 和 INVALID 的输入记录。
在代码段中,假如 “country” 字段的长度为零那么它的值丢失,因此相应的计数器 SalesCounters.MISSING 递增。
接下来,假如 “sales” 字段开头是标记 '' ,则记录被视为无效。这通过递增计数器 SalesCounters.INVALID 来暗示。
MapReduce 毗连
毗连两个大的数据集可以利用 MapReduce Join 来实现。然而,这个进程需要编写大量的代码来执行实际的毗连操纵。
#p#分页标题#e#
毗连两个数据集开始是通过较量每个数据集的巨细。假如因为对比其他数据集一个数据集小,那么小数据集被漫衍到集群中的每个数据节点。一旦分手,无论是 Mapper 或 Reducer 利用更小的数据集举办查找匹配的大型数据集的记录,然后团结这些记录,形成输出记录。
这取决于在实际毗连举办的处所,这个毗连分为:
1. 映射端毗连 – 当该联接是由映射器执行的,它称为映射端链接。在这种范例中,联络前的数据由映射函数实际来耗损的处理惩罚。它是强制性的,输入到每个映射是在分区中的形式,而且是按排序顺序。别的,必需有一个相等数目标分区,它必需由毗连键举办排序。
2. Reduce端毗连- 当毗连是通过减速器举办的,称为reduce端毗连。没有须要在此毗连有数据会合在以布局化形式(或分区)。
在这里,映射端的处理惩罚发出毗连这两个表的要害字和对应的元组。作为该处理惩罚的结果,所有的元组沟通毗连键都落在沟通的 reducer,然后利用沟通的毗连键毗连记录。
整体处理惩罚流程示于下图。