小机灵鬼|42 张图带你揭秘后端技术都要学啥?(11)


int sum = 0;
//for循环遍历 , 将得到的values值累加
for (IntWritable value : values) {
sum += value.get;
}
result.set(sum);
context.write(key, result);//将结果保存到context中 , 最终输出形式为"key" + "result"
}
}
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
System.out.println("start");
Job job = Job.getInstance;
job.setJobName("wordCount");
Path in = new Path("hdfs://***:9000/user/hadoop/input/buyer_favorite1.txt");//设置这个作业输入数据的路径(***部分为自己liunx系统的localhost或者ip地址)
Path out = new Path("hdfs://***:9000/user/hadoop/output/wordCount"); //设置这个作业输出结果的路径
FileInputFormat.addInputPath(job, in);
FileOutputFormat.setOutputPath(job, out);
job.setJarByClass(WordCount.class);// 设置运行/处理该作业的类
job.setMapperClass(doMapper.class);//设置实现了Map步的类
job.setReducerClass(doReducer.class);//设置实现了Reduce步的类
job.setOutputKeyClass(Text.class);//设置输出结果key的类型
job.setOutputValueClass(IntWritable.class);//设置输出结果value的类型
////执行作业
System.exit(job.waitForCompletion(true) ? 0 : 1);
System.out.println("end");
}
}
那么这个map和reduce进程是怎么在分布式的集群中启动的呢?
小机灵鬼|42 张图带你揭秘后端技术都要学啥?map/reduce启动过程
上图比较清晰地阐述的整个过程 , 再描述一波 。 MR中主要是两种进程角色 , 分别为 JobTracke r和 TaskTracker 两种 。
JobTracker在集群中只有一个 , 而 TaskTracker 存在多个 , 当 JobClient 启动后 , 往 JobTracker 提交作业 , JobTracker查看文件路径决定在哪些服务器启动 Map 进程 。
然后发送命令给 TaskTracker , 告诉它要准备执行任务了 , TaskTracker收到任务后就会启动 TaskRunner 下载任务对应的程序 。
map计算完成 , TaskTracker对map输出结果 shuffer 操作然后加载 reduce 函数进行后续计算 , 这就是各个模块协同工作的简单过程 。
Hive上述过程还是比较麻烦 , 我们能不能直接写SQL , 然后引擎帮助我们生成mapreduce代码 , 就反复我们在web开发的时候 , 不直接写SQL语句 , 直接交给引擎那么方便 , 有的 , 它就是HIVE 。
举个例子:
小机灵鬼|42 张图带你揭秘后端技术都要学啥?SQL
小机灵鬼|42 张图带你揭秘后端技术都要学啥?拆分
那么使用MR的计算过程完成这条SQL的处理:
小机灵鬼|42 张图带你揭秘后端技术都要学啥?MR TO SQL
SparkSpark是基于内存计算的大数据并行计算框架 。 基于此说说上面hadoop中组件的缺点: