做微商有卖鞋子的网站吗,制作网页心得体会,大型外包公司有哪些,seo的优化原理文章目录 数据仓库概念项目需求及架构设计项目需求分析系统数据流程设计框架版本选型集群规模估算集群资源规划设计 数据生成模块目标数据页面事件曝光启动播放错误 数据埋点主流埋点方式#xff08;了解#xff09;埋点数据上报时机埋点数据日志结构 服务器和JDK准备服务器准… 文章目录 数据仓库概念项目需求及架构设计项目需求分析系统数据流程设计框架版本选型集群规模估算集群资源规划设计 数据生成模块目标数据页面事件曝光启动播放错误 数据埋点主流埋点方式了解埋点数据上报时机埋点数据日志结构 服务器和JDK准备服务器准备编写集群分发脚本xsyncSSH无密登录配置JDK准备环境变量配置说明登录Shell和非登录Shell的区别 模拟数据使用说明集群日志及业务数据生成脚本 数据仓库概念
数据仓库 Data Warehouse 是为企业制定决策提供数据支持的。可以帮助企业改进业务流程、提高产品质量等。
数据仓库的输入数据通常包括业务数据、用户行为数据和爬虫数据等
业务数据就是各行业在处理事务过程中产生的数据。比如用户在网站中登录、下单、支付等过程中需要和网站后台数据库进行增删改查交互产生的数据就是业务数据。业务数据通常存储在MySQL、Oracle等数据库中。
用户行为数据用户在使用产品过程中通过埋点收集与客户端产品交互过程中产生的数据并发往日志服务器进行保存。比如页面浏览、点击、停留、评论、点赞、收藏等。用户行为数据通常存储在日志文件中。
爬虫数据通常是通过技术手段获取其他公司网站的数据。
项目需求及架构设计
项目需求分析
1采集平台 1用户行为数据采集平台搭建 2业务数据采集平台搭建
2离线需求 3实时需求
系统数据流程设计 框架版本选型 集群规模估算 集群资源规划设计
下面是根据您提供的信息转换成的Markdown表格
服务名称子服务hadoop102hadoop103hadoop104hadoop102服务器√--hadoop103服务器-√-hadoop104服务器---HDFSNameNode√--HDFSDataNode√√√HDFSSecondaryNameNode--√YarnNodeManager√√√YarnResourcemanager-√-ZookeeperZookeeper Server√√√Flume采集日志Flume√√-KafkaKafka√√√Flume消费Kafka日志Flume--√Flume消费Kafka业务Flume--√Hive√√√MySQLMySQL√--DataX√√√Spark√√√DolphinSchedulerApiApplicationServer√--DolphinSchedulerAlertServer√--DolphinSchedulerMasterServer√--DolphinSchedulerWorkerServer√√√DolphinSchedulerLoggerServer√√√SupersetSuperset√--服务数总计161112
数据生成模块
目标数据
我们要收集和分析的数据主要包括页面数据、事件数据、曝光数据、启动数据、播放数据和错误数据。
页面
页面数据主要记录一个页面的用户访问情况包括访问时间、停留时间、页面路径等信息。
1日志范例如下
{actions: [
…],common: {
…},displays: […],page: {during_time: 11622,item: 57,item_type: course_id,last_page_id: course_list,page_id: course_detail},ts: 1645529967261
}2所有页面类型如下
home(首页)
course_list(列表页)
course_detail(商品详情)
chapter_video(章节视频)
cart(购物车)
order(下单结算)
payment(支付页面)
exam(考试)
mine(我的)3所有页面对象类型如下
course_id(课程Id)
keyword(搜索关键词)
video_id(视频id)
chapter_id(章节id)
coupon_id(购物券id)
order_id(订单id)
paper_id(考卷id)
exam_id(考试id)事件
事件数据主要记录应用内一个具体操作行为包括操作类型、操作对象、操作对象描述等信息。
1日志范例
{actions: [{action_id: favor_add,item: 57,item_type: course_id,ts: 1645529967261},{action_id: cart_add,item: 57,item_type: course_id,ts: 1645529967261}],common: {
…},displays: [
…],page: {
…},ts: 1645529967261
}注对于下单、支付等业务数据可从业务数据库获取。
2所有动作类型如下
favor_add新增收藏
review_add新增课程评价
comment_add新增章节评价
cart_add加购物车3所有动作目标类型如下
course_id(课程Id)
keyword(搜索关键词)
video_id(视频id)
chapter_id(章节id)
coupon_id(购物券id)
order_id(订单id)
paper_id(考卷id)
exam_id(考试id)曝光
曝光数据主要记录页面所展示的内容包括曝光对象曝光类型等信息。
1曝光日志范例
{actions: […],common: {…},displays: [{display_type: query,item: 6,item_type: course_id,order: 1,pos_id: 4},{display_type: query,item: 8,item_type: course_id,order: 2,pos_id: 5},{display_type: query,item: 1,item_type: course_id,order: 3,pos_id: 4},{display_type: query,item: 10,item_type: course_id,order: 4,pos_id: 1},{display_type: promotion,item: 4,item_type: course_id,order: 5,pos_id: 4},{display_type: promotion,item: 4,item_type: course_id,order: 6,pos_id: 4},{display_type: query,item: 9,item_type: course_id,order: 7,pos_id: 1}],page: {…},ts: 1645529967261
}2所有曝光类型如下
promotion(商品推广)
recommend(算法推荐商品)
query(查询结果商品)
activity(促销活动)3所有曝光对象类型如下
course_id(课程Id)
keyword(搜索关键词)
video_id(视频id)
chapter_id(章节id)
coupon_id(购物券id)
order_id(订单id)
paper_id(考卷id)
exam_id(考试id)启动
启动数据记录应用的启动信息。
1启动日志范例:
{common: {…},start: {entry: notice,first_open: 0,loading_time: 17970,open_ad_id: 20,open_ad_ms: 2876,open_ad_skip_ms: 0},ts: 1645532980257
}2所有启动入口类型如下
icon(图标),
notice(通知),
install(安装后启动);播放
播放日志记录播放信息。
1播放日志范例
{appVideo: {play_sec: 19,video_id: 3904},common: {
…},ts: 1645526307119
}错误
错误数据记录应用使用过程中的错误信息包括错误编号及错误信息。
上述五种日志都有可能包含错误信息此处仅对 appVideo 的错误日志进行展示。
1错误日志范例
{appVideo:{…},common:{…},err:{error_code:3485,msg: Exception in thread \\ java.net.SocketTimeoutException\\n \\tat com.yudan.edu2021.mock.log.AppError.main(AppError.java:xxxxxx)},ts:1645538276217
}数据埋点
主流埋点方式了解
目前主流的埋点方式有代码埋点前端/后端、可视化埋点、全埋点三种。
代码埋点是通过调用埋点SDK函数在需要埋点的业务逻辑功能位置调用接口上报埋点数据。例如我们对页面中的某个按钮埋点后当这个按钮被点击时可以在这个按钮对应的 OnClick 函数里面调用SDK提供的数据发送接口来发送数据。可视化埋点只需要研发人员集成采集 SDK不需要写埋点代码业务人员就可以通过访问分析平台的“圈选”功能来“圈”出需要对用户行为进行捕捉的控件并对该事件进行命名。圈选完毕后这些配置会同步到各个用户的终端上由采集 SDK 按照圈选的配置自动进行用户行为数据的采集和发送。全埋点是通过在产品中嵌入SDK前端自动采集页面上的全部用户行为事件上报埋点数据相当于做了一个统一的埋点。然后再通过界面配置哪些数据需要在系统里面进行分析。
埋点数据上报时机
埋点数据上报时机包括两种方式。
方式一在离开该页面时上传在这个页面产生的所有数据页面、事件、曝光、错误等。优点批处理减少了服务器接收数据压力。缺点不是特别及时。
方式二每个事件、动作、错误等产生后立即发送。优点响应及时。缺点对服务器接收数据压力比较大。
埋点数据日志结构
我们的日志结构大致可分为三类一是普通页面埋点日志二是启动日志三是播放日志。
普通页面日志结构如下每条日志包含了当前页面的页面信息所有事件动作、所有曝光信息以及错误信息。除此之外还包含了一系列公共信息包括设备信息地理位置应用信息等即下边的common字段。
1普通页面埋点日志格式
{actions: [{action_id: favor_add,item: 57,item_type: course_id,ts: 1645529967261},{action_id: cart_add,item: 57,item_type: course_id,ts: 1645529967261}],common: {ar: 16,ba: iPhone,ch: Appstore,is_new: 1,--是否首日使用首次使用的当日该字段值为1过了24:00该字段置为0。md: iPhone 8,mid: mid_161,os: iOS 13.3.1,sc: 2,sid: 9acef85b-067d-49f9-9520-a0dda943304e,uid: 272,vc: v2.1.134},displays: [{display_type: query,item: 6,item_type: course_id,order: 1,pos_id: 4},{display_type: query,item: 8,item_type: course_id,order: 2,pos_id: 5},{display_type: query,item: 1,item_type: course_id,order: 3,pos_id: 4},{display_type: query,item: 10,item_type: course_id,order: 4,pos_id: 1},{display_type: promotion,item: 4,item_type: course_id,order: 5,pos_id: 4},{display_type: promotion,item: 4,item_type: course_id,order: 6,pos_id: 4},{display_type: query,item: 9,item_type: course_id,order: 7,pos_id: 1}],page: {during_time: 11622,item: 57,item_type: course_id,last_page_id: course_list,page_id: course_detail},err:{error_code:1359,msg: Exception in thread \\ java.net.SocketTimeoutException\\n \\tat com.yudan.edu2021.mock.log.AppError.main(AppError.java:xxxxxx)},ts: 1645529967261
}2启动日志格式
启动日志结构相对简单主要包含公共信息启动信息和错误信息。
{common: {ar: 1,ba: Redmi,ch: wandoujia,is_new: 1,md: Redmi k30,mid: mid_356,os: Android 11.0,sc: 2,sid: 76909678-abaf-41c4-916d-a0a72f546bc1,uid: 161,vc: v2.1.134},start: {entry: notice,first_open: 0,loading_time: 17970,open_ad_id: 20,open_ad_ms: 2876,open_ad_skip_ms: 0},err:{error_code:2959,msg: Exception in thread \\ java.net.SocketTimeoutException\\n \\tat com.yudan.edu2021.mock.log.AppError.main(AppError.java:xxxxxx)},ts: 1645532980257
}3播放日志
播放日志结构相对简单主要包含公共信息播放信息和错误信息。
{appVideo: {play_sec: 19,video_id: 3904},common: {ar: 4,ba: Sumsung,ch: oppo,is_new: 0,md: Sumsung Galaxy S20,mid: mid_253,os: Android 11.0,sc: 1,sid: 47157c4a-4790-4b9a-a859-f0d36cd62a10,uid: 329,vc: v2.1.134},err:{error_code:3485,msg: Exception in thread \\ java.net.SocketTimeoutException\\n \\tat com.yudan.edu2021.mock.log.AppError.main(AppError.java:xxxxxx)},ts: 1645526307119
}服务器和JDK准备
服务器准备
安装如下文档配置步骤分别安装hadoop102、hadoop103、hadoop104三台主机。 具体配置链接
编写集群分发脚本xsync
1xsync集群分发脚本 需求循环复制文件到所有节点的相同目录下 需求分析 ①rsync命令原始拷贝 rsync -av /opt/module roothadoop103:/opt/ ②期望脚本 xsync要同步的文件名称 ③说明在/home/yudan/bin这个目录下存放的脚本atguigu用户可以在系统任何地方直接执行。 脚本实现 ①在用的家目录/home/atguigu下创建bin文件夹 [yudanhadoop102 ~]$ mkdir bin②在/home/yudan/bin目录下创建xsync文件以便全局调用 [yudanhadoop102 ~]$ cd /home/yudan/bin[yudanhadoop102 ~]$ vim xsync#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
thenecho Not Enough Arguement!exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
doecho $host #3. 遍历所有目录挨个发送for file in $do#4 判断文件是否存在if [ -e $file ]then#5. 获取父目录pdir$(cd -P $(dirname $file); pwd)#6. 获取当前文件的名称fname$(basename $file)ssh $host mkdir -p $pdirrsync -av $pdir/$fname $host:$pdirelseecho $file does not exists!fidone
done③修改脚本xsync具有执行权限 [yudanhadoop102 bin]$ chmod x xsync④测试脚本 [yudanhadoop102 bin]$ xsync xsyncSSH无密登录配置 hadoop102上生成公钥和私钥 [yudanhadoop102 .ssh]$ ssh-keygen -t rsa然后敲三个回车就会生成两个文件id_rsa私钥、id_rsa.pub公钥 将hadoop102公钥拷贝到要免密登录的目标机器上 [yudanhadoop102 .ssh]$ ssh-copy-id hadoop102[yudanhadoop102 .ssh]$ ssh-copy-id hadoop103[yudanhadoop102 .ssh]$ ssh-copy-id hadoop104hadoop103上生成公钥和私钥 [yudanhadoop103 .ssh]$ ssh-keygen -t rsa然后敲三个回车就会生成两个文件id_rsa私钥、id_rsa.pub公钥 将hadoop103公钥拷贝到要免密登录的目标机器上 [yudanhadoop103 .ssh]$ ssh-copy-id hadoop102[yudanhadoop103 .ssh]$ ssh-copy-id hadoop103[yudanhadoop103 .ssh]$ ssh-copy-id hadoop104hadoop104上生成公钥和私钥 [yudanhadoop104 .ssh]$ ssh-keygen -t rsa然后敲三个回车就会生成两个文件id_rsa私钥、id_rsa.pub公钥 将hadoop104公钥拷贝到要免密登录的目标机器上 [yudanhadoop102 .ssh]$ ssh-copy-id hadoop102[yudanhadoop103 .ssh]$ ssh-copy-id hadoop103[yudanhadoop104 .ssh]$ ssh-copy-id hadoop104JDK准备 卸载现有JDK3台节点 [yudanhadoop102 opt]# sudo rpm -qa | grep -i java | xargs -n1 sudo rpm -e --nodeps[yudanhadoop103 opt]# sudo rpm -qa | grep -i java | xargs -n1 sudo rpm -e --nodeps[yudanhadoop104 opt]# sudo rpm -qa | grep -i java | xargs -n1 sudo rpm -e --nodeps1rpm -qa表示查询所有已经安装的软件包 2grep -i表示过滤时不区分大小写 3xargs -n1表示一次获取上次执行结果的一个值 4rpm -e --nodeps表示卸载软件 将JDK导入到hadoop102的/opt/software文件夹下面 JDK安装包 链接: https://pan.baidu.com/s/1-bY0-GN85TJRhp-levcoSg?pwd8ah6 提取码: 8ah6 在Linux系统下的opt目录中查看软件包是否导入成功 [yudanhadoop102 software]# ls /opt/software/看到如下结果jdk-8u212-linux-x64.tar.gz解压JDK到/opt/module目录下 [yudanhadoop102 software]# tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/配置JDK环境变量 新建/etc/profile.d/my_env.sh文件 [yudanhadoop102 module]# sudo vim /etc/profile.d/my_env.sh#JAVA_HOMEexport JAVA_HOME/opt/module/jdk1.8.0_212export PATH$PATH:$JAVA_HOME/bin让环境变量生效 [yudanhadoop102 software]$ source /etc/profile.d/my_env.sh测试JDK是否安装成功 [yudanhadoop102 module]# java -version如果能看到以下结果、则Java正常安装java version 1.8.0_212分发JDK [yudanhadoop102 module]$ xsync /opt/module/jdk1.8.0_212/分发环境变量配置文件 [yudanhadoop102 module]$ sudo /home/yudan/bin/xsync /etc/profile.d/my_env.sh 分别在hadoop103、hadoop104上执行source [yudanhadoop103 module]$ source /etc/profile.d/my_env.sh[yudanhadoop104 module]$ source /etc/profile.d/my_env.sh环境变量配置说明
Linux的环境变量可在多个文件中配置如/etc/profile/etc/profile.d/*.sh/.bashrc/.bash_profile等下面说明上述几个文件之间的关系和区别。
bash的运行模式可分为login shell和non-login shell。
例如我们通过终端输入用户名、密码登录系统之后得到就是一个login shell。而当我们执行以下命令ssh hadoop103 command在hadoop103执行command的就是一个non-login shell。
登录Shell和非登录Shell的区别 这两种shell的主要区别在于它们启动时会加载不同的配置文件login shell启动时会加载/etc/profile/.bash_profile/.bashrc。non-login shell启动时会加载~/.bashrc。
模拟数据
使用说明
模拟数据生成文件地址 链接: https://pan.baidu.com/s/1ZYFLlkhI4JqvzugvySs_Sg 提取码: k93s 将application.yml、edu2021-mock-2022-06-18.jar、path.json、edu0222.sql、logback.xml上传到hadoop102的/opt/module/data_mocker目录下 创建applog路径 [yudanhadoop102 module]$ mkdir /opt/module/data_mocker需要安装配置MySQL MySQL安装包 链接: https://pan.baidu.com/s/1Yov8DpOPaji58Axzp6VDWA?pwdus87 提取码: us87 1将MySQL安装文件拷贝到/opt/software 01_mysql-community-common-5.7.16-1.el7.x86_64.rpm02_mysql-community-libs-5.7.16-1.el7.x86_64.rpm03_mysql-community-libs-compat-5.7.16-1.el7.x86_64.rpm04_mysql-community-client-5.7.16-1.el7.x86_64.rpm05_mysql-community-server-5.7.16-1.el7.x86_64.rpmmysql-connector-java-5.1.27-bin.jar2卸载自带的Mysql-libs如果之前安装过MySQL要全都卸载掉 [yudanhadoop102 software]$ rpm -qa | grep -i -E mysql\|mariadb | xargs -n1 sudo rpm -e --nodeps3安装 MySQL 依赖 [yudanhadoop102 software]$ sudo rpm -ivh 01_mysql-community-common-5.7.16-1.el7.x86_64.rpm[yudanhadoop102 software]$ sudo rpm -ivh 02_mysql-community-libs-5.7.16-1.el7.x86_64.rpm[yudanhadoop102 software]$ sudo rpm -ivh 03_mysql-community-libs-compat-5.7.16-1.el7.x86_64.rpm4安装 mysql-client [yudanhadoop102 software]$ sudo rpm -ivh 04_mysql-community-client-5.7.16-1.el7.x86_64.rpm5安装 mysql-server [yudanhadoop102 software]$ sudo rpm -ivh 05_mysql-community-server-5.7.16-1.el7.x86_64.rpm注意如果报如下错误这是由于yum安装了旧版本的GPG keys所造成从rpm版本4.1后在安装或升级软件包时会自动检查软件包的签名。 warning: 05_mysql-community-server-5.7.16-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEYerror: Failed dependencies:libaio.so.1()(64bit) is needed by mysql-community-server-5.7.16-1.el7.x86_64解决办法[yudanhadoop102 software]$ sudo rpm -ivh 05_mysql-community-server-5.7.16-1.el7.x86_64.rpm --force --nodeps6启动 MySQL [yudanhadoop102 software]$ sudo systemctl start mysqld7查看 MySQL 密码 [yudanhadoop102 software]$ sudo cat /var/log/mysqld.log | grep password8配置只要是root用户 密码在任何主机上都能登录MySQL数据库。 i用刚刚查到的密码进入MySQL如果报错给密码加单引号[yudanhadoop102 software]$ mysql -uroot -ppasswordii设置复杂密码由于MySQL密码策略此密码必须足够复杂mysql set passwordpassword(Qs23zs32);iii更改MySQL密码策略mysql set global validate_password_length4;mysql set global validate_password_policy0;iv设置简单好记的密码mysql set passwordpassword(000000);v进入MySQL库mysql use mysqlvi查询user表mysql select user, host from user;vii修改user表把Host表内容修改为%mysql update user set host% where userroot;viii刷新mysql flush privileges;ix退出mysql quit;需要安装配置MySQL sql文件地址 通过网盘分享的文件edu.sql 链接: https://pan.baidu.com/s/1gQ3z-boyI7aSaPC8t2Yz3A?pwdfyxm 提取码: fyxm
1登录Navicat等连接MySQL工具创建数据库edu
2在数据库edu下运行edu.sql文件
集群日志及业务数据生成脚本
在hadoop102的/home/atguigu目录下创建bin目录这样脚本可以在服务器的任何目录执行。
[yudanhadoop102 ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/yudan/.local/bin:/home/yudan/bin1在/home/yudan/bin目录下创建脚本mock.sh
[yudanhadoop102 bin]$ vim mock.sh2在脚本中编写如下内容
#! /bin/bash
ssh hadoop102 cd /opt/module/data_mocker/;java -jar edu2021-mock-2022-06-18.jar 1/dev/null 21 3修改脚本执行权限
[yudanhadoop102 bin]$ chmod x mock.sh4测试脚本
[yudanhadoop102 module]$ mock.sh5在hadoop102的/opt/module/data_mocker/log目录上查看生成的数据
[yudanhadoop102 log]$ ls
app.log