『壹』 maprece为什么不适合处理小文件
1. 不适合事务/单一请求处理
MapRece绝对是一个离线批处理系统,对于批处理数据应用得很好:MapRece(不论是Google的还是Hadoop的)是用于处理不适合传统数据库的海量数据的理想技术。但它又不适合事务/单一请求处理。(HBase使用了来自Hadoop核心的HDFS,在其常用操作中并没有使用MapRece。)
2. 不能随即读取
3. 以蛮力代替索引
在索引是更好的存取机制时,MapRece将劣势尽显。
4. low-level语言和操作
“直接开始你想要的 -- 而不是展示一个算法,解释如何工作的。” (关系型数据库的观点) -- High level(DBMS)
“展示数据存取的算法。” (Codasyl 的观点) -- Low level(MapRece)
5. 性能问题
想想N个map实例产生M个输出文件-每个最后由不同的rece 实例处理, 这些文件写到运行map实例机器的本地硬盘. 如果N是1,000, M是500, map阶段产生500,000个本地文件. 当rece阶段开始, 500个rece实例每个需要读入1,000文件,并用类似FTP协议把它要的输入文件从map实例运行的节点上pull取过来. 假如同时有数量级为100的rece实例运行, 那么2个或2个以上的rece实例同时访问同一个map节点来获取输入文件是不可避免的-导致大量的硬盘查找, 有效的硬盘运转速度至少降低20%. 这就是为什么并行数据库系统不实现split文件, 采用push(推到socket套接字)而不是pull. 由于MapRece的出色容错依赖于如何实现split文件, MapRece框架是否成功地转向使用push范式, 不是很清楚.
6. 仅提供了现代DBMS功能的一小部分
作为用于分布式处理的算法技术,MapRece不是数据库,不支持索引、数据更新、事务及完整性约束等,且与多数DBMS工具不兼容。
7. 不适合一般web应用
大部分web应用,只是对数据进行简单的访问,每次请求处理所耗费的资源其实非常小,它的问题是高并发,所以要采用负载均衡技术来分担负载。只有当特殊情况下,比如建索引,进行数据分析等,才可能用MR。
『贰』 maprece如何保证结果文件中key的唯一性
MapRece极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。MapRece保证结果文件中key的唯一性的方法为:
1、打开Hadoop集群,打开主机master的终端,输入【ifconfig】命令查看主机IP地址。
注意事项:
MapRece借助于函数式程序设计语言Lisp的设计思想,提供了一种简便的并行程序设计方法,用Map和Rece两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以简单方便地完成大规模数据的编程和计算处理。
『叁』 请简述maprece计算的主要流程
1. 输入阶段:数据被划分为键/值对形式,并在集群的各个节点上进行处理。
2. 映射阶段:输入数据中的每个键/值对都会通过用户定义的映射函数处理,生成一组中间键/值对。
3. 排序与分发(Shuffle阶段):中间键/值对根据键进行分组,并发送到对应的节点上。
4. 缩减阶段:具有相同键的中间值被传递给rece函数,进行聚合处理。
5. 输出阶段:最终的键/值对被输出到指定的输出文件中。
1) 输入数据接口:InputFormat
- 默认实现类:TextInputFormat
- TextInputFormat的作用:逐行读取文本数据,以行的起始偏移量为键,行内容为值。
- CombineTextInputFormat:合并多个小文件为一个大文件,以提高处理效率。
2) 逻辑处理接口:Mapper
- 用户需实现的方法:map()、setup()、cleanup()。
3) 分区器(Partitioner)
- HashPartitioner:默认实现,根据key的哈希值和numReces的数量进行分区。
- 自定义分区:如有特殊需求,可以实现自己的分区逻辑。
4) 排序(Sorting)
- 内部排序:对于自定义对象作为键的情况,需实现WritableComparable接口,并重写compareTo()方法。
- 部分排序:每个最终输出文件内部进行排序。
- 全排序:对所有数据进行全局排序,通常只进行一次rece。
- 二次排序:排序依据两个条件进行。
5) 合并器(Combiner)
- 合并的作用:提高程序执行效率,减少IO传输。
- 使用合并器时不得改变原业务处理结果。
6) 逻辑处理接口:Recer
- 用户需实现的方法:rece()、setup()、cleanup()。
7) 输出数据接口:OutputFormat
- 默认实现类:TextOutputFormat
- 功能逻辑:每对键值输出为文件的一行。
- 用户可自定义输出格式。
『肆』 如何使用Hadoop的MultipleOutputs进行多文件输出
有时候,我们使用Hadoop处理数据时,在Rece阶段,我们可能想对每一个输出的key进行单独输出一个目录或文件,这样方便数据分析,比如根据某个时间段对日志文件进行时间段归类等等。这时候我们就可以使用MultipleOutputs类,来搞定这件事,
下面,先来看下散仙的测试数据:
Java代码
/**
*.
*
*@
*@.
*/
(StringnamedOutput){
if(namedOutput==null||namedOutput.length()==0){
(
"NamecannotbeNULLoremtpy");
}