赞
踩
大数据学习笔记
MapReduce处理过程为两个阶段:Map和Reduce。
- Map负责把一个任务分解成多个任务;
- Reduce负责把分解后多任务处理的结果汇总。
MapReduce核心编程思想
- 自定义一个类继承FileInputFormat
1)重写isSplitable()方法,返回false不可分割
2)重写createRecordReader(),创建自定义的RecordReader对象,并初始化- 改写RecordReader,实现一次读取一个完整文件封装为KV
1)采用IO流一次读取一个文件输出到value中,因为设置了不可切片,最终把所有文件都封装到了value中
2)获取文件路径信息+名称,并设置key- 设置Driver
1)设置输入的inputFormat
2)设置输出的outputFormat
- 待处理文本 xx.txt
- 提交前要获取参数信息,形成一个任务分配的规划
- 提交信息 job(看是yarn 还是本地)
- APPmaster接收请求,根据切片来计算出开多少个MapTask
- 按照默认切片方式128M为一块,默认按照TextInputFormat读数据
- 将kv内容交给Mapper(逻辑运算内容) 业务逻辑
- 将数据写到环形缓冲区,包含元数据信息和真实输入的kv,元数据中包含索引、分区信息、key起始、value起始等信息。
- 分区、排序。
- 将缓冲区文件,溢写到文件,并分区且区内有序。
- Merge 归并,将溢写出的文件合并并排序
- 合并
- reduce根据当前分区的个数(MapTask数目)开启reduce Task进程
- 下载到ReduceTask本地磁盘,对每个分区做合并并进行归并排序
14.使用reduce方法 读文件数据- 分组
- 默认TextOutputFormat
要求将统计结果按照条件输出到不同文件(分区)中去。
分区总结:
指定排序规则。
对应MapTask,它会将处理的结果暂时放到环形缓冲区中,当环形缓冲区使用率达到一定阈值后,再对缓冲区中的数据进行一次快速排序,将这些有序数据溢写到磁盘上,而当数据处理完毕后,它会对磁盘上所有文件进行归并排序。
对于ReduceTask,它会从每个MapTask上远程拷贝相应的数据文件,如果文件大小超过一定阈值,则溢写磁盘上,否则存储在内存中。如果磁盘上文件数目达到一定阈值,则进行一次归并排序以上传一个更大文件;如果内存中文件大小或者数目超过一定阈值,则进行一次合并后将数据溢写到磁盘上。当所有数据拷贝完毕后,ReduceTask统一对内存和磁盘上的所有数据进行一次归并排序。
2. 排序分类
1)部分排序
MapReduce根据输入记录的键对数据集排序。保证输出的每个文件内部有序。
2)全排序
最终输出结果只有一个文件,且文件内部有序。实现方式是只设置一个ReduceTask。但该方法在处理大型文件时效率极低,因为一台机器处理所有文件,完全丧失了MapReduce所提供的并行架构。
3)辅助排序
在reduce端对key进行分组。应用于:在接收的key为bean对象时,想让一个或几个字段相同(全部字段比较不相同)的key进入到同一个reduce方法时,可以采用分组排序。
4)二次排序
自定义排序,如果compareTo中的判断条件为两个即为二次排序。
OutputFormat是MapReduce输出的基类,所有实现MapReduce输出都实现了OutputFormat接口。
常见的OutputFormat实现类:
自定义OutputFormat 使用场景及步骤
1.使用场景
为了实现控制最终文件的输出路径和输出格式,可以自定义OutputFormat。
2. 自定义OutputFormat步骤
1)自定义一个类继承FileOutputFormat
2)改写RecordWriter,具体改写输出数据的方法write()。
Reduce Join工作原理
map端的主要作用:为来自不同的表或文件的key/value对,打标签以区别不同的来源的记录。然后用连接字段作为key,其余部分和新加的标志作为value,最后进行输出。
reduce端的主要作用:在reduce端以连接字段作为key的分组已经完成,我们只需要在每一个分组当中将那些来源不同的文件的记录(在Map阶段已经打标志)分开,最后进行合并就ok了。
案例
Map端表合并案例分析:
hadoop为每个作业维护若干内置计数器,以描述多项指标。例如,某些计数器记录已处理的字节数和记录数,使用户可监控已处理的输入数据量和已产生的输出数据量。
ETL:萃取、转置、加载。
在运行核心业务MapReduce程序之前,往往要先对数据进行清洗,清理掉不符合用户要求的数据。清洗的过程往往只需进行Mapper程序,不需要运行Reduce程序。
(清洗的量大概每1万条数据有两条需要处理数据)
在map阶段对输入的数据根据规则进行过滤清洗
压缩技术能够有效减少底层存储系统(HDFS)读写字节数。压缩提高了网络带宽和磁盘空间的效率。在运行MR程序时,I/O操作、网络数据传输、shuffle和merge要花大量的时间,尤其是数据规模很大和工作负载密集的情况下,因此,使用数据压缩显得非常重要。
鉴于磁盘I/O和网络带宽是hadoop的宝贵资源,数据压缩对于节省资源、最小化磁盘I/O和网络传输非常有帮助。可以在任意MapReduce阶段启用压缩。不过,尽管压缩与解压操作的CPU开销不高,其性能的提升和资源的节省并非没有代价。(虽然减少了磁盘IO,但是同时也增加了CPU运算负担)。
压缩策略和原则:压缩是提高Hadoop运行效率的一种优化策略。
1)运算密集型的job,少用压缩(也就是经常用到的数据)
2)IO密集型的job,多用压缩(使用次数少的文件)
不同的压缩文件对应的解析方法:
Gzip压缩:
Bzip2 压缩
Lzo压缩
Snappy压缩
MapReduce数据压缩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。