Hadoop The Definitive Guide 2nd读书笔记 – 第八章

1、计数器,用于Debug或者统计,毕竟分布式系统中,想要调个Bug是非常困难的,因为机器太多。。

2、Hadoop中有10多个内置的计数器,是默认就有的,例如HDFS读/写数据量,等等……

3、用户可以自定义Counter,步骤如下:
(1)Enum
(2)reporter.incrCounter()
(3)从Web管理界面或者getCounter中获得。

class MaxTemperatureWithCounters extends Configured implements Tool
enum Temperature {
MISSING,
MALFORMED
}
.....
public void map(LongWritable key, Text value,
OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException
{
....
reporter.incrCounter(Temperature.MISSING, 1);
....
}

4、另外一种是“动态计数器”,他们无需定义Enum,而是直接用String。

reporter.incrCounter("TemperatureQuality", parser.getQuality(), 1);

其中TemperatureQuality相当于3中的Temperature,Quality就是MISSING/MALFORMED了。
本质上说,Enum那种的计数器也是String的,因为最终都会转化成String(在RPC时)。

5、Counter的“易读化”。如Enum那种都是一个Int做为GROUP,然后另一个Int做为NAME,这种会很奇怪的,不方便前台UI查看时候理解。
Hadoop给出的解决方法,我感觉很山寨……用i18n。。。。
自己建一个文件XXXX_YYYY.properties
XXXXX是运行JobConf的Main类,YYYY是Enum,比如我们这里例子中就是MaxTemperatureWithCounters_Temperature.properties。

6、通过命令行看Counter:

hadoop job -counter

7、Sorting的Order顺序由RawComparator决定:
(1)如果直接设置了setOutputKeyComparatorClass(),就用它
(2)如果没设置,keys必须是WritableComparable,由它比较
(3)其他情况,将采用RawComparator,将bytes解码,调用期compareTo。

8、Hadoop如何产生全局、单一Sort好的文件。最简单的方法是只有一个Reducer,但显然会影响性能。

9、异构数据源的Sort可以有map端和reduce端两种,前者实现起来复杂(需要进入map之前就排序并划分好),而后者实现起来简单但效率不高。

10、执行数据是指运行中所必须的非数据(input)文件。
方法有:
(1)利用JVM重用,将数据存在内存中,但需要大量内存
(2)设置在conf文件或Configuration中。map/reduce中需要用时,覆盖configure(),并获取Configuration对象,然后再get什么的就行了。如果String等常用数据类型不足以满足,可以用Stringifier,将二进制文件序列化。小文件还行,上KB的就别用了。。
(3)Distributed Cache。使用了GenericOptionsParser的Job,只需要在-files中列出要DC的文件(多个文件的话用分号分开),如下:

hadoop jar job.jar MaxTemperatureByStationNameUsingDistributedCacheFile \
-files input/ncdc/metadata/stations-fixed-width.txt input/ncdc/all output

11、Distributed Cache的工作原理是:启动Job时,把需要DC的文件拷贝到JobTracker的文件系统(HDFS)上,执行Task之前,从HDFS再拷贝到对应机器的Local上。

12、Hadoop提供了一些功能很常用的写好的Map/Reduce

ChainMapper
RegexMapper
FieldSelectionMapReduce
IntSumReducer / LongSumReducer
InverseMapper
TokenCounterMapper
RegexMapper

Leave a Reply

Your email address will not be published. Required fields are marked *