基于hadoop+MapReduce+Java大数据清洗和分析的基本操作流程

您所在的位置:网站首页 mapreduce项目 基于hadoop+MapReduce+Java大数据清洗和分析的基本操作流程

基于hadoop+MapReduce+Java大数据清洗和分析的基本操作流程

2024-02-25 19:22| 来源: 网络整理| 查看: 265

全套资源下载地址:https://download.csdn.net/download/sheziqiong/87479734 全套资源下载地址:https://download.csdn.net/download/sheziqiong/87479734

数据处理 1.概述

1.数据抓取 a.进行地址库建设:爬虫 + 人工 (行为匹配数据) b.电信每天用户访问的网址信息,大约产生 2TB;(原始数据) 2.数据清洗 3.数据匹配 4.数据分析

2.包名及作用 2.1 com.jida.hadoop.mr.wz.dataclean

数据清洗

(1) 加载基础数据 (2) 判断数据字段是否一致 (3) 判断 url 是否为空 (4) 判断 url 是否只包含 http://或 https:// (5) 提取域名

输出内容:用户标识 | 一级域名 |URL 地址

本次实验中数据清洗的目的是通过 map 处理,将不符合规范、特殊格式(配置文件、图片等)数据过滤掉。 不符合规范的 url 过滤方法:

部分代码

// 判断数据字段数量,判断url字段是否有效,去除特定格式 if ((str.length + "").equals(TProperties.getValue("filelength")) && !"http://".equals(str[14]) && !"https://".equals(str[14]) && !"".equals(str[14]) && !(str[14].toLowerCase()).matches(TProperties.getValue("fileclear"))) { StringBuffer sb = new StringBuffer(); if (!str[14].startsWith("http://") && !str[14].startsWith("https://")) { str[14] = "http://" + str[14]; } }

特殊格式过滤方法:

使用正则表达式过滤带有.jpg、.png、.bmp 等子串,且子串之后无字符(即子串在结尾或后跟特殊符号)的 url

.*\\.(jpg|png|bmp|jpeg|tif|gif|psd|ico|pdf|css|tmp|js|gz|rar|gzip|zip|txt|csv|xlsx|xls|webp)(\\W.*|$)

获取域名方法:

//正则判断域名或ip地址 public static String getDomain(String domain){ //判断IP String ip = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}"; if(domain.matches(ip)){ return domain; } //判断域名 String str= "((\\w*|\\w*-\\w*)\\.?\\.(com.cn|net.cn|gov.cn|org\\.nz|org.cn|com|net|org|gov|cc|biz|info|cn|hk|in|am|im|fm|tv|co|me|us|io|mobi|pw|so|gs|top|la))$"; Pattern pattern = Pattern.compile(str); Matcher matcher = pattern.matcher(domain); while(matcher.find()){ return matcher.group(); } return ""; } // 获取域名 String domain = str[14].split("/", -1)[2]; // 去除端口 if (domain.indexOf(":") >= 0) { domain = domain.split("\\:", -1)[0]; } TMatcher.getDomain(domain)

(2) 地址库配置数据文件读取与使用 使用 job.addCacheFile()方法,将地址库配置数据文件送入 job 的缓存区,在 mapper 中创建 setup 函数,setup 函数在 map 之前执行,用于加载地址库。

//将地址库配置数据文件送入job的缓存区 job.addCacheFile(new Path("file:///D://testdata/dx/t_dx_basic_msg_addr.txt").toUri()); setup中使用BufferReader类读取文件并写入内存,数据结构采用Map,用treemap按优先级排序,创建StringComparator工具类,修改treemap的排序方式。map端循环匹配数据,输出行为id,用户号码,是否产品,url,预购类型。 //重写setup方法 @Override protected void setup( Mapper.Context context) throws IOException, InterruptedException { // 预处理把要关联的文件加载到缓存中 // 我们这里只缓存了一个文件,所以取第一个即可,创建BufferReader去读取 Path file = new Path(context.getCacheFiles()[0].getPath()); BufferedReader reader = new BufferedReader(new FileReader(file.toString())); String str = null; try { // 一行一行读取 while ((str = reader.readLine()) != null) { // 对缓存中的表进行分割 String[] splits = str.split(TProperties.getValue("fileoutsplit")); //map是否包含一级域名 if (joinData.containsKey(splits[1])) { //增加treemap中url值:匹配地址,匹配级别,行为ID,产品标识,预购类型 joinData.get(splits[1]).put(splits[2] + "," + splits[3] + "," + splits[0] +","+ splits[4]+ "," + splits[5], ""); } else { //创建map中key值,添加treemap,StringComparator修改treemap排序方式 TreeMap treemap = new TreeMap( new StringComparator()); //url地址,匹配级别,行为ID,是否产品,预购类型 treemap.put(splits[2] + "," + splits[3]+ "," + splits[0] +","+ splits[4] + "," + splits[5], ""); //key一级域名 joinData.put(splits[1], treemap); } } } catch (Exception e) { e.printStackTrace(); } finally { reader.close(); } }

(3)第三、四步统计 PV、UV 总数

(4)第五步中排序 value 因为 mapreduce 按照 key 值排序,而 key 值需为用户标识,因此对 PV 的排序不能直接使用 mapreduce 内置函数,利用 Java Treemap 类,将 PV 作为红黑树的 key 值,行为标识和 PV 值作为 value 排序,并在最终输出结果中增加一列排名序列。

//reduce排序取值 public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { TreeMap topMap = new TreeMap(); //循环数据 for (Text val : values) { String[] str = val.toString().split(TProperties.getValue("fileoutsplit")); //将数据放入数据集合 topMap.put(Integer.parseInt(str[topvalue]), val.toString()); //移除超过取值条数的较小数据 if(topMap.size() > topn){ topMap.remove(topMap.firstKey()); } } int num = 0; Iterator iterator = topMap.keySet().iterator(); //数据转换,计算排名 List list = new ArrayList(); while (iterator.hasNext()) { list.add(topMap.get(iterator.next())); } //取数据条数+1,用于计算排名 num = list.size() + 1 ; for(int i = 0 ;i< list.size() ; i++){ //排名 num = num -1 ; //行为ID,用户ID,PV(访问次数),排名 result = new Text(list.get(i) + TProperties.getValue("outfilesplit") + num ); context.write(NullWritable.get(), result); } } 2.2 com.jida.hadoop.mr.wz.basicmatch

行为匹配

行为地址基础数据 t_dx_basic_msg_addr.txt

处理要求: (1) 关联行为地址库(t_dx_basic_msg_addr.txt)识别用户访问行为 (2) 将“任务 1 数据清洗”之后的结果数据与行为地址基础库做 map-join 操作 利用 DistributedCache(分布式缓存)将小文件(地址库)缓存处理

输入内容:用户标识 | 一级域名 |URL 地址 输出内容:行为 id| 用户标识 | 是否产品 |url| 预购类型

2.3 com.jida.hadoop.mr.wz.countpv

用户行为统计

(PV:页面的访问量,UV:独立“用户”访问量)

处理要求: (1)根据“任务 2 行为匹配”的结果数据统计用户的行为地址访问次数 (2)输出数据:行为 ID,用户标识,PV 数 行为 ID 的构成 18 位:其中前六位标识一级域名; 中间六位标识二级域名;最后六位标识三级域名; (3)电信行为数据统计将计算一级域名的 PV 数,故将二级域名和三级域名的行为数据均转化为一级域名,求 PV 值

输入数据:行为 id| 用户标识 | 是否产品 |url| 预购类型 输出数据:行为 ID| 用户标识 |PV 数

2.4 com.jida.hadoop.mr.wz.countuv

网站访问行为统计

(PV:页面的访问量,UV:独立“用户”访问量)

处理要求: (1)根据用户行为统计的结果统计 URL 的 UV 数(用户数)和 PV 数(访问数)

输入数据:行为 ID| 用户标识 |PV 数 输出数据:行为 ID|UV 数(用户数)|PV 数(访问数)

2.5 com.jida.hadoop.mr.wz.counttopn

网站访问行为 TopN

处理要求: 提取用户的高频地址

输入数据:行为 ID| 用户标识 |PV 数 输出数据:行为 ID| 用户标识 |PV(访问次数)| 排序字段

3.通过本项目你学到了哪些内容

(1)MapReduce 基本操作 源代码编写、Java 基本语法。

(2)重写 mapper 中的 setup 方法,实现数据从 job 缓存中的调用读取。

(3)对于大数据清洗和分析的基本操作流程 清洗不符合规范的数据以及不需要采用的特殊数据、通过字典简化数据格式(如实验第二步中用到的行为地址基础数据)、分析数据中对于生产或研究有意义的数据(如实验第五步获取的用户行为 topn)。

4.其他你认为需要总结的

MapReduce 是面向大数据并行处理的计算模型、框架和平台。它利用"Map(映射)“和"Reduce(归约)”,将程序运行在分布式系统中,通过把对数据集的大规模操作分发给网络上的每个节点实现可靠性。 这次实验利用本机 hadoop 环境完成实验内容操作,之后我会结合在大数据存储系统这门课上所学的知识,尝试在虚拟机环境中运行程序,真正理解和掌握 MapReduce。 作为云计算与大数据方向的学生,学习 hadoop 中的 mapreduce 框架操作是必不可少的,目前我的 Java 基础还比较薄弱,在实验过程中遇到了许多问题,今后会在课余时间多加练习,为毕业设计的进行打好基础。

附录 图片

图 1

图 2

图 3

图 4

图 5 全套资源下载地址:https://download.csdn.net/download/sheziqiong/87479734 全套资源下载地址:https://download.csdn.net/download/sheziqiong/87479734



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3