实验环境
eclipse
spark-2.1.1-bin-hadoop2.7
VMware Workstation
Ubuntu 16.04
实验内容
处于网络时代的我们,随着 O2O 的营销模式的流行,越来越多的人开始做起了电商。与此同时也产生了许多网络数据,然而这些数据有什么用呢。比如说一个电商公司可以根据一个商品被用户点击了多少次,用户停留时间是多久,用户是否收藏了该商品。这些都是可以被记录下来的。通过这些数据我们就能分析出这段时间内哪些商品最受普遍人们的关注。同时也可以针对这些数据进行用户商品推荐。
后面我们将使用 Scoket 来模拟用户浏览商品产生实时数据,数据包括用户当前浏览的商品、浏览商品的次数、停留时间和是否收藏该商品。使用 Spark Streaming 构建实时数据处理系统,来计算当前电商平台最受人们关注的商品是哪些。
实验流程图:
实验步骤
一、Java工程创建
由于在现实场景下,我们并没有真正的实时的电商平台数据,这些数据肯定也是人家公司保密的数据。那么也只能通过我们自己创建一个模拟器,实现用户浏览商品的数据。下面我们就来创建一 Java Project,来实现相关功能。
打开Eclipse,依次点击左上角工具栏的 File -> New -> Project:
选择 Java Project,然后选择 Next:
在 Project name 中填写 StreamingProject,然后选择 Finish:
在弹出框中选择 Open Perspective:
到此我们就创建好了一个成功的名为 StreamingProject 的 Java 工程。
目录结构为:
二、代码实现
1、Spark-assembly 工具包的引入
在工程中创建一个 lib 的文件夹,用于存放 jar。
右键项目 -> New -> Folder:
在 Folder name 中填写 lib:
现在就会看到当前工程下多了一个 lib 文件夹。
向 lib 中添加 jar:
右键 lib,选择 Build Path -> Configure Build Path:
选择 Libraries -> Add External JARs:
选择 spark-2.1.1-bin-hadoop2.7/jars路径下的所有包(按住 Control 键,再将鼠标一直往下拖就可以选择所有的包):
右键 src,选择 New -> Package:
![](https://img-blog.csdnimg.cn/20210531141546491.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NzIwNzky,size_16,color_FFFFFF,t_70)
在 Java Package 中的 Name 下填写 com.shiyanlou.simulator,然后点击 Finish:
右键 com.shiyanlou.simulator,选择 New -> Class:
在 Java Class 中的 Name 下填写 SimulatorSocket,然后选择 Finish:
按照同样的方式创建 StreamingGoods.java 文件,最后的效果如下所示:
2、模拟器实现 SimulatorSocket.java
实现比较简单,使用了简单的 Java Socket 知识,以及线程来控制它发送消息的频率。详细请看注释。
package com.shiyanlou.simulator;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
public class SimulatorSocket {
public static void main(String[] args) throws Exception {
// 创建一个线程来启动模拟器
new Thread(new SimulatorSocketLog()).start();
}
}
class SimulatorSocketLog implements Runnable{
// 假设一共有 200 个商品
private int GOODSID = 200;
// 随机发送消息的条数
private int MSG_NUM = 30;
// 假设用户浏览该商品的次数
private int BROWSE_NUM = 5;
// 假设用户浏览商品停留的时间
private int STAY_TIME = 10;
// 用来体现用户是否收藏,收藏为 1,不收藏为 0,差评为 -1
int[] COLLECTION = new int[]{
-1,0,1};
// 用来模拟用户购买商品的件数,0 比较多是为了增加没有买的概率,毕竟不买的还是很多的,很多用户都只是看看
private int[] BUY_NUM = new int[]{
0,1,0,2,0,0,0,1,0};
public void run() {
// TODO Auto-generated method stub
Random r = new Random();
try {
/**
*创建一个服务器端,监听9999端口,客户端就是 Streaming,通过看源码才知道,Streaming *socketTextStream 其实就是相当于一个客户端
*/
ServerSocket sScoket = new ServerSocket(9999);
System.out.println("成功开启数据模拟模块,去运行Streaming程序吧!");
while(true){
// 随机消息数
int msgNum = r.nextInt(MSG_NUM)+1;
// 开始监听
Socket socket = sScoket.accept();
// 创建输出流
OutputStream os = socket.getOutputStream();
// 包装输出流
PrintWriter pw = new PrintWriter(os);
for (int i = 0; i < msgNum; i++) {
// 消息格式:商品 ID::浏览次数::停留时间::是否收藏::购买件数
StringBuffer sb = new StringBuffer();
sb.append("goodsID-"