大数据-MapReduce
1.分布式并行编程
- 传统的并行计算,共享型方案刀片服务器,适用于实时的细粒度计算,尤其是计算密集的应用。
- MapReduce扩展性好,节点普通pc也可,每个节点拥有自己的内存和空间,适用于非实时的批处理,以及数据密集型的应用。
2.MapReduce模型
- 复杂的计算过程高度抽象成两个函数,map和reduce。
- 将庞大数据切片,对每个小片并行的单独使用map处理,计算向数据靠拢,数据不需要迁移,数据直接在当前机器上被执行。
- hadoop集群分为一个master和若干个slave,其中master上的jobtracker负责作业调度和处理以及失败和恢复工作,slave上面的tasktracker负责接受jobtracker发送的作业处理指令完成具体的任务处理。
- map函数相当于对字符串中每个字符value赋值为1,reduce相当于对相同字符合并value。
3.MapReduce体系结构
client(客户端):
- client提交作业。
- 通过接口提交当前作业的运行状态。
JobTracker(作业跟踪器):
- 负责资源的监控和作业的调度。
- 监控底层的其他的TaskTracker以及当前运行的job的健康状况。
- 一旦探测到失败的情况就把这个任务转移到其他节点继续执行跟踪任务的执行进度和资源使用量。
TaskTracker(任务调度器):
- 执行相关任务和接收JobTracker发送过来的命令。
- 把资源的使用情况和任务的运行进度通过心跳的方式,也就是heartbeat发送给JobTracker。
4.MapReduce工作流程概述
- map之后不会立即reduce,map之后需要shuffle(分区,排序,归并),再进行reduce。
- 任务独立性:不同的map任务之间不会发生数据交换,reduce也是。
- inputformat:对输入进行格式验证,并且把大的数据逻辑切分,recordread,读出来成key-value,之后map。
- outputformat:对输出进行格式检查。
- 文件分片大小:一个文件被分成许多块存储,对一个文件分片有个理想的值。
- 分片大小的设置:多少个分片就有多少个map任务,分片过多map任务过多,map任务之间相关切换耗费相关 管理资源影响执行效率。分片过少,影响并行度,达不到处理效率的目的。
-理想的分片大小: 一般一个块大小作为分片大小(64M或者128M),否则如图中,需要把block2传输到block1的机器,需要额外的传输效率。 - reduce任务数量:在多个机器上多个任务同时进行,最优的reduce任务取决于集群总任务槽slot的个数。比总的个数稍微少一些,留些资源处理发生的错误。
5.Shuffle过程详解
- shuffle过程包含map端的shuffle和reduce端的shuffle
- 缓存:默认分配100M缓存。
- 溢写:每个map任务先往缓存中写,写满100M满了后把缓存写入磁盘,叫溢写。
- 溢写比例:写满才启动溢写,会导致后来生成的map无处写丢失情况,溢写进程不能影响map任务继续执行,设置溢写比例,比如0.8,当写完80M就启动溢写(过程中还需要分区、排序、合并操作,其中分区后给reduce去处理;默认排序;合并减少溢写到磁盘中的数量,两个键值对合并成一个键值对,不是必须,定义并设置门槛值后启动)。jobtracker检测map任务的执行情况,一旦检测到map任务完成,通知相应的reduce任务把数据拉走,及完成了map端的shuffle任务。
- reduce任务会向jobtracker询问要的数据是否可拿到,一旦map任务完成,数据写到磁盘,jobtracker通知reduce任务。
- 先归并后合并,归并是归类,合并是把value值加起来,再分给reduce任务。
6.MapReduce的任务执行过程
- 1.程序部署:选出master和worker,master将应用程序分发给worker。
- 2.任务分配:选出一部分机器执行map任务,选出另一部分执行reduce任务,选出机器执行分片任务。
- 3.读数据:从分片中读取数据生成键值对,提交给map任务。输出键值对,先写到缓存。
- 4.本地写数据:数据溢写到磁盘。
- 5.远程读取数据:负责执行reduce任务的机器从各个相关的map机器任务远程读取自己要处理的数据到本地。处理结果为键值对。
- 6.写数据:把相关结果写入hdfs文件系统。中间结果是写入磁盘不是文件系统,代价低些。
7. 实例分析WordCount
8.MapReduce的应用
两表具备公共字段,自然连接:
9.MapReduce编程实践
Map逻辑部分程序:
Reduce部分逻辑(输入形式为<key,value-list>,其中value-list存储在Iterable容器中):
编译成jar包运行即可。