Unix传统处理按行存储数据工具是awk
MapReduce任务分为两个处理阶段:Map阶段和Reduce阶段。每个阶段都以键值对作为输入和输出,其类型有程序员来选择。程序员还需要些两个函数:map函数和reduce函数
map阶段为数据的准备阶段,此处我们比较合适去除去已损记录的地方,比如筛选缺失,可疑,错误的数据
防止覆盖的一个思路:
reduce写入目录。在运行作业前该目录是如果存在则跑异常,报错拒绝运行作业,预防数据丢失(长时间跑的数被覆盖一定非常恼人)
写好的Java打成jar包使用hadoop命令运行作业比直接使用Java命令来运行方便,hadoop会把文件和依赖以及路径和环境变量加进去
虚类:抽象类默认接口的实现类
注意:将Mapper和Reducer类转换为新API时,记住将map()和reduce()的签名转换为新形势
hadoop将作业分成若干个小任务(task)来执行,其中包含两类任务map任务和reduce任务
两类节点控制着的作业执行过程:一个jobtracker及一系列tasktracker。jobtracker通过调度tasktracker上运行的任务来协调所有运行在系统上的作业。tasktracker在运行任务的同时将运行进度报告发送给jobtracker,jobtracker由此记录每项作业任务的整体进度情况。如果其中一个任务失败,jobtracker可以在另外一个tasktracker上重新调度该任务。
一个合理的分片大小趋向于HDFS的一个块的大小,默认是64MB
map任务将其输出写入本地硬盘,而非HDFS
combiner函数
没用combiner函数前 key=>[value1,value2,value2...]
用之后向reduce输入的变为key=>maxvalue
有些情况不能用combiner,求最大值可以,但 平均气温这种就不能
他能有效的减少mappper和reduce之间的数据传输量,早MapReduce作业使用combiner函数需要慎重考虑
使用方法在运行的时候
job.setCombinerClass(我们的mapper类和MapClass为同一个类.class)
hadoop使用Unix标准流作为Hadoop和应用程序的接口,所以我们可以使用任何编程语言通过标准的输入/输出来写MapReduce
java,Ruby,Python..