文章目录
第1章 大数据项目之电商数仓(用户行为数据采集)
第2章 项目需求
2.1 项目需求分析
2.2 项目框架
2.2.1 技术选型
2.2.2 系统架构图设计
2.2.3 系统数据流程设计
2.2.4 框架版本选型
2.2.5 服务器选型
2.2.6 集群资源规划设计
3台(16g,6,4,4)
10台
第3章 数据生成模块
3.1 埋点数据基本格式
公共字段:基本所有安卓手机都包含的字段
业务字段:埋点上报的字段,有具体的业务类型
下面就是一个示例,表示业务字段的上传。
3.2 事件日志数据
3.2.1 商品列表页(loading)
3.2.2 商品点击(display)
3.2.3 商品详情页(newsdetail)
3.2.4 广告(ad)
3.2.5 消息通知(notification)
3.2.6 用户后台活跃(active_background)
3.2.7 评论(comment)
3.2.8 收藏(favorites)
3.2.9 点赞(praise)
3.2.10 错误日志数据
3.3 启动日志数据
3.5 数据生成脚本
3.5.1 创建Maven工程
1)创建log-collector
2)创建一个包名:com.atguigu.appclient
3)在com.atguigu.appclient包下创建一个类,AppMain。
4)在pom.xml文件中添加如下内容
<!--版本号统一-->
<properties>
<slf4j.version>1.7.20</slf4j.version>
<logback.version>1.0.7</logback.version>
</properties>
<dependencies>
<!--阿里巴巴开源json解析框架-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
<!--日志生成框架-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${
slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${
logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${
logback.version}</version>
</dependency>
</dependencies>
<!--编译打包插件-->
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin </artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.atguigu.appclient.AppMain</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
在这里插入代码片
注意:com.atguigu.appclient.AppMain要和自己建的全类名一致。
3.5.2 公共字段Bean
1)创建包名:com.atguigu.bean
2)在com.atguigu.bean包下依次创建如下bean对象
package com.atguigu.bean;
/**
* 公共日志
*/
public class AppBase{
private String mid; // (String) 设备唯一标识
private String uid; // (String) 用户uid
private String vc; // (String) versionCode,程序版本号
private String vn; // (String) versionName,程序版本名
private String l; // (String) 系统语言
private String sr; // (String) 渠道号,应用从哪个渠道来的。
private String os; // (String) Android系统版本
private String ar; // (String) 区域
private String md; // (String) 手机型号
private String ba; // (String) 手机品牌
private String sv; // (String) sdkVersion
private String g; // (String) gmail
private String hw; // (String) heightXwidth,屏幕宽高
private String t; // (String) 客户端日志产生时的时间
private String nw; // (String) 网络模式
private String ln; // (double) lng经度
private String la; // (double) lat 纬度
public String getMid() {
return mid;
}
public void setMid(String mid) {
this.mid = mid;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getVc() {
return vc;
}
public void setVc(String vc) {
this.vc = vc;
}
public String getVn() {
return vn;
}
public void setVn(String vn) {
this.vn = vn;
}
public String getL() {
return l;
}
public void setL(String l) {
this.l = l;
}
public String getSr() {
return sr;
}
public void setSr(String sr) {
this.sr = sr;
}
public String getOs() {
return os;
}
public void setOs(String os) {
this.os = os;
}
public String getAr() {
return ar;
}
public void setAr(String ar) {
this.ar = ar;
}
public String getMd() {
return md;
}
public void setMd(String md) {
this.md = md;
}
public String getBa() {
return ba;
}
public void setBa(String ba) {
this.ba = ba;
}
public String getSv() {
return sv;
}
public void setSv(String sv) {
this.sv = sv;
}
public String getG() {
return g;
}
public void setG(String g) {
this.g = g;
}
public String getHw() {
return hw;
}
public void setHw(String hw) {
this.hw = hw;
}
public String getT() {
return t;
}
public void setT(String t) {
this.t = t;
}
public String getNw() {
return nw;
}
public void setNw(String nw) {
this.nw = nw;
}
public String getLn() {
return ln;
}
public void setLn(String ln) {
this.ln = ln;
}
public String getLa() {
return la;
}
public void setLa(String la) {
this.la = la;
}
}
3.5.3 启动日志Bean
package com.atguigu.bean;
/**
* 启动日志
*/
public class AppStart extends AppBase {
private String entry;//入口: push=1,widget=2,icon=3,notification=4, lockscreen_widget =5
private String open_ad_type;//开屏广告类型: 开屏原生广告=1, 开屏插屏广告=2
private String action;//状态:成功=1 失败=2
private String loading_time;//加载时长:计算下拉开始到接口返回数据的时间,(开始加载报0,加载成功或加载失败才上报时间)
private String detail;//失败码(没有则上报空)
private String extend1;//失败的message(没有则上报空)
private String en;//启动日志类型标记
public String getEntry() {
return entry;
}
public void setEntry(String entry) {
this.entry = entry;
}
public String getOpen_ad_type() {
return open_ad_type;
}
public void setOpen_ad_type(String open_ad_type) {
this.open_ad_type = open_ad_type;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public String getLoading_time() {
return loading_time;
}
public void setLoading_time(String loading_time) {
this.loading_time = loading_time;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public String getExtend1() {
return extend1;
}
public void setExtend1(String extend1) {
this.extend1 = extend1;
}
public String getEn() {
return en;
}
public void setEn(String en) {
this.en = en;
}
}
3.5.4 事件日志Bean之商品点击
package com.atguigu.bean;
/**
* 商品点击日志
*/
public class AppDisplay {
private String action;//动作:曝光商品=1,点击商品=2,
private String goodsid;//商品ID(服务端下发的ID)
private String place;//顺序(第几条商品,第一条为0,第二条为1,如此类推)
private String extend1;//曝光类型:1 - 首次曝光 2-重复曝光(没有使用)
private String category;//分类ID(服务端定义的分类ID)
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public String getGoodsid() {
return goodsid;
}
public void setGoodsid(String goodsid) {
this.goodsid = goodsid;
}
public String getPlace() {
return place;
}
public void setPlace(String place) {
this.place = place;
}
public String getExtend1() {
return extend1;
}
public void setExtend1(String extend1) {
this.extend1 = extend1;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}
3.5.5 事件日志Bean之商品详情页
package com.atguigu.bean;
/**
* 商品详情
*/
public class AppNewsDetail {
private String entry;//页面入口来源:应用首页=1、push=2、详情页相关推荐=3
private String action;//动作:开始加载=1,加载成功=2(pv),加载失败=3, 退出页面=4
private String goodsid;//商品ID(服务端下发的ID)
private String showtype;//商品样式:0、无图1、一张大图2、两张图3、三张小图4、一张小图5、一张大图两张小图 来源于详情页相关推荐的商品,上报样式都为0(因为都是左文右图)
private String news_staytime;//页面停留时长:从商品开始加载时开始计算,到用户关闭页面所用的时间。若中途用跳转到其它页面了,则暂停计时,待回到详情页时恢复计时。或中途划出的时间超过10分钟,则本次计时作废,不上报本次数据。如未加载成功退出,则报空。
private String loading_time;//加载时长:计算页面开始加载到接口返回数据的时间 (开始加载报0,加载成功或加载失败才上报时间)
private String type1;//加载失败码:把加载失败状态码报回来(报空为加载成功,没有失败)
private String category;//分类ID(服务端定义的分类ID)
public String getEntry() {
return entry;
}
public void setEntry(String entry) {
this.entry = entry;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public String getGoodsid() {
return goodsid;
}
public void setGoodsid(String goodsid) {
this.goodsid = goodsid;
}
public String getShowtype() {
return showtype;
}
public void setShowtype(String showtype) {
this.showtype = showtype;
}
public String getNews_staytime() {
return news_staytime;
}
public void setNews_staytime(String news_staytime) {
this.news_staytime = news_staytime;
}
public String getLoading_time() {
return loading_time;
}
public void setLoading_time(String loading_time) {
this.loading_time = loading_time;
}
public String getType1() {
return type1;
}
public void setType1(String type1) {
this.type1 = type1;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}
3.5.6 事件日志Bean之商品列表页
package com.atguigu.bean;
/**
* 商品列表
*/
public class AppLoading {
private String action;//动作:开始加载=1,加载成功=2,加载失败=3
private String loading_time;//加载时长:计算下拉开始到接口返回数据的时间,(开始加载报0,加载成功或加载失败才上报时间)
private String loading_way;//加载类型:1-读取缓存,2-从接口拉新数据 (加载成功才上报加载类型)
private String extend1;//扩展字段 Extend1
private String extend2;//扩展字段 Extend2
private String type;//加载类型:自动加载=1,用户下拽加载=2,底部加载=3(底部条触发点击底部提示条/点击返回顶部加载)
private String type1;//加载失败码:把加载失败状态码报回来(报空为加载成功,没有失败)
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public String getLoading_time() {
return loading_time;
}
public void setLoading_time(String loading_time) {
this.loading_time = loading_time;
}
public String getLoading_way() {
return loading_way;
}
public void setLoading_way(String loading_way) {
this.loading_way = loading_way;
}
public String getExtend1() {
return extend1;
}
public void setExtend1(String extend1) {
this.extend1 = extend1;
}
public String getExtend2() {
return extend2;
}
public void setExtend2(String extend2) {
this.extend2 = extend2;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getType1() {
return type1;
}
public void setType1(String type1) {
this.type1 = type1;
}
}
3.5.7 事件日志Bean之广告
package com.atguigu.bean;
/**
* 广告
*/
public class AppAd {
private String entry;//入口:商品列表页=1 应用首页=2 商品详情页=3
private String action;//动作: 广告展示=1 广告点击=2
private String contentType;//Type: 1 商品 2 营销活动
private String displayMills;//展示时长 毫秒数
private String itemId; //商品id
private String activityId; //营销活动id
public String getEntry() {
return entry;
}
public void setEntry(String entry) {
this.entry = entry;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public String getActivityId() {
return activityId;
}
public void setActivityId(String activityId) {
this.activityId = activityId;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public String getDisplayMills() {
return displayMills;
}
public void setDisplayMills(String displayMills) {
this.displayMills = displayMills;
}
public String getItemId() {
return itemId;
}
public void setItemId(String itemId) {
this.itemId = itemId;
}
}
3.5.8 事件日志Bean之消息通知
package com.atguigu.bean;
/**
* 消息通知日志
*/
public class AppNotification {
private String action;//动作:通知产生=1,通知弹出=2,通知点击=3,常驻通知展示(不重复上报,一天之内只报一次)=4
private String type;//通知id:预警通知=1,天气预报(早=2,晚=3),常驻=4
private String ap_time;//客户端弹出时间
private String content;//备用字段
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getAp_time() {
return ap_time;
}
public void setAp_time(String ap_time) {
this.ap_time = ap_time;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
3.5.9 错误日志 Bean
package com.atguigu.bean;
/**
* 错误日志
*/
public class AppErrorLog {
private String errorBrief; //错误摘要
private String errorDetail; //错误详情
public String getErrorBrief() {
return errorBrief;
}
public void setErrorBrief(String errorBrief) {
this.errorBrief = errorBrief;
}
public String getErrorDetail() {
return errorDetail;
}
public void setErrorDetail(String errorDetail) {
this.errorDetail = errorDetail;
}