Hadoop2-MapReduce(2)

来源:互联网 发布:python pd.to numeric 编辑:程序博客网 时间:2024/04/29 18:48

新的API:


//Mapper

MyMapper extends Mapper<....>

map(LongWritable key,Text value,Context context) throws ...{

....

context.write(new Text(year),new IntWriteable(..));

}


//Reducer

MyReducer extends Reducer<....>

context.write(key,new IntWritable(..));


//main

Job job=new Job();

job.setJarByClass(XX.class)


横向扩展  scaling out

数据分布存储在HDFS中,允许Hadoop将MapReduce计算移到存储有部

分数据的各台机器上。


Hadoop将Job分成若干个小任务task来执行。包括两类任务:map,reduce


两类节点控制作业执行过程:

1.jobtracker

通过调度tasktracker运行的任务,协调所有运行在系统上的作业。


2.tasktracker

运行任务同时将运行进度报告发给jobtracker,jobtracker记录没想作业

任务的整体进度情况。如果一个任务失败,jobtracker可以在另外一个tasktracker

节点重新调度任务。


输入分片 input slit: Hadoop将MapReduce输入数据划分成等长的小数据块。

Hadoop为每个分片构建一个map任务,map任务处理分片中记录。


分片为了实现负载均衡,更快的处理,获得最佳性能。(数据本地化优化 data locality optimization)


合理的分片趋向于HDFS一个块大小,默认64MB。


map将输出(中间)结果写入本地硬盘,而非HDFS。


单个Reduce任务的输入通常来自于所有mapper的输出。

map输出通过网络传输发送到运行reduce任务的节点。

数据在reduce端合并,然后reduce函数处理,输出通常

存储在HDFS中以实现可靠存储。

对于reduce输出的HDFS块,第一个复本存储在本地节点,

其他复本存在其他节点。


多个reduce任务时,每个map任务都会为其输出进行分区 partition,

为每个reduce任务简历一个分区,键对应的值都在同一个分区中。

分区函数控制分区。


map和reduce之间的数据流成为shuffle


也有可能没有任务reduce任务,唯一非本地节点的数据传输时map任务将结果写入HDFS。


combiner:

针对map任务的输出制定一个合并函数 combiner。合并函数的输出作为

reduce任务的输入。(map任务端预处理部分数据)

jobConf.setCombinerClass(XX.class);


Hadoop的Streaming

使用Unix标准流作为Hadoop和应用程序之间的接口。



Hadoop的Pipes

是MapReduce的C++接口代称。使用套接字作为tasktracker与C++版本的

map函数或reduce函数的进程之间的通道。未使用JNI。



原创粉丝点击