实验目的

熟悉hadoop生态系统

初步了解大数据点击流分析业务

学会使用hadoop进行数据分析统计

实验原理

  hadoop主要有三部分,hdfs做数据存储、mapreduce做数据计算、yarn做资源调度。在企业生产环境下,对数据做统计需要结合hadoop三个部分综合运用,中间还要使用kafka、storm、hive、hbase、flume、sqoop、mahout等其它工具。架构一般都会很复杂,接下来几个实验我们主要是针对mapreduce的运用,熟悉企业数据处理的一般步骤。

1.数据ETL
  数据ETL我们之前讲过,通hive进行处理。同样通过mapreduce进行处理也是常用的思路。一般情况下,我们会记录一个用户访问某个网站的url,数据格式如下:

24162912299|156682|17|353817084376524|913|2017-03-07 15:43:59.355741|2017-03-07 15:44:36.938215|10.216.41.184|58.251.80.100||460011030082524|116.79.217.172|220.206.128.106|0||

29722404056|12379|131|861891035159110|205|2017-03-07 15:43:33.325067|2017-03-07 15:44:36.938252|10.41.188.107|42.236.74.242|Mozilla/5.0 (Linux; U; Android 6.0;zh_cn; Le X620 Build/HEXCNFN5902012151S) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/49.0.0.0 Mobile Safari/537.36 EUI Browser/5.9.020S|460011391687384|10.103.47.186|10.100.33.227|0||http://web.users.51.la/go.asp?svid=15&id=19022975&tpages=14&ttimes=69&tzone=8&tcolor=32&sSize=412,732&referrer=http%3A//3g.wenxuemm.com/wapbook/58485_16779691.html&vpage=http%3A//mht.1kmb.cn/page_131.html&vvtime=1488872612376

29622649009|45350|22472|8625310314090700|913|2017-03-07 15:44:36.938314|2017-03-07 15:44:36.972407|10.27.50.191|111.206.205.2||460011531516236|116.79.202.60|220.206.128.58|0||

  其中第一列是加密后的用户id,第六列是访问时间,最后一列是访问的url,其他列为相关的其他信息。在没有其他条件的辅助下,我们没法直接知道一个用户的访问每个url之间的关系,比较通用的思路是每三十分钟为一个段,如果在访问某个url后三十分钟内访问其他url,认为是一个段。基于这个思路,我们首先对源数据进行初步处理:
  对每个用户的访问记录按照时间排序,相邻记录小于三十分钟认为是一个session,sessionId相同,如果大于三十分钟就重新新建一个sessionId。

2.相关业务实现
  基于刚刚的分段数据,要进行pv、uv的统计就很简单了,pv就是统计所有的几率和,而uv就是按照一定条件去重再统计。另外如果要计算新增用户、流失用户,需要有累积下来的历史用户数据,业务逻辑都不复杂。进行简单的统计后,更复杂的便是根据用户数据进行挖掘,一方面要挖掘潜在价值、进行千人千面的推荐、发现关联规则等。这就涉及到机器学习的一些算法。今天我们首先进行最简单的pv统计实现。
  显然这只是一种比较粗糙的方法,判断的结果有很多不符合实际,实际上我们第一步进行数据过滤,可以基于用户关系模型,也就是类似我们前面使用hive的时候用的基于IP的雪花模型,大家可以自行思考。

实验环境

1.操作系统
  服务器:Linux_Centos
  操作机:Windows_7
  服务器默认用户名:root,密码:123456
  操作机默认用户名:hongya,密码:123456
2.实验工具
  IntelliJ IDEA

IDEA全称IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、创新的GUI设计等方面的功能可以说是超常的。IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

  优点:
1)最突出的功能自然是调试(Debug),可以对Java代码,JavaScript,JQuery,Ajax等技术进行调试。其他编辑功能抛开不看,这点远胜Eclipse。
2)首先查看Map类型的对象,如果实现类采用的是哈希映射,则会自动过滤空的Entry实例。不像Eclipse,只能在默认的toString()方法中寻找你所要的key。
3)其次,需要动态Evaluate一个表达式的值,比如我得到了一个类的实例,但是并不知晓它的API,可以通过Code Completion点出它所支持的方法,这点Eclipse无法比拟。
4)最后,在多线程调试的情况下,Log on console的功能可以帮你检查多线程执行的情况。

  缺点:
1)插件开发匮乏,比起Eclipse,IDEA只能算是个插件的矮子,目前官方公布的插件不足400个,并且许多插件实质性的东西并没有,可能是IDEA本身就太强大了。
2)在同一页面中只支持单工程,这为开发带来一定的不便,特别是喜欢开发时建一个测试工程来测试部分方法的程序员带来心理上的不认同。
3)匮乏的技术文章,目前网络中能找到的技术支持基本没有,技术文章也少之又少。
4)资源消耗比较大,建个大中型的J2EE项目,启动后基本要200M以上的内存支持,包括安装软件在内,差不多要500M的硬盘空间支持。(由于很多智能功能是实时的,因此包括系统类在内的所有类都被IDEA存放到IDEA的工作路径中)。

  特色功能:
  智能选择
  丰富的导航模式
  历史记录功能
  JUnit的完美支持
  对重构的优越支持
  编码辅助
  灵活的排版功能
  XML的完美支持
  动态语法检测
  代码检查等等。

步骤1:编写ETL代码

  本次实验数据来自于网络,我们会将一定时间内的数据放在hadoop上面,本次实验将不会在本地进行,而是将写好的程序打成jar包,上传到hadoop集群中,通过shell命令提交运行。开发任务还是在本地进行,本次实验的代码放在D:\hongya\ideaspace\hellohadoop\src\com\hongya\day030_034\statistic\etl内,首先打开操作机桌面的IDEA,进入项目hellohadoop|com.hongya|day030_034直接查看代码即可。

  1.1刚刚的思路是对每个用户的url数据,按照时间排序,相邻访问记录在30分钟以内认为是一个段,最后我们得到每个用户的段数。所以思路就是map中进行简单的过滤后,以用户为key,时间和访问记录为value写出,在reduce中按照时间排序。
  
  map方法实现:

@Override

protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

UrlEntity urlEntity = SegmentUtils.getUrlEntity(value.toString());

if (urlEntity == null){

return;

}

//去秒闪,开始时间和结束时间在2秒以内

if (format.parse(urlEntity.getEndTime()).getTime() - format.parse(urlEntity.getStartTime()).getTime() < 2 * 1000){

return;

}

outputKey.set(urlEntity.getId());

outputKey.set(urlEntity.getStartTime() +  "|" + urlEntity.getUrl());

context.write(outputKey,outputValue);

}

reduce实现:

@Override

protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {

//全部放进一个list中

List<UrlEntity> urls = new ArrayList<>();

for (Text value : values){

String[] split = value.toString().split("\\|");

if (split.length < 2){

continue;

}

UrlEntity entity = new UrlEntity();

entity.setStartTime(split[0]);

entity.setUrl(split[1]);

urls.add(entity);

}

//按照时间排序

urls.sort((o1, o2) -> {

try {

long offset = format.parse(o1.getStartTime()).getTime() - format.parse(o2.getStartTime()).getTime();

return offset == 0 ? 0 : (offset > 0 ? 1 : -1);

} catch (ParseException e) {

return 0;

}

});

int sessionId = 0;

long leftTime = 0;

long rightTime;

for (UrlEntity entity : urls){

try {//判断相邻段的时间间隔

rightTime = format.parse(entity.getStartTime()).getTime();

if (rightTime - leftTime > 30 * 60 * 1000){

sessionId += 1;

}

outputKey.set(key.toString());

outputValue.set(sessionId + "|" + entity.getUrl());

context.write(outputKey,outputValue);

leftTime = rightTime;

} catch (ParseException e) {

e.printStackTrace();

}

}

}

吴裕雄--天生自然HADOOP操作实验学习笔记:ETL案例的更多相关文章

  1. 吴裕雄--天生自然HADOOP操作实验学习笔记:使用hive操作hbase

    实验目的 熟悉hive和hbase的操作 熟悉hadoop.hbase.hive.zookeeper的关系 熟练大数据环境的搭建 学会分析日志排除问题 实验原理 1.hive整合hbase原理 前面大 ...

  2. 吴裕雄--天生自然HADOOP操作实验学习笔记:mapreduce代码编程

    实验目的 深入了解mapreduce的底层 了解IDEA的使用 学会通过本地和集群环境提交程序 实验原理 1.回忆mapreduce模型 前面进行了很多基础工作,本次实验是使用mapreduce的AP ...

  3. 吴裕雄--天生自然HADOOP操作实验学习笔记:分布式及RPC通信简介

    实验目的 掌握GOF设计模式的代理模式 了解掌握socket编程.java反射.动态代理 了解NIO.多线程 掌握hadoop的RPC框架使用API 实验原理 1.什么是RPC 在hadoop出现以前 ...

  4. 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase学生选课案例

    实验目的 复习hbase的shell操作和javaAPI操作 了解javaWeb项目的MVC设计 学会dao(数据库访问对象)和service层的代码编写规范 学会设计hbase表格 实验原理 前面我 ...

  5. 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase的javaAPI应用

    实验目的 进一步了解hbase的操作 熟悉使用IDEA进行java开发 熟悉hbase的javaAPI 实验原理 前面已经了解通过hbase的shell操作hbase,确实比较难以使用,另外通过hiv ...

  6. 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase的shell应用v2.0

    HRegion 当表的大小超过设置值的时候,HBase会自动地将表划分为不同的区域,每个区域包含所有行的一个子集.对用户来说,每个表是一堆数据的集合,靠主键来区分.从物理上来说,一张表被拆分成了多块, ...

  7. 吴裕雄--天生自然HADOOP操作实验学习笔记:hive DDL

    实验目的 了解hive DDL的基本格式 了解hive和hdfs的关系 学习hive在hdfs中的保存方式 学习一些典型常用的hiveDDL 实验原理 有关hive的安装和原理我们已经了解,这次实验我 ...

  8. 吴裕雄--天生自然HADOOP操作实验学习笔记:mapreduce和yarn命令

    实验目的 了解集群运行的原理 学习mapred和yarn脚本原理 学习使用Hadoop命令提交mapreduce程序 学习对mapred.yarn脚本进行基本操作 实验原理 1.hadoop的shel ...

  9. 吴裕雄--天生自然HADOOP操作实验学习笔记:hdfs简单的shell命令

    实验目的 了解bin/hadoop脚本的原理 学会使用fs shell脚本进行基本操作 学习使用hadoop shell进行简单的统计计算 实验原理 1.hadoop的shell脚本 当hadoop集 ...

  10. 吴裕雄--天生自然HADOOP操作实验学习笔记:分布式资源调度系统yarn的安装

    实验目的 复习配置hadoop初始化环境 复习配置hdfs的配置文件 学会配置hadoop的配置文件 了解yarn的原理 实验原理 1.yarn是什么 前面安装好了hdfs文件系统,我们可以根据需求进 ...

随机推荐

  1. 【PAT甲级】1093 Count PAT's (25 分)

    题意: 输入一行由大写字母'P','A','T',组成的字符串,输出一共有多少个三元组"PAT"(相对顺序为PAT即可),答案对1e9+7取模. AAAAAccepted code ...

  2. C# 动态类型 以及 脚本调用(scriptRunTime)

    在使用中让我感觉 好像 JavaScript中的 动态类型囧 先看动态类型 class Program { static void Main(string[] args) { var streamRe ...

  3. 《梳理业务的三个难点》---创业学习---训练营第二课---HHR---

    一,<开始学习> 1,融资的第一步:把业务一块一块的梳理清楚. 2,预热思考题: (1)投资人会问能做多大,天花板怎么算?你的答案可以得到大家的认同吗?(四种方法,直接引用,自顶向下,自底 ...

  4. ubuntu 16 “无法获得锁”解决方案

    强制解锁,命令 sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock

  5. Install fail! Error: EBUSY: resource busy or locked, symlink

    前些日子从github上下载了一个项目 然后放在桌面上  ,但是运行的时候 报了Install fail! Error: EBUSY: resource busy or locked, symlink ...

  6. ANSYS初始残余应力赋值

    目录 1.建模 2.划分网格并分组 3.所有节点固定约束 4.施加初始残余应力 5.结果 1.建模 建立有限元模型,采用SOLID185单元,模型尺寸0.050.050.02 材料为钢 !程序头 FI ...

  7. Java面向对象编程 -3

    this关键字 this可以算是Java里面比较复杂的关键字,因为this的使用形式约定了它的灵活性,在程序里面,使用this可以实现以下三类结构的描述: 当前类中的属性:this属性; 当前类中的方 ...

  8. vjudge Trailing Zeroes (III) (二分答案 && 数论)

    嗯... 题目链接:https://vjudge.net/contest/318956#problem/E 这道题是二分答案+数论,但首先是数论,否则你不知如何二分... 首先关于一个阶乘的结果最后会 ...

  9. 阿里云服务器安装nginx(ubantu16.04)

    下载安装包 sudo wget http://nginx.org/download/nginx-1.15.5.tar.gz 解压缩 tar zxvf nginx-1.15.5.tar.gz 打开目录 ...

  10. centos启动jar包

    不挂断运行命令,日志输出到log.txt中 nohup java -jar boot-cms-module-system-2.0.1.jar >log.txt & Linux 运行jar ...