Mapper类:
1. Mapper组件开发方式:自定义一个类,继承Mapper
2. Mapper组件的作用是定义每一个MapTask具体要怎么处理数据。
例如一个文件,256MB,会生成2个MapTask(每个切片大小,默认是128MB,
所以MapTask的多少有处理的数据大小来决定)。即2个MapTask处理逻辑是一样的,
只是每个MapTask处理的数据不一样。
3. 下面是Mapper类中的4个泛型含义:
a.泛型一:KEYIN:LongWritable,对应的Mapper的输入key。输入key是每行的行首偏移量
b.泛型二: VALUEIN:Text,对应的Mapper的输入Value。输入value是每行的内容
c.泛型三:KEYOUT:对应的Mapper的输出key,根据业务来定义
d.泛型四:VALUEOUT:对应的Mapper的输出value,根据业务来定义
4. 注意:初学时,KEYIN和VALUEIN写死(LongWritable,Text)。KEYOUT和VALUEOUT不固定,根据业务来定
5. Writable机制是Hadoop自身的序列化机制,常用的类型:
a. LongWritable
b. Text(String)
c. IntWritable
d. NullWritable
6. 定义MapTask的任务逻辑是通过重写map()方法来实现的。
读取一行数据就会调用一次此方法,同时会把输入key和输入value进行传递
7. 在实际开发中,最重要的是拿到输入value(每行内容)
8. 输出方法:通过context.write(输出key,输出value)
9. 开发一个MapReduce程序(job),Mapper可以单独存储,
此时,最后的输出的结果文件内容就是Mapper的输出。
10. Reducer组件不能单独存在,因为Reducer要依赖于Mapper的输出。
当引入了Reducer之后,最后输出的结果文件的结果就是Reducer的输出。
Reduce类:
1. Reducer组件用于接收Mapper组件的输出
2. reduce的输入key,value需要和mapper的输出key,value类型保持一致
3. reduce的输出key,value类型,根据具体业务决定
4. reduce收到map的输出,会按相同的key做聚合,
形成:key Iterable 形式然后通过reduce方法进行传递
5. reduce方法中的Iterable是一次性的,即遍历一次之后,再遍历,里面就没有数据了。
所以,在某些业务场景,会涉及到多次操作此迭代器,处理的方法是
:①先创建一个List ②把Iterable装到List ③多次去使用List即可