一、Hadoop权威指南学习(理论,1-2章)

第二步中,建立了一个临时文件夹hdfs://...JOB129330,在之后会删除

第三步中,将工程打包上传

 

一、MapReduce

来自:https://www.cnblogs.com/baalhuo/p/5762087.html

   MapReduce中的每个map任务可以细分4个阶段:record reader、mapper、combiner和partitioner。map任务的输出被称

为中间键和中间值,会被发送到reducer做后续处理。reduce任务可以分为4个阶段:混排(shuffle)、排序(sort)、reducer

和输出格式(output format)。map任务运行的节点会优先选择在数据所在的节点,因此,一般可以通过在本地机器上进行计算来减少数据的网络传输。

        Mapreduce作业的输入是一系列存储在Hadoop分布式文件系统(HDFS)上的文件。在MapReduce中,这些文件通过输入格式(input format)被分成了一系列的输入split(input split)。输入split可以看做是文件在字节层面的分块表示,每个split由一

个map任务负责处理。

record reader

        record reader通过输入格式将输入split解析成记录。record reader的目的只是将输入数据解析成记录,但不负责解析记录

本身。它将数据转化为键/值(key/value)对的形式,并传递给mapper处理。通常键是数据在文件中的位置,值是组成记录的

数据块。

map

        在mapper中,用户定义的map代码通过处理record reader解析的每个键/值对来产生0个或多个新的键/值对结果。键/值的

选择对MapReduce作业的完成效率来说非常重要。键是数据在reducer中处理时被分组的依据,值是reducer需要分析的数

据。

combiner

        combiner是一个可选的本地reducer,可以在map阶段聚合数据。combiner通过执行用户指定的来自mapper的中间键对

map的中间结果做单个map范围内的聚合。

        例如,一个聚合的计数是每个部分计数的总和,用户可以先将每个中间结果取和,再将中间结果的和相加,从而得到最终

结果。

        在很多情况下,这样可以明显地减少通过网络传输的数据量。在网络上发送一次(hello,3)要比三次(hello,1)节省更

多的字节量。通过combiner可以产生特别大的性能提升,并且没有副作用,因此combiner的应用非常广泛。

partitioner

        partitioner的作用是将mapper(如果使用了combiner的话就是combiner)输出的键/值对拆分为分片(shard),每reducer

对应一个分片。默认情况下,partitioner先计算目标的散列值(通常为md5值)。然后,通过reducer个数执行取模运算

key.hashCode()%(reducer的个数)。这种方式不仅能够随机地将整个键空间平均分发给每个reducer,同时也能确保不同mapper

产生的相同键能被分发至同一个reducer。用户可以定制partitioner的默认行为,并可以使用更高级的模式,如排序。当然,一

般情况下是不需要改写partitioner的。对于每个map任务,其分好区的数据最终会写入本地文件系统,等待其各自的reducer拉

取。


混排和排序

        reduce任务开始于混排和排序这一步骤。该步骤主要是将所有partitioner写入的输出文件拉取到运行reducer的本地机器

上,然后将这些数据按照键排序并写到一个较大的数据列表中。排序的目的是将相同键的记录聚合在一起,这样其所对应的值

就可以很方便地在reduce任务中进行迭代处理。这个过程完全不可定制,而且是由框架自动处理的。开发人员只能通过自定义

Comparator对象来确定键如何排序和分组。

reduce

        reducer将已经分好组的数据作为输入,并依次为每个键对应分组执行reduce函数。reduce函数的输入是键以及包含与该键

对应的所有值的迭代器。在后文介绍的模式中,我们将看到在这个函数中有很多种处理方法。这些数据可以被聚合、过滤或以

多种方式合并。当reduce函数执行完毕后,会将0个或多个键/值对发送到最后的处理步骤——输出格式。和map函数一样,因

为reduce函数是业务处理逻辑的核心部分,所以不同作业的reduce函数也是不相同。

输出格式

        输出格式获取reduce函数输出的最终键/值对,并通过record write将它写入到输出文件中。每条记录的键和值默认通过tab

分隔,不同记录通过换行符分隔。虽然一般情况下可以通过自定义实现非常多的输出格式,但是,不管什么格式,最终的结果

都将写到HDFS上。

一个MapReduce程序,需要三样东西,一个map函数,一个reduce函数,和一些用来运行作业的代码。

Java的map例子-by《Hadoop权威指南》

Java的reduce例子-by《Hadoop权威指南》

在org.apache.hadoop.io中提供了很多可优化的网络序列化传输的基本类型、LongWritable(相当于long),Text(相当于string),IntWritable(相当于Integer)

第三部分负责运行MapReduce作业

解析:

二、数据流

MapReduce作业(job)是客户端需要执行的一个工作单元:有输入数据,MapReduce程序,配置信息。

Hadoop将作业分成若干个任务(task)来执行,其中包括两类任务:map任务和reduce任务。如果一个任务失败,他将在另一个不同的节点上自动重新调度运行。

Hadoop将MapReduce的输入数据划分成等长的小数据块,分片(input split)。为每个分片构建一个map任务。(默认一个分片大小为128MB,最佳分片大小应该与块大小相等,既可以保证耽搁节点的最大输入块大小,又可以防止通过网络传输占用带宽,)

map任务将输出机械人本地硬盘,不是HDFS。因为map的输出是中间结果,在reduce任务之后处理才产生最终输出结果。并且如果运行map任务的节点在将map中间结果传送给reduce任务之前失败,Hadoop将在另一个节点上重新运行这个map任务以再次构建map中间结果。

combiner:

map任务的输出可以指定一个combiner,combiner的输出结果作为reduce函数的输入。(但要确保无论用多少次combiner,reduce的输出结果是一样的)

指定特定的combiner:

前面和后面和上一个程序一样,只是在setmapper和setreducer中间加了一个setcombiner

三、Hadoop streaming

map的输入数据通过标准输入流传递给map函数,一行一行的传输,最后将结果行写到标准输出。

reduce函数的输入格式与之相同(通过制表符来分隔的键值对)

hadoop命令不支持streaming,因此需要在制定streaming jar文件流与jar选项时指定。

加上combiner

在集群上运行streaming程序时,我们会使用-files,将脚本传输到集群。

Python版map和reduce函数:

 

后面的部分主要是《Hadoop权威指南》学习笔记

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值