Java MR Map Reduce 模型
学习一个模型,框架之前最好的方法就是你自己尝试去实现
模型是将一种解决固定场景的方法和行为固化下来
框架是将模型中固定的行为方法固化,将可变的部分按照某种方法让用户自己实现
角色:
1. master:接受任务,拆分任务,下发任务
2. mapper:根据任务边界,读取任务块,任务处理,综合初步的结果
3. reduce:输出最终统计结果,并输出结果
处理过程:Input→Mapper→shuffle→Reducer→Output
1. 任务边界:
- 目标:100个任务,拆分为10个,每个task executor需要可以知道自己需要处理哪些任务
- 要求:有序,间隔一致
- 举例:如UUID的主键根本没法用;雪花ID有序,但间隔不确定;mysql的自增ID可以;固定文件的行号也可以
2. 任务读取:
- 目标:给我分配的是10-19号的任务,那么就需要可以直接读取10~19号任务,即:随机读取
- 组件:如果按照MySQL存储任务,则自增ID就可以读取行;如果是文件存储,那么S3,DFS都支持随机读取行
3. 处理者分任务:
- 微服务实例可以是多个,而访问这些机器都是通过负载均衡,实际访问哪个机器都不清楚,怎么区分不同机器,进行任务的不同下发呢
- master需要可以控制mapper的梳理和输入
4. 结果汇总预处理
- 汇总结果机器也会多台,怎么进行汇总任务的拆分呢? 这个维度一般按照结果维度进行拆分
- 拆分维度:比如结果要一个人的工资,那么按照工资,个税,福利等维度拆分
- 目的,这个拆分的目的汇总不过来进行任务的拆分,方便汇总
5. 结果汇总
- 将不同维度的结果按照一定规则综合
谷歌论文:
https://research.google/pubs/mapreduce-simplified-data-processing-on-large-clusters/
四火:
https://www.raychase.net/6422