# MapReduceProject **Repository Path**: oceanrivers/map-reduce-project ## Basic Information - **Project Name**: MapReduceProject - **Description**: 爬取京东网站的电脑配件商品数据,并使用MapReduce和Hive完成统计分析 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-11-03 - **Last Updated**: 2025-03-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: mapreduce, hive ## README # 这是一个史诗级的巨著 # 开发日志 ## version1.0 时间:2024年11月4日23:09:53
数据预处理是复制的nosql项目的,只是添加了一个日期字段,没啥变化
主要完成了不用任何mapreduce技术实现一个mapreduce程序
本次项目和之前写过的大数据基础的项目的不同点是这次全部数据的读取和保存都会放在HDFS上 ## version2.0 时间:2024年11月5日23:13:14
完成了分区、排序、最值、topN ## version3.0 时间:2024年11月7日20:19:11 今天完成了全排序和二次排序,这个全排序看似很简单,但是他其实很难,所以我做了一个总结,放在了下面
然后二次排序做了两个版本,一个版本是详细版的二次排序,详细版包括了保证在使用组合键排序的同时数据依然能够按照原来的自然键正确分区和分组,
而简略版虽然可以完成二次排序,但是无法保证数据能够按照自然键正确分区和分组,简略版适用于对自然键没有要求,只是单纯的完成二次排序 ### 全排序使用详解 全排序核心要解决的问题就是如何在使用多个reduce的时候还能保证分区之间的数据相对有序,因为如果只使用一个reduce即一个分区,压力太大
目前主流的方式有两个,一个是自定义分区,另一个是采用抽样的方式生成分区文件,让mapreduce根据分区文件自动完成分区
这里我们主要使用第二种方式,要想使用第二种方式就必须先了解抽样的原理,这个很关键
抽样主要是使用InputSampler这个类,在使用抽样后,抽样器会直接从源数据里读取样本,并且要求样本是KV类型的数据,因为分区本质是针对Key进行的
根据样本生成分区文件的方式有三种,点进InputSampler类即可查看,本项目使用的是SplitSampler
生成分区文件后,mapreduce会根据分区文件对mapper的输出结果进行自动分区,这也就意味着,mapper的输出结果的key和mapper的输入的key必须在类型和值上是一致的
因为分区文件是根据的源数据KV生成的,而源数据的KV本质就是mapper输入的KV,如果mapper输出的K和输入的K不一致的话,生成的分区文件就变得毫无意义,分区也无法正确进行
基于以上描述,我们可以总结出使用抽样完成分区的硬性要求是:输入数据必须是KV类型,mapper输入的K和输出的K必须一致
如果要将抽样应用到全排序里,则意味着我们在大多数情况下需要先对原本的输入数据进行格式转换,将排序字段作为Key,源数据作为Value封装成KV键值对的形式
而且InputFormatClass不能使用TextInputFormat.class,需要改为KeyValueTextInputFormat.class或者SequenceFileInputFormat.class,因为前者的key是偏移量,毫无意义,只有后面两个才能正确读入我们的KV数据
其中KeyValueTextInputFormat.class默认KV是按\t分割的,且读入的KV是文本类型;而SequenceFileInputFormat.class读入的是KV的二进制文件,只要保证读入的KV的类型和当时写入到文件的KV的类型一致即可
本项目使用的是SequenceFileInputFormat.class,原因很简单,以为本项目排序的字段是商品价格,而商品价格在排序时显然不能使用文本类型来标识,而是使用double类型,所以只能使用SequenceFileInputFormat.class
而且在大多数情况下,SequenceFileInputFormat.class的灵活性会高于KeyValueTextInputFormat.class
生成分区文件之后,只需要将分区器设置为TotalOrderPartitioner.class即可完成自动分区 ## version4.0 时间:2024年11月10日17:37:55
完成了join和自定义类,其中join部分分别使用了reduce端join和map端join ## version5.0 时间:2025年1月29日20:17:25
添加了可视化部分