新的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。