首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MapReduce整体介绍

    MapReduce框架(Map/Reduce) MapTask/ReduceTask 数据分发机制             MapTask接口实现类 : 对一行数据进行处理,map方法             ReduceTask接口实现类:对一组数据进行处理,reduce方法         MapReduce工作机制         划分输入切片: 数据切片             job.split文件         分布式数据处理         K相同的KV数据分配给同个ReduceTask         组合拳:CompareTo + Partation + Group         分区控制/分组控制         MapReduce编程模型             map task的实现                 读数据:TextInputFormat                          SequenceFileInputFormat                          DBInputFormat                 portation 分区                 调用Partitaioner 的getPartition 决定数据分区             reduce task的实现                 读数据:下载"区"数据,并且合并多个"同区"并且排序                 写数据:TextInputFormat                         SequenceFileOutputFormat                         DBOutputFormat             GroupingComparator:分组                 确定那些数据属于同一组         对倾斜数据的处理             1. 通过Combiner组件进行maptask端局部聚合数据减轻倾斜影响             2. 通过打算倾斜数据来消除倾斜的影响,通过在Key值后面添加随机值,这样就可以均衡的分布在ReduceTaks端。         MapReduce编程模型具体实现及处理流程:             MRAppMaster                 YarnChild(maptask/reducetask)                     main()                 1. MapTask:                     ->TextInputFormat                         ->LineRecordFromat                             ->Mapper                                 ->map()                                     ->context   --->  MapOutputCollector 环形缓存,存在大小限制                                                         ->spilter (80%) 分区(partation),排序(compare)                                                         ->write 溢出文件(可能包含多个文件,有序文件) 写本地磁盘                                                         ->merge 分区有序,分区索引文件                     多个maptask会生成多个merge文件                 2. Shuffle: Store && Rest                     map task 生成的数据传输给reduce task 的过程                    多个maptask会生成多个merge文件,这些文件会保存在NodeManager中,NodeManager具有Web服务,ReduceTask会通过Web服务下载merge文件,进行处理                         3. ReduceTask                     -> http下载:从多个DataManager中下载merge文件下载单个分区的KV数据,多个文件合并为一个文件

    01

    hadoop中的一些概念——数据流

    数据流   首先定义一些属于。MapReduce作业(job)是客户端需要执行的一个工作单元:它包括输入数据、MapReduce程序和配置信息。Hadoop将作业分成若干个小任务(task)来执行,其中包括两类任务,map任务和reduce任务。   有两类节点控制着作业执行过程,:一个jobtracker以及一系列tasktracker。jobtracker通过调度tasktracker上运行的任务,来协调所有运行在系统上的作业。tasktracker在运行任务的同时,将运行进度报告发送给jobtracker,jobtracker由此记录每项作业任务的整体进度情况。如果其中一个任务失败,jobtracker可以再另外衣tasktracker节点上重新调度该任务。   Hadoop将MapReduce的输入数据划分成等长的小数据块,称为输入分片(input split)或简称分片。Hadoop为每个分片构建一个map任务,并由该任务来运行用户自定义的map函数从而处理分片中的每条记录。   拥有许多分片,意味着处理每个分片所需要的时间少于处理整个输入数据所花的时间。因此,如果我们并行处理每个分片,且每个分片数据比较小,那么整个处理过程将获得更好的负载平衡,因为一台较快的计算机能够处理的数据分片比一台较慢的计算机更多,且成一定比例。即使使用相同的机器,处理失败的作业或其他同时运行的作业也能够实现负载平衡,并且如果分片被切分的更细,负载平衡的质量会更好。   另一方面,如果分片切分的太小,那么管理分片的总时间和构建map任务的总时间将决定着作业的整个执行时间。对于大多数作业来说,一个合理的分片大小趋向于HDFS的一个块的大小,默认是64MB,不过可以针对集群调整这个默认值,在新建所有文件或新建每个文件时具体致死那个即可。   Hadoop在存储有输入数据(Hdfs中的数据)的节点上运行map任务,可以获得最佳性能。这就是所谓的数据本地化优化。现在我们应该清楚为什么最佳分片大小应该与块大小相同:因为它是确保可以存储在单个节点上的最大输入块的大小。如果分片跨越这两个数据块,那么对于任何一个HDFS节点,基本上不可能同时存储这两个数据块,因此分片中的部分数据需要通过网络传输到map任务节点。与使用本地数据运行整个map任务相比,这种方法显然效率更低。   map任务将其输出写入本地硬盘,而非HDFS,这是为什么?因为map的输出是中间结果:该中间结果由reduce任务处理后才能产生最终输出结果,而且一旦作业完成,map的输出结果可以被删除。因此,如果把它存储在HDFS中并实现备份,难免有些小题大做。如果该节点上运行的map任务在将map中间结果传送给reduece任务之前失败,Hadoop将在另一个节点上重新运行这个map任务以再次构建map中间结果。   reduce任务并不具备数据本地化的优势——单个reduce任务的输入通常来自于所有mapper的输出。在下面的李宗中,我们仅有一个reduce任务,其输入是所有map任务的输出。因此,排过序的map输出需要通过网络传输发送到运行reduce任务的节点。数据在reduce端合并,然后由用户定义的reduce函数处理。reduce的输出通常存储在HDFS中以实现可靠存储。对于每个reduce输出的HDFS块,第一个副本存储在本地节点上,其他副本存储在其他机架节点中。因此,reduce的输出写入HDFS确实需要占用网络带宽,但这与正常的HDFS流水线写入的消耗一样。   一个reduce任务的完成数据流如下:虚线框表示节点,虚线箭头表示节点内部数据传输,实线箭头表示节点之间的数据传输。

    02
    领券