系统环境
Linux Ubuntu 16.0
jdk-7u75-linux-x64
hadoop-2.6.0-cdh5.4.5
hadoop-2.6.0-eclipse-cdh5.4.5.jar
eclipse-java-juno-SR2-linux-gtk-x86_64
任务内容
现有某电商网站用户对商品的收藏数据,记录了用户收藏的商品id以及收藏日期,名为buyer_favorite1。
buyer_favorite1包含:买家id,商品id,收藏日期这三个字段,数据以“\t”分割,样本数据及格式如下:
买家id 商品id 收藏日期
10181 1000481 2010-04-04 16:54:31
20001 1001597 2010-04-07 15:07:52
20001 1001560 2010-04-07 15:08:27
20042 1001368 2010-04-08 08:20:30
20067 1002061 2010-04-08 16:45:33
20056 1003289 2010-04-12 10:50:55
20056 1003290 2010-04-12 11:57:35
20056 1003292 2010-04-12 12:05:29
20054 1002420 2010-04-14 15:24:12
20055 1001679 2010-04-14 19:46:04
20054 1010675 2010-04-14 15:23:53
20054 1002429 2010-04-14 17:52:45
20076 1002427 2010-04-14 19:35:39
20054 1003326 2010-04-20 12:54:44
20056 1002420 2010-04-15 11:24:49
20064 1002422 2010-04-15 11:35:54
20056 1003066 2010-04-15 11:43:01
20056 1003055 2010-04-15 11:43:06
20056 1010183 2010-04-15 11:45:24
20056 1002422 2010-04-15 11:45:49
20056 1003100 2010-04-15 11:45:54
20056 1003094 2010-04-15 11:45:57
20056 1003064 2010-04-15 11:46:04
20056 1010178 2010-04-15 16:15:20
20076 1003101 2010-04-15 16:37:27
20076 1003103 2010-04-15 16:37:05
20076 1003100 2010-04-15 16:37:18
20076 1003066 2010-04-15 16:37:31
20054 1003103 2010-04-15 16:40:14
20054 1003100 2010-04-15 16:40:16
要求编写MapReduce程序,统计每个买家收藏商品数量。
统计结果数据如下:
买家id 商品数量
10181 1
20001 2
20042 1
20054 6
20055 1
20056 12
20064 1
20067 1
20076 5
任务步骤
1.切换目录到/apps/hadoop/sbin下,启动hadoop。
cd /apps/hadoop/sbin
./start-all.sh
2.在linux上,创建一个目录/data/mapreduce1。
mkdir -p /data/mapreduce1
3.切换到/data/mapreduce1目录下,使用wget命令从网址 http://192.168.1.100:60000/allfiles/mapreduce1/buyer_favorite1,下载文本文件buyer_favorite1。
cd /data/mapreduce1
wget http://192.168.1.100:60000/allfiles/mapreduce1/buyer_favorite1
依然在/data/mapreduce1目录下,使用wget命令,从
http://192.168.1.100:60000/allfiles/mapreduce1/hadoop2lib.tar.gz,下载项目用到的依赖包。
wget http://192.168.1.100:60000/allfiles/mapreduce1/hadoop2lib.tar.gz
将hadoop2lib.tar.gz解压到当前目录下。
tar -xzvf hadoop2lib.tar.gz
4.将linux本地/data/mapreduce1/buyer_favorite1,上传到HDFS上的/mymapreduce1/in目录下。若HDFS目录不存在,需提前创建。
hadoop fs -mkdir -p /mymapreduce1/in
hadoop fs -put /data/mapreduce1/buyer_favorite1 /mymapreduce1/in
5.打开Eclipse,新建Java Project项目,并将项目名设置为mapreduce1。
6.在项目名mapreduce1下,新建package包,在项目名mapreduce1下。
7.在创建的包mapreduce下,新建类,并将类命名为WordCount。
8.添加项目所需依赖的jar包,右键单击项目名,新建一个目录hadoop2lib,用于存放项目所需的jar包。
将linux上/data/mapreduce1目录下,hadoop2lib目录中的jar包,全部拷贝到eclipse中,mapreduce1项目的hadoop2lib目录下,选中hadoop2lib目录下所有的jar包,单击右键,选择Build Path=>Add to Build Path。
9.编写Java代码,并描述其设计思路。
下图描述了该mapreduce的执行过程
大致思路是将hdfs上的文本作为输入,MapReduce通过InputFormat会将文本进行切片处理,并将每行的首字母相对于文本文件的首地址的偏移量作为输入键值对的key,文本内容作为输入键值对的value,经过在map函数处理,输出中间结果<word,1>的形式,并在reduce函数中完成对每个单词的词频统计。整个程序代码主要包括两部分:Mapper部分和Reducer部分。
Mapper代码
public static class doMapper extends