1、打开IDEA工具创建maven工程
搭建图,如下:
搭建ok,如图所示:
项目工程依赖关系,流程图如图表示:
2、对创建好的工程jar包引入
首先,以上是父工程创建完毕后,我们需要在父工程的pom.xml文件做依赖关系,添加依赖jar文件:
<properties>
<spark.version>2.1.1</spark.version>
<scala.version>2.11.8</scala.version>
<log4j.version>1.2.17</log4j.version>
<slf4j.version>1.7.22</slf4j.version>
<fastjson.version>1.2.47</fastjson.version>
<httpclient.version>4.5.5</httpclient.version>
<httpmime.version>4.3.6</httpmime.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--此处放日志包,所有项目都要引用-->
<!-- 所有子项目的日志框架 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- 具体的日志实现 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>${httpmime.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
当项目的依赖导进来后,我们需要创建父工程的module,工程创建如图所示:
创建common子工程
common子工程创建ok,如图所示:
接着,我们需要对子工程common的pom.xml文件做依赖关系,添加依赖jar文件:
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
</dependency>
</dependencies>
当子模块common项目的依赖导进来后,我们还需在创建父工程里创建另一个子模块mock,工程创建与创建common项目一样,忽略!
子模块mock的pom.xml添加依赖文件:
<dependencies>
<dependency>
<groupId>com.study.gmall1205</groupId>
<artifactId>gmall1205-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
3、子模块mock代码编写
并在子模块mock,创建工具包与类,主要有,如图所示:
RandomDate.java
代码编写(工具类):
package com.study.gmall1205.mock.util;
import java.util.Date;
import java.util.Random;
public class RandomDate {
Long logDateTime =0L;//
int maxTimeStep=0 ;
public RandomDate (Date startDate , Date endDate, int num) {
Long avgStepTime = (endDate.getTime()- startDate.getTime())/num;
this.maxTimeStep=avgStepTime.intValue()*2;
this.logDateTime=startDate.getTime();
}
public Date getRandomDate() {
int timeStep = new Random().nextInt(maxTimeStep);
logDateTime = logDateTime+timeStep;
return new Date( logDateTime);
}
}
RandomNum.java
代码编写(工具类):
package com.study.gmall1205.mock.util;
import java.util.Random;
public class RandomNum {
public static final int getRandInt(int fromNum,int toNum){
return fromNum+ new Random().nextInt(toNum-fromNum+1);
}
}
RanOpt.java
代码编写(工具类):
package com.study.gmall1205.mock.util;
public class RanOpt<T> {
T value ;
int weight;
public RanOpt ( T value, int weight ){
this.value=value ;
this.weight=weight;
}
public T getValue() {
return value;
}
public int getWeight() {
return weight;
}
}
RandomOptionGroup.java
代码编写(工具类):
package com.study.gmall1205.mock.util;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class RandomOptionGroup<T> {
int totalWeight=0;
List<RanOpt> optList=new ArrayList();
public RandomOptionGroup(RanOpt<T>... opts) {
for (RanOpt opt : opts) {
totalWeight+=opt.getWeight();
for (int i = 0; i <opt.getWeight() ; i++) {
optList.add(opt);
}
}
}
public RanOpt<T> getRandomOpt() {
int i = new Random().nextInt(totalWeight);
return optList.get(i);
}
public static void main(String[] args) {
RanOpt[] opts= {new RanOpt("zhang3",20),new RanOpt("li4",30),new RanOpt("wang5",50)};
RandomOptionGroup randomOptionGroup = new RandomOptionGroup(opts);
for (int i = 0; i <10 ; i++) {
System.out.println(randomOptionGroup.getRandomOpt().getValue());
}
}
}
LogUploader.java
代码编写(日志发送工具):
发送到采集系统的web端口
package com.study.gmall1205.mock.util;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class LogUploader {
public static void sendLogStream(String log){
try{
//不同的日志类型对应不同的URL
URL url =new URL("http://logserver/log");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置请求方式为post
conn.setRequestMethod("POST");
//时间头用来供server进行时钟校对的
conn.setRequestProperty("clientTime",System.currentTimeMillis() + "");
//允许上传数据
conn.setDoOutput(true);
//设置请求的头信息,设置内容类型为JSON
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
System.out.println("upload" + log);
//输出流
OutputStream out = conn.getOutputStream();
out.write(("log="+log).getBytes());
out.flush();
out.close();
int code = conn.getResponseCode();
System.out.println(code);
}
catch (Exception e){
e.printStackTrace();
}
}
}
另外:
在com.study.gmall1205.mock包下创建一个类:JsonMocker ,
功能:组合startup和even两种日志,利用工具类进行发送
JsonMocker.java
代码编写:
package study.gmall20200213.mock;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import study.gmall20200213.mock.util.RanOpt;
import study.gmall20200213.mock.util.RandomDate;
import study.gmall20200213.mock.util.RandomNum;
import study.gmall20200213.mock.util.RandomOptionGroup;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
public class JsonMocker {
int startupNum = 100000;
int eventNum = 200000;
RandomDate logDateUtil = null;
RanOpt[] osOpts = {new RanOpt("ios", 3), new RanOpt("andriod", 7)};
RandomOptionGroup<String> osOptionGroup = new RandomOptionGroup(osOpts);
Date startTime = null;
Date endTime = null;
RanOpt[] areaOpts = {new RanOpt("beijing", 10),
new RanOpt("shanghai", 10), new RanOpt("guangdong", 20), new RanOpt("hebei", 5),
new RanOpt("heilongjiang", 5), new RanOpt("shandong", 5), new RanOpt("tianjin", 5),
new RanOpt("shan3xi", 5), new RanOpt("shan1xi", 5), new RanOpt("sichuan", 5)
};
RandomOptionGroup<String> areaOptionGroup = new RandomOptionGroup(areaOpts);
String appId = "gmall1205";
RanOpt[] vsOpts = {new RanOpt("1.2.0", 50), new RanOpt("1.1.2", 15),
new RanOpt("1.1.3", 30),
new RanOpt("1.1.1", 5)
};
RandomOptionGroup<String> vsOptionGroup = new RandomOptionGroup(vsOpts);
RanOpt[] eventOpts = {new RanOpt("addFavor", 10), new RanOpt("addComment", 30),
new RanOpt("addCart", 20), new RanOpt("clickItem", 40)
};
RandomOptionGroup<String> eventOptionGroup = new RandomOptionGroup(eventOpts);
RanOpt[] channelOpts = {new RanOpt("xiaomi", 10), new RanOpt("huawei", 20),
new RanOpt("wandoujia", 30), new RanOpt("360", 20), new RanOpt("tencent", 20)
, new RanOpt("baidu", 10), new RanOpt("website", 10)
};
RandomOptionGroup<String> channelOptionGroup = new RandomOptionGroup(channelOpts);
RanOpt[] quitOpts = {new RanOpt(true, 20), new RanOpt(false, 80)};
RandomOptionGroup<Boolean> isQuitGroup = new RandomOptionGroup(quitOpts);
public JsonMocker() {
}
public JsonMocker(String startTimeString, String endTimeString, int startupNum, int eventNum) {
try {
startTime = new SimpleDateFormat("yyyy-MM-dd").parse(startTimeString);
endTime = new SimpleDateFormat("yyyy-MM-dd").parse(endTimeString);
} catch (ParseException e) {
e.printStackTrace();
}
logDateUtil = new RandomDate(startTime, endTime, startupNum + eventNum);
}
String initEventLog(String startLogJson) {
/*`type` string COMMENT '日志类型',
`mid` string COMMENT '设备唯一 表示',
`uid` string COMMENT '用户标识',
`os` string COMMENT '操作系统',
`appid` string COMMENT '应用id',
`area` string COMMENT '地区' ,
`evid` string COMMENT '事件id',
`pgid` string COMMENT '当前页',
`npgid` string COMMENT '跳转页',
`itemid` string COMMENT '商品编号',
`ts` bigint COMMENT '时间',*/
JSONObject startLog = JSON.parseObject(startLogJson);
String mid = startLog.getString("mid");
String uid = startLog.getString("uid");
String os = startLog.getString("os");
String appid = this.appId;
String area = startLog.getString("area");
String evid = eventOptionGroup.getRandomOpt().getValue();
int pgid = new Random().nextInt(50) + 1;
int npgid = new Random().nextInt(50) + 1;
int itemid = new Random().nextInt(50);
// long ts= logDateUtil.getRandomDate().getTime();
JSONObject jsonObject = new JSONObject();
jsonObject.put("type", "event");
jsonObject.put("mid", mid);
jsonObject.put("uid", uid);
jsonObject.put("os", os);
jsonObject.put("appid", appid);
jsonObject.put("area", area);
jsonObject.put("evid", evid);
jsonObject.put("pgid", pgid);
jsonObject.put("npgid", npgid);
jsonObject.put("itemid", itemid);
return jsonObject.toJSONString();
}
String initStartupLog() {
/*`type` string COMMENT '日志类型',
`mid` string COMMENT '设备唯一标识',
`uid` string COMMENT '用户标识',
`os` string COMMENT '操作系统', ,
`appId` string COMMENT '应用id', ,
`vs` string COMMENT '版本号',
`ts` bigint COMMENT '启动时间', ,
`area` string COMMENT '城市' */
String mid = "mid_" + RandomNum.getRandInt(1, 500);
String uid = "" + RandomNum.getRandInt(1, 500);
String os = osOptionGroup.getRandomOpt().getValue();
String appid = this.appId;
String area = areaOptionGroup.getRandomOpt().getValue();
String vs = vsOptionGroup.getRandomOpt().getValue();
//long ts= logDateUtil.getRandomDate().getTime();
String ch = os.equals("ios") ? "appstore" : channelOptionGroup.getRandomOpt().getValue();
JSONObject jsonObject = new JSONObject();
jsonObject.put("type", "startup");
jsonObject.put("mid", mid);
jsonObject.put("uid", uid);
jsonObject.put("os", os);
jsonObject.put("appid", appid);
jsonObject.put("area", area);
jsonObject.put("ch", ch);
jsonObject.put("vs", vs);
return jsonObject.toJSONString();
}
public static void genLog() {
JsonMocker jsonMocker = new JsonMocker();
jsonMocker.startupNum = 1000000;
for (int i = 0; i < jsonMocker.startupNum; i++) {
String startupLog = jsonMocker.initStartupLog();
jsonMocker.sendLog(startupLog);
while (!jsonMocker.isQuitGroup.getRandomOpt().getValue()) {
String eventLog = jsonMocker.initEventLog(startupLog);
jsonMocker.sendLog(eventLog);
}
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void sendLog(String eventLog) {
LogUploader.sendLogStream(eventLog);
}
public static void main(String[] args) {
genLog();
}
}
4、Springboot开发,工程搭建
步骤:
点击父工程创建一个子模块(Springboot)
Springoot搭建ok,如图所示
主程序类可以跑: