吴裕雄--天生自然HADOOP操作实验学习笔记:ETL案例
实验目的
熟悉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案例的更多相关文章
- 吴裕雄--天生自然HADOOP操作实验学习笔记:使用hive操作hbase
实验目的 熟悉hive和hbase的操作 熟悉hadoop.hbase.hive.zookeeper的关系 熟练大数据环境的搭建 学会分析日志排除问题 实验原理 1.hive整合hbase原理 前面大 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:mapreduce代码编程
实验目的 深入了解mapreduce的底层 了解IDEA的使用 学会通过本地和集群环境提交程序 实验原理 1.回忆mapreduce模型 前面进行了很多基础工作,本次实验是使用mapreduce的AP ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:分布式及RPC通信简介
实验目的 掌握GOF设计模式的代理模式 了解掌握socket编程.java反射.动态代理 了解NIO.多线程 掌握hadoop的RPC框架使用API 实验原理 1.什么是RPC 在hadoop出现以前 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase学生选课案例
实验目的 复习hbase的shell操作和javaAPI操作 了解javaWeb项目的MVC设计 学会dao(数据库访问对象)和service层的代码编写规范 学会设计hbase表格 实验原理 前面我 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase的javaAPI应用
实验目的 进一步了解hbase的操作 熟悉使用IDEA进行java开发 熟悉hbase的javaAPI 实验原理 前面已经了解通过hbase的shell操作hbase,确实比较难以使用,另外通过hiv ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase的shell应用v2.0
HRegion 当表的大小超过设置值的时候,HBase会自动地将表划分为不同的区域,每个区域包含所有行的一个子集.对用户来说,每个表是一堆数据的集合,靠主键来区分.从物理上来说,一张表被拆分成了多块, ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hive DDL
实验目的 了解hive DDL的基本格式 了解hive和hdfs的关系 学习hive在hdfs中的保存方式 学习一些典型常用的hiveDDL 实验原理 有关hive的安装和原理我们已经了解,这次实验我 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:mapreduce和yarn命令
实验目的 了解集群运行的原理 学习mapred和yarn脚本原理 学习使用Hadoop命令提交mapreduce程序 学习对mapred.yarn脚本进行基本操作 实验原理 1.hadoop的shel ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hdfs简单的shell命令
实验目的 了解bin/hadoop脚本的原理 学会使用fs shell脚本进行基本操作 学习使用hadoop shell进行简单的统计计算 实验原理 1.hadoop的shell脚本 当hadoop集 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:分布式资源调度系统yarn的安装
实验目的 复习配置hadoop初始化环境 复习配置hdfs的配置文件 学会配置hadoop的配置文件 了解yarn的原理 实验原理 1.yarn是什么 前面安装好了hdfs文件系统,我们可以根据需求进 ...
随机推荐
- js将相除结果百分比 ,四舍五入函数 toFixed()
function percentNum(num, num2) { return (Math.round(num / num2 * 10000) / 100.00 + "%"); } ...
- 【PAT甲级】1101 Quick Sort (25 分)
题意: 输入一个正整数N(<=1e5),接着输入一行N个各不相同的正整数.输出可以作为快速排序枢纽点的个数并升序输出这些点的值. trick: 测试点2格式错误原因:当答案为0时,需要换行两次
- 洛谷 P1464 Function(简单记忆化)
嗯... 让一切从水开始吧... 水过初赛,但愿复赛能够接着水过... 这道题不记忆化会tle,所以用空间换时间,将每次的答案(只有20*20*20个)存下来,如果之前已经求过,就不需要重复求了... ...
- jQuery之绑定焦点事件(焦点事件失效)
在使用jQuery绑定事件时,若某个事件不存在,则该事件后 绑定的事件均失效: 如图所示,若失去焦点事件checkEmail不存在, 会导致后面的事件checkMobile,和事件checkBirth ...
- No module named '_ctypes'
3.7版本需要一个新的包libffi-devel,安装此包之后再次进行编译安装即可. #yum install libffi-devel -y #make install 若在安装前移除了/usr/b ...
- 解决 IDEA 下 struts.xml 中 extends="struts-default" 报红的问题
现象 在IDEA中配置struts.xml时 extends="struts-default" 报红,配置拦截器时属性无预选项提示,也爆红. struts.xml本身的配置并没有错 ...
- Fluent_Python_Part4面向对象,11-iface-abc,协议(接口),抽象基类
第四部分第11章,接口:从协议到抽象基类(重点讲抽象基类) 接口就是实现特定角色的方法集合. 严格来说,协议是非正式的接口(只由文档约束),正式接口会施加限制(抽象基类对接口一致性的强制). 在Pyt ...
- 每个JavaScript开发人员应该知道的33个概念
每个JavaScript开发人员应该知道的33个概念 介绍 创建此存储库的目的是帮助开发人员在JavaScript中掌握他们的概念.这不是一项要求,而是未来研究的指南.它基于Stephen Curti ...
- ZOJ4104 Sequence in the Pocket(2019浙江省赛)
思维~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; int b[maxn]; int N; int main ( ...
- Oracle字符集查询及修改
字符集包括以下四种: 1.oracle服务端字符集 select * from nls_database_parameters; 2.oracle服务器注册字符集 HKEY_LOCAL_MACHINE ...