『壹』 MapRece如何保证结果文件中key的唯一性
MapRece极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。MapRece保证结果文件中key的唯一性的方法为:
1、打开Hadoop集群,打开主机master的终端,输入【ifconfig】命令查看主机IP地址。
注意事项:
MapRece借助于函数式程序设计语言Lisp的设计思想,提供了一种简便的并行程序设计方法,用Map和Rece两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以简单方便地完成大规模数据的编程和计算处理。
『贰』 maprece 的map输出文件在哪
map任务的输出结果不写入HDFS,而是写入执行map的本地硬盘上,为什么呢?因为map的输出是中间结果,所谓中间结果,就是要经过rece之后才会是最终结果,而且整个maprece执行完之后,这个结果就要被干掉了。所以,把它放在HDFS中并实现备份,这就有点大题小做了。当你执行maprece的时候,你可以在shell中用命令 df -lh 来查看硬盘的使用率,要想办法把这个使用率控制在90%以内。
『叁』 如何在Hadoop上编写MapRece程序
用户配置并将一个Hadoop作业提到Hadoop框架中,Hadoop框架会把这个作业分解成一系列map tasks 和rece tasks。Hadoop框架负责task分发和执行,结果收集和作业进度监控。
下图给出了一个作业从开始执行到结束所经历的阶段和每个阶段被谁控制(用户 or Hadoop框架)。
3. 分布式缓存
Haoop中自带了一个分布式缓存,即DistributedCache对象,方便map task之间或者rece task之间共享一些信息,比如某些实际应用中,所有map task要读取同一个配置文件或者字典,则可将该配置文件或者字典放到分布式缓存中。
4.多语言编写MapRece作业
Hadoop采用java编写,因而Hadoop天生支持java语言编写作业,但在实际应用中,有时候,因要用到非java的第三方库或者其他原因,要采用C/C++或者其他语言编写MapRece作业,这时候可能要用到Hadoop提供的一些工具。
『肆』 maprece 输入和输出有多个目录
1.MapRece多路径输入
1.1FileInputFormat.addInputPath(s)
FileInputFormat.addInputPath()是我们最常用的设置MapRece输入路径的方法了。其实,FileInputFormat有两个这样的方法:
[html] view plain
static void addInputPath(Job job, Path path)
static void addInputPaths(Job job, String commaSeperatedPaths)
addInputPath()只能指定一个路径,如果要想添加多个路径需要多次调用该方法:
[java] view plain
FileInputFormat.addInputPath(job, new Path(args[0]));
FileInputFormat.addInputPath(job, new Path(args[1]));
FileInputFormat.addInputPath(job, new Path(args[2]));
addInputPaths()可以指定多条路径,而这多条路径是用“,”分隔的一个字符串:
[java] view plain
String paths = strings[0] + "," + strings[1];
FileInputFormat.addInputPaths(job, paths);
『伍』 Hive常用算子实现原理简述--MapRece版
Hive中的常用算子包括distinct、join、group by、order by、distribute by、sort by、count等,这些操作符在SQL中使用起来很方便,能快速达到我们想要的效果,但是这些算子在底层是怎么实现的呢?
order by很容易想到执行原理,在一个rece中将所有记录按值排序即可。因此order by在数据量大的情况下执行时间非常长,容易out of memory,非特殊业务需求一般不使用。distribute by也比较明显,根据hash值将distribute的值分发到不同的rece。sort by是小号的order by,只负责将本recer中的值排序,达到局部有序的效果。sort by和distribute by配合使用风味更佳,二者可以合并简写为cluster by。count则更加明晰,在combiner或recer处按相同键累加值就能得到。
比较复杂的是distinct、join、group by,本文重点讨论这三个算子在MapRece引擎中的大致实现原理。班门弄斧,抛砖引玉。
map阶段,将group by后的字段组合作为key,如果group by单字段那么key就一个。将group by之后要进行的聚合操作字段作为值,如要进行count,则value是1;如要sum另一个字段,则value就是该字段。
shuffle阶段,按照key的不同分发到不同的recer。注意此时可能因为key分布不均匀而出现数据倾斜的问题。
rece阶段,将相同key的值累加或作其他需要的聚合操作,得到结果。
对group by的过程讲解的比较清楚的是这篇文章 http://www.mamicode.com/info-detail-2292193.html 图文并茂,很生动。
实例如下图,对应语句是 select rank, isonline, count(*) from city group by rank, isonline;
如果group by出现数据倾斜,除去替换key为随机数、提前挑出大数量级key值等通用调优方法,适用于group by的特殊方法有以下几种:
(1)set hive.map.aggr=true,即开启map端的combiner,减少传到recer的数据量,同时需设置参数hive.groupby.mapaggr.checkinterval 规定在 map 端进行聚合操作的条目数目。
(2)设置mapred.rece.tasks为较大数量,降低每个recer处理的数据量。
(3)set hive.groupby.skewindata=true,该参数可自动进行负载均衡。生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到Rece 中,每个 Rece 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key有可能被分发到不同的 Rece 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group ByKey 分布到 Rece 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Rece中),最后完成最终的聚合操作。
Hive中有两种join方式:map join和common join
如果不显式指定map side join,或者没有达到触发自动map join的条件,那么会进行rece端的join,即common join,这种join包含map、shuffle、rece三个步骤。
(1)Map阶段
读取源表的数据,Map输出时候以Join on条件中的列为key,如果Join有多个关联键,则以这些关联键的组合作为key。Map输出的value为join之后所关心的(select或者where中需要用到的)列;同时在value中还会包含表的Tag信息,用于标明此value对应哪个表。然后按照key进行排序。
(2)Shuffle阶段
根据key的值进行hash,并将key/value按照hash值推送至不同的rece中,这样确保两个表中相同的key位于同一个rece中
(3)Rece阶段
根据key的值完成join操作,期间通过Tag来识别不同表中的数据。
以下面的SQL为例,可用下图所示过程大致表达其join原理。
SELECT u.name, o.orderid FROM user u JOIN order o ON u.uid = o.uid;
关联字段是uid,因此以uid为map阶段的输出key,value为选取的字段name和标记源表的tag。shuffle阶段将相同key的键值对发到一起,rece阶段将不同源表、同一key值的记录拼接起来,可能存在一对多的情况。
如果指定使用map join的方式,或者join的其中一张表小于某个体积(默认25MB),则会使用map join来执行。具体小表有多小,由参数 hive.mapjoin.smalltable.filesize 来决定。
Hive0.7之前,需要使用hint提示 /*+ mapjoin(table) */才会执行MapJoin,否则执行Common Join,但在0.7版本之后,默认自动会转换Map Join,由参数 hive.auto.convert.join 来控制,默认为true。
以下图为例说明map join如何执行,该图来自 http://lxw1234.com/archives/2015/06/313.htm ,博主是一个水平深厚又乐于分享的前辈,图片水印上也有其网址。
yarn会启动一个Local Task(在客户端本地执行的Task)--Task A,负责扫描小表b的数据,将其转换成一个HashTable的数据结构,并写入本地的文件中,之后将该文件加载到DistributeCache中。
接下来是Task B,该任务是一个没有Rece的MR,启动MapTasks扫描大表a,在Map阶段,根据a的每一条记录去和DistributeCache中b表对应的HashTable关联,并直接输出结果。
由于MapJoin没有Rece,所以由Map直接输出结果文件,有多少个Map Task,就有多少个结果文件。
distinct一般和group by同时出现。
当distinct一个字段时,将group by的字段和distinct的字段组合在一起作为map输出的key,value设置为1,同时将group by的字段定为分区键,这可以确保相同group by字段的记录都分到同一个recer,并且map的输入天然就是按照组合key排好序的。根据分区键将记录分发到rece端后,按顺序取出组合键中的distinct字段,这时distinct字段也是排好序的。依次遍历distinct字段,每找到一个不同值,计数器就自增1,即可得到count distinct结果。例如下面的SQL语句,过程可以下图示意。
我暂时没有理解这是怎么实现的,别人写的也没有看明白。有善良的学富五车的大佬指点一下吗?
『陆』 如何自定义一个hadoop maprecer中recer输出的时候以csv文件输出。
设定输出分隔符为“,”,并且multipleoutputtformat自定义输出文件名为*.csv就可以了
『柒』 maprece 输出的文件名可以自己定义吗
当然可以,通过它的API就可以知道了,有机会搭上环境试下就知道了~