03 模拟数据
模拟数据¶
使用说明¶
创建mock-edu项目目录¶
[zhangsan@node1 ~]$ mkdir /opt/bigdata/mock/edu/
[zhangsan@node1 ~]$ mkdir /opt/bigdata/mock/edu/log
上传文件¶
将edu-mock-data-1.0-SNAPSHOT.jar上传到/opt/bigdata/mock/edu目录下
[zhangsan@node1 edu]$ ll
-rw-rw-r--. 1 zhangsan zhangsan 33186121 Mar 18 08:25 edu-mock-data-1.0-SNAPSHOT.jar
springboot
创建application.yml文件¶
可以根据需求生成对应日期的用户行为日志。
# 外部配置打开
#logging.config: "classpath:logback.xml"
logging.config: "./logback.xml"
#业务日期
mock.date: "2026-03-17"
#模拟数据发送模式
mock.type: "log"
#mock.type: "http"
#mock.type: "kafka"
#http模式下,发送的地址
mock.url: "http://localhost:8090/applog"
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
url: jdbc:mysql://node1:3306/edu?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: "123456"
driver-class-name: com.mysql.jdbc.Driver
max-active: 200
test-on-borrow: true
mybatis-plus.global-config.db-config.field-strategy: not_null
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
mybatis:
mapper-locations: classpath:mapper/*.xml
#mock:
# kafka-server: "node1:9092,node2:9092,node3:9092"
# kafka-topic: "ODS_BASE_LOG"
# 清空
mock.clear.busi: 0
# 清空用户
mock.clear.user: 0
#是否初始化试卷
mock.if-init-paper: 0
# 生成新用户
mock.new.user: 1000
#启动次数
mock.user-session.count: 1000
#设备最大值
mock.max.mid: 1000
mock.if-realtime: 0
#访问时间分布权重
mock.start-time-weight: "10:5:0:0:0:0:5:5:5:10:10:15:20:10:10:10:10:10:20:25:30:35:30:20"
#支付类型占比 支付宝 :微信 :银联
mock.payment_type_weight: "40:50:10"
#课程最大值
mock.max.course-id: 10
#页面平均访问时间
mock.page.during-time-ms: 20000
#错误概率 百分比
mock.error.rate: 3
#每条日志发送延迟 ms
mock.log.sleep: 100
#课程详情来源 用户查询,商品推广,智能推荐, 促销活动
mock.detail.source-type-rate: "40:25:15:20"
#领取购物券概率
mock.if_get_coupon_rate: 75
#优惠券最大id
mock.max.coupon-id: 3
#搜索关键词
mock.search.keyword: "java,python,多线程,前端,数据库,大数据,hadoop,flink"
#男性比例
mock.user.male-rate: 20
#用户数据变化概率
mock.user.update-rate: 20
# 男女浏览商品比重(35sku)
mock.course-weight.male: "10:10:10:10:10:10:10:5:5:5:5:5:10:10:10:10:12:12:12:12:12:5:5:5:5:3:3:3:3:3:3:3:3:10:10"
mock.course-weight.female: "1:1:1:1:1:1:1:5:5:5:5:5:1:1:1:1:2:2:2:2:2:8:8:8:8:15:15:15:15:15:15:15:15:1:1"
创建path.json文件¶
path.json文件用来配置访问路径,根据需求,可以灵活配置用户点击路径。
{ "visit_path" : [
{"path":["start_app","home","course_list","course_detail" ,"order","payment" ,"end" ],"rate":20},
{"path":["start_app","home","course_list","course_detail" ,"order" ,"end" ],"rate":20},
{"path":["start_app","home","course_list","course_detail" ,"course_list","course_detail" ,"order" ,"end" ],"rate":20},
{"path":["start_app","home","course_list","course_detail","cart" ,"order" ,"payment" ,"end" ],"rate":20}
],
"study_path": [
{"path":["start_app","mine","course_detail","chapter_video","end" ],"rate":10},
{"path":["start_app","mine","course_detail","exam","end" ],"rate":10}
]
}
创建logback配置文件¶
可配置日志生成路径,修改内容如下
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_HOME" value="/opt/bigdata/mock/edu/log" />
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/app.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<!-- 将某一个包下日志单独打印日志 -->
<logger name="com.studybigdata.mock.util.LogUtil"
level="INFO" additivity="false">
<appender-ref ref="rollingFile" />
<appender-ref ref="console" />
</logger>
<root level="error" >
<appender-ref ref="console" />
<!-- <appender-ref ref="async-rollingFile" /> -->
</root>
</configuration>
集群日志及业务数据生成脚本¶
在node1的/home/zhangsan目录下创建bin目录,并将该目录添加到PATH环境变量,这样脚本可以在服务器的任何目录执行。
mock.sh¶
在/home/zhangsan/bin目录下创建脚本mock.sh,在脚本中编写如下内容。
#!/bin/bash
DATA_HOME=/opt/bigdata/mock/edu
#MAXWELL_HOME=/opt/bigdata/maxwell
function mock_data() {
if [ $1 ]
then
sed -i "/mock.date/s/.*/mock.date: \"$1\"/" $DATA_HOME/application.yml
echo "正在生成 $1 当日的数据"
fi
cd $DATA_HOME
nohup java -jar "edu-mock-data-1.0-SNAPSHOT.jar" >/dev/null 2>&1
}
case $1 in
"init")
[ $2 ] && do_date=$2 || do_date='2026-03-17'
sed -i "/mock.clear.busi/s/.*/mock.clear.busi: 1/" $DATA_HOME/application.yml
sed -i "/mock.clear.user/s/.*/mock.clear.user: 1/" $DATA_HOME/application.yml
mock_data $(date -d "$do_date -5 days" +%F)
sed -i "/mock.clear.busi/s/.*/mock.clear.busi: 0/" $DATA_HOME/application.yml
sed -i "/mock.clear.user/s/.*/mock.clear.user: 0/" $DATA_HOME/application.yml
for ((i=4;i>=0;i--));
do
mock_data $(date -d "$do_date -$i days" +%F)
done
;;
[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9])
# sed -i "/mock_date/s/.*/mock_date=$1/" $MAXWELL_HOME/config.properties
# mxw.sh restart
sleep 1
mock_data $1
;;
esac
注:
-
DATA_HOME变量为jar包及配置文件所在路径
-
/dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”。
-
标准输入0:从键盘获得输入 /proc/self/fd/0
-
标准输出1:输出到屏幕(即控制台) /proc/self/fd/1
-
错误输出2:输出到屏幕(即控制台) /proc/self/fd/2
修改脚本执行权限¶
测试脚本¶
生成指定日期及前5天的数据。
[zhangsan@node1 edu]$ mock.sh init 2026-03-22
正在生成 2026-03-17 当日的数据
正在生成 2026-03-18 当日的数据
正在生成 2026-03-19 当日的数据
正在生成 2026-03-20 当日的数据
正在生成 2026-03-21 当日的数据
正在生成 2026-03-22 当日的数据
查看生成的数据¶
日志数据¶
在node1的/opt/bigdata/mock/edu/log目录上查看生成的数据