课程内容

本文链接:

张丹博客 http://www.fens.me
用Maven构建Hadoop项目 http://blog.fens.me/hadoop-maven-eclipse/
程序源代码下载:https://github.com/bsspirit/maven_hadoop_template/releases/tag/kpi_v1
Flume部署:  http://blog.csdn.net/zhouleilei/article/details/8568147  周雷雷博客
Chukwa部署: 详情见陆嘉恒书第415页

关于张丹

骨灰级程序员, 大数据创业者
DataguruID: bsspirit
Weibo: @Conan_Z
Blog:http://blog.fens.me
Email: bsspirit@gmail.com

项目背景:Web日志分析
需求分析:KPI指标
架构设计:日志分析系统架构
算法模型:Map-Reduce并行算法
程序开发:
            –用Maven构建Hadoop项目
            –MapReduce程序实现

Web日志由Web服务器产生,可能是Nginx, Apache, Tomcat等。

从Web日志中,我们可以获取网站每个页面的PV值(PageView,页面访问量)、独立IP数;
稍微复杂一些的,可以计算得出用户所检索的关键词排行榜、用户停留时间最高的页面等;
更复杂的,构建广告点击模型、分析用户行为特征等等。

项目背景: Nginx日志

Web日志中,每条日志通常代表着用户的一次访问行为
例如: 下面就是一条nginx日志
222.68.172.190 - - [18/Sep/2013:06:49:57 +0000] "GET /images/my.jpg HTTP/1.1" 200 19939 "http://www.angularjs.cn/A00n" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36"

流行网站分析工具

1.Webtrends
2.Google分析
3.百度统计

项目背景:少量数据的情况

少量数据的情况(10Mb,100Mb,10G),在单机处理尚能忍受的时候,我可以直接利用各种Unix/Linux工具,awk、grep、sort、join等都是日志分析的利器,再配合perl, python,正则表达式,基本就可以解决所有的问题。
例如,从nginx日志中得到访问量最高前5个IP,实现很简单:

~ cat access.log.10 | awk '{a[$1]++} END {for(b in a) print b"\t"a[b]}' | sort -k2 -r | head -n 5

项目背景: 海量数据的情况

当数据量每天以10G、100G增长的时候,单机处理能力已经不能满足需求。我们就需要增加系统的复杂性,用计算机集群,存储阵列来解决。

在Hadoop出现之前,海量数据存储,和海量日志分析都是非常困难的。只有少数一些公司,掌握着高效的并行计算,分步式计算,分步式存储的核心技术。
Hadoop的出现,大幅度的降低了海量数据处理的门槛,让小公司甚至是个人都能力,搞定海量数据。并且,Hadoop非常适用于日志分析系统。

分布式日志的收集

1.脚本方案
2.Flume
3.Chukwa

架构设计:应用系统及日志系统架构

左边: Application业务系统
右边: Hadoop的HDFS, MapReduce。

架构设计:应用系统及日志系统架构

日志是由业务系统产生的,我们可以设置web服务器每天产生一个新的目录,目录下面会产生多个日志文件,每个日志文件64M。
设置系统定时器CRON,夜间在0点后,向HDFS导入昨天的日志文件。
完成导入后,设置系统定时器,启动MapReduce程序,提取并计算统计指标。
完成计算后,设置系统定时器,从HDFS导出统计指标数据到数据库,方便以后的即使查询。

架构设计:数据流

Flume

Cloudera提供的分布式、可靠、和高可用的海量日志采集、聚合和传输的系统
Flume提供了从console(控制台)、RPC(Thrift-RPC)、text(文件)、tail(UNIX tail)、syslog(syslog日志系统,支持TCP和UDP等2种模式),exec(命令执行)等数据源上收集数据的能力。同时,Flume的数据接受方,可以是console(控制台)、text(文件)、dfs(HDFS文件)、RPC(Thrift-RPC)和syslogTCP(TCP syslog日志系统)等。

体系架构

data flow描述了数据从产生,传输、处理并最终写入目标的一条路径(图中的实线)。
Agent用于采集数据,是flume中产生数据流的地方,将产生的数据流传输到collector。
collector用于对数据进行聚合,往往会产生一个更大的流。
收集数据有2种主要工作模式,如下: Push Sources:外部系统会主动地将数据推送到Flume中。 Polling Sources:Flume到外部系统中获取数据。

Flume Master

用于管理数据流的配置

部署详情见:http://blog.csdn.net/zhouleilei/article/details/8568147          周雷雷博客

Chukwa

在印度神话中Chukwa是一只最古老的龟。它支撑着世界。在它的背上还支撑着一种叫做Maha-Pudma的大象,在大象的背上顶着这个地球。呵呵,大 象?Hadoop?不难理解为什么在Hadoop中的这个子项目叫做Chukwa了,或许Chukwa的其中一位开发者是印度人?呵呵,我瞎猜的,神话中 的Chukwa的,貌似是这样

架构图

部署Chukwa:详情见陆嘉恒书第415页

需求分析:案例介绍

某电子商务网站,在线团购业务。每日PV数100w,独立IP数5w。用户通常在工作日上午10:00-12:00和下午15:00-18:00访问量最大。日间主要是通过PC端浏览器访问,休息日及夜间通过移动设备访问较多。网站搜索浏量占整个网站的80%,PC用户不足1%的用户会消费,移动用户有5%会消费。

通过简短的描述,我们可以粗略地看出,这家电商网站的经营状况,并认识到愿意消费的用户从哪里来,有哪些潜在的用户可以挖掘,网站是否存在倒闭风险等。

需求分析: KPI指标设计

PV(PageView): 页面访问量统计
IP: 页面独立IP的访问量统计
Time: 用户每小时PV的统计
Source: 用户来源域名的统计
Browser: 用户的访问设备统计

注:商业保密限制,无法提供电商网站的日志。 下面的内容,将以我的个人网站为例提取数据进行分析, http://www.fens.me  张丹博客

需求分析: 电商网站VS个人网站

从商业的角度,个人网站的特征与电商网站不太一样,没有转化率,同时跳出率也比较高。
从技术的角度,同样都关注KPI指标设计。
–PV, IP, 转化率, 跳出率, 在线时长, 来源网站,来源域名,外部链接
–搜索流量,搜索关键词
–入口页面,跳出页面,受访页面
–访客男女,访客年龄,访客位置
–使用设置,操作系统,浏览器,爬虫,RSS阅读器

拆解为8个变量

remote_addr: 记录客户端的ip地址, 222.68.172.190
remote_user: 记录客户端用户名称, –
time_local: 记录访问时间与时区, [18/Sep/2013:06:49:57 +0000]
request: 记录请求的url与http协议, “GET /images/my.jpg HTTP/1.1″
status: 记录请求状态,成功是200, 200
body_bytes_sent: 记录发送给客户端文件主体内容大小, 19939
http_referer: 用来记录从那个页面链接访问过来的, “http://www.angularjs.cn/A00n”
http_user_agent: 记录客户浏览器的相关信息, “Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36″

算法模型: 并行算法 1

PV(PageView): 页面访问量统计
–Map: {key:$request,value:1}
–Reduce: {key:$request,value:求和(sum)}
IP: 页面独立IP的访问量统计
–Map: {key:$request,value:$remote_addr}
–Reduce: {key:$request,value:去重再求和(sum(unique))}
Time: 用户每小时PV的统计
–Map: {key:$time_local,value:1}
–Reduce: {key:$time_local,value:求和(sum)}

算法模型: 并行算法 2

Source: 用户来源域名的统计
–Map: {key:$http_referer,value:1}
–Reduce: {key:$http_referer,value:求和(sum)}
Browser: 用户的访问设备统计
–Map: {key:$http_user_agent,value:1}
–Reduce: {key:$http_user_agent,value:求和(sum)}

程序开发: 用Maven构建Hadoop项目

开发环境
–Win7 64bit
–Java 1.6.0_45
–Maven3
–Eclipse Juno Service Release 2

Hadoop集群系统环境:
–Linux: Ubuntu 12.04.2 LTS 64bit Server
–Java: 1.6.0_29
–Hadoop: hadoop-1.0.3,单节点,IP:192.168.1.210

请参考文章:用Maven构建Hadoop项目 http://blog.fens.me/hadoop-maven-eclipse/

程序开发: 向HDFS导入日志文件

我们需要把日志文件,上传的HDFS里/user/hdfs/log_kpi/目录
参考下面的命令操作
~ hadoop fs -mkdir /user/hdfs/log_kpi
~ hadoop fs -copyFromLocal /home/conan/datafiles/access.log.10 /user/hdfs/log_kpi/

程序开发: MapReduce开发流程

对”日志行”的解析
Map函数实现
Reduce函数实现
启动程序实现

程序源代码下载:https://github.com/bsspirit/maven_hadoop_template/releases/tag/kpi_v1

Hadoop应用开发实战案例 第2周 Web日志分析项目 张丹的更多相关文章

  1. Hadoop应用开发实战案例 第2周

    比如,封面,是一网页,可以看出用户在此网页上,鼠标呈现F形状. 海量Web日志分析 用Hadoop提取KPI统计指标 更详细原文博客:http://blog.fens.me/hadoop-mapred ...

  2. Hadoop应用开发实战案例 第1周

    本课程的基础课程是,Hadoop数据分析平台课程.相信,能看我本博文的朋友,是有一定的基础了. 只是前个课程是讲解,这个课程是应用. 第一层是:数据源层,代表有生产线上的数据,比如关系型数据库orca ...

  3. 015_[小插曲]看黄老师《炼数成金Hadoop应用开发实战案例》笔记

    1.大数据金字塔结构 Data Source-->Data Warehouses/Data Marts-->data exploration-->Data Mining-->D ...

  4. Hadoop应用开发实战(flume应用开发、搜索引擎算法、Pipes、集群、PageRank算法)

    Hadoop是2013年最热门的技术之一,通过北风网robby老师<深入浅出Hadoop实战开发>.<Hadoop应用开发实战>两套课程的学习,普通Java开发人员可以在最快的 ...

  5. Hadoop企业开发场景案例,虚拟机服务器调优

    Hadoop企业开发场景案例 1 案例需求 ​ (1)需求:从1G数据中,统计每个单词出现次数.服务器3台,每台配置4G内存,4核CPU,4线程. ​ (2)需求分析: ​ 1G/128m = 8个M ...

  6. Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

    网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edisonchou/p/4458219.html 网站日志分析项目案例 ...

  7. Hadoop学习笔记—20.网站日志分析项目案例(二)数据清洗

    网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:当前页面 网站日志分析项目案例 ...

  8. Hadoop学习笔记—20.网站日志分析项目案例(三)统计分析

    网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:http://www.cnbl ...

  9. hadoop入门之海量Web日志分析 用Hadoop提取KPI统计指标

    转载自:http://blog.fens.me/hadoop-mapreduce-log-kpi/ 今天学习了这一篇博客,写得十分好,照着这篇博客敲了一遍. 发现几个问题, 一是这篇博客中采用的had ...

随机推荐

  1. JQuery 中的Show方法

    对css中 display:none的对象有用,对visibility:hidden的对象无效.

  2. 如何在uboot上实现从网络下载版本镜像并直接在内存中加载之?

    这是作者近期项目上遇到的一个需求,描述如下: 一块MT7620N的路由器单板,Flash中已存放一个版本并可以通过uboot正常加载并启动.现在需要:在uboot上电启动过程中,通过外部按键触发干涉, ...

  3. python_集合_笔记

    集合 特性: a.确定性(元素必须可以hash) b.互异性(去重) c.无序性(集合中的元素没有先后之分) 集合关系测试 交集 & jihe1.intersection(jihe2) 差集 ...

  4. python笔记6:常用模块

    模块,模块就是封装了特殊功能的代码. 模块分为三种: 自定义模块 第三方模块 内置模块 1.自定义模块 自定义模块就是自己定义的模块,如何import自定义模块,如下: (1)主程序与模块程序在同一目 ...

  5. 第二百零五节,jQuery EasyUI,Messager(消息窗口)组件

    jQuery EasyUI,Messager(消息窗口)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解 EasyUI 中 Messager(消息窗口)组件的使用方法,这个组 ...

  6. Hibernate中:不看数据库,不看XML文件,不看查询语句,怎么样能知道表结构?

    Hibernate中:不看数据库,不看XML文件,不看查询语句,怎么样能知道表结构? 解答:可以看与XML文件对应的域模型.

  7. redis 命令行 操作

    redis目前提供四种数据类型:string,list,set及zset(sorted set). * string是最简单的类型,你可以理解成与Memcached一模一个的类型,一个key对应一个v ...

  8. jquery动态调整div大小使其宽度始终为浏览器宽度

    需要设置宽度为整个浏览器宽度的div,当然我们可以使用相对布局的方式做到这一点,下面是具体实现,大家可以参考下 有时候我们需要设置宽度为整个浏览器宽度的div,当然我们可以使用相对布局的方式做到这一点 ...

  9. PostgreSql Partition + Hibernate Insert

    与Oracle不同.PostgreSQL须要手动控制分区规则触发器. 步骤一:创建分区 CREATE TABLE table_partition_1( CHECK partition_column c ...

  10. 使用Lingo增强JMS

    虽然activemq+jencks的jms轻量级解决方案已经很好地在psa中work了,尤其spring的JmsTemplate使得代码更简单,但是还是存在问题. 问题来自暑期做psa的时候,link ...