hadoop开发重点总结

1、Mapper的key排序方式默认为快速排序,合并切片文件时用的是归并排序,继承Mapper类
* 驱动类关联map:job.setMapperClass(WordcountMapper.class);

2、Reducer需要继承Reducer类,重写reduce(key, values, context)方法
* 驱动类关联reducer:job.setReducerClass(WordcountReducer.class);

3、Combiner需要继承Reducer类,用于汇总集合等操作,求平均值时不要用,主要是用于提高效率,优化
* 驱动类关联Combiner:job.setCombinerClass(WordCountCombiner.class);

4、Partitioner分区(默认分区方式为HashPartitioner实现类)
自定义分区,继承Partitioner,重写getPartition(key, value, numPartitions),前2个参数为mapper的输出,numPartitions是分区数

设置分区数的三种情况:
1)如果设置的分区数为1则不进行分区操作,直接汇总到一个文件中

2)如果设置的分区数大于实际分区数时,会多出空白文件,但不会异常

3)如果设置的分区数小于实际分区数时,抛出IO异常

5、SORT排序(默认用字典排序):
1)GroupingComparator分组-辅助排序:分组类需要继承WritableComparator,重写compare()方法,并且必须要写一个无参构造方法 
* 驱动类关联GroupingComparator: job.setGroupingComparatorClass(OrderSortGroupingComparator.class);

2)BEAN多次排序(二次排序):分组排序(辅助排序),主要作用是将BEAN对象进行属性排序(BEAN的某1个或某几个属性相同)
BEAN需要实现WritableComparable接口,实现compareTo()比较方法、readFields()反序列化方法、write()序列化方法

3)部分排序:多个文件,每一个文件内容都是排序的

4)全排序:最终输出是一个文件时并且内容是排序的为全排序


6、Reduce端多表合并(数据倾斜)
1)定义表的综合属性Bean实现Writable接口的序列化方法:write() 反序列化方法:readFields()
2)通过Mapper的map()读取不同的表文件,并将表属性与值区分开来放入BEAN对象中,输出后由reducer继续处理
3)通过TableReduce的reduce()将表属性合并后输出
4)缺点是数据量大时,reduce处理压力增大(这就是所谓的数据倾斜)


7、Mapper端多表合并(解决数据倾斜问题)
1)只在Mapper端合并,Reducer端不参与合并
2)Mapper实现setup(Context context)方法,将一对多中的一方的属性名称与属性拆分,保存到HashMap中供map()进一步处理
3)map()将setup()中处理的一方数据与处理的多方数据合并,并写出
4)主类Driver.class中加载缓存数据   file:///d:/cache/pd.txt
job.addCacheFile(new URI("file:///d:/cache/pd.txt"));

job.addCacheFile(new URI(args[2]));
5)map端join的逻辑不需要reduce阶段,设置reducetask数量为0
job.setNumReduceTasks(0);


8、自定义InputFormat--RecordReader(主要是处理小文件合并的问题)
1)在Mapper之前处理的类
2)继承FileInputFormat类,重写是否切割文件的isSplitable()与createRecordReader()方法
3)在createRecordReader()中自定义RecordReader,实现小文件的合并操作
最重要的实现方法:nextKeyValue(),用于以IO流方式读取小文件,合并小文件后的IO流输出给Mapper处理
4)处理完毕后交予Mapper处理,一个文件处理一次setup()与map()
5)处理流程是: 
a) Mapper.setup(),提供文件分割路径
b) 自定义InputFormat.createRecordReader(),合并小文件IO流
c) Mapper.map() ,输出最终结果文件
6)设置输出文件的格式为sequencefile,默认是TextFileOutputFormat.class
job.setOutputFormatClass(SequenceFileOutputFormat.class);


9、自定义OutputFormat--RecordWriter(主要实现过滤文件内容,输出到不同文件中)
1)自定义输出实现方法:FileOutputFormat.getRecordWriter()
2)在RecordWriter类中主要处理文件输出规则,过滤文件内容
3)在Driver类中设置自定义输出类:job.setOutputFormatClass(FilterOutputformat.class);

猜你喜欢

转载自blog.csdn.net/cyjch/article/details/80346027