información sobre los productos analógica se calcula en base al grado de Transmisión de atención Spark

A. Experimento contenido

ambiente experimental

Hadoop2.7.5

Spark2.4.0

eclipse

experimentos de contenido

El uso de secuencias de datos de chispa acumulación en tiempo real del sistema de cómputo, los datos generados información sobre los productos de exploración mediante el uso de los usuarios de la programación del zócalo java simulados, utilizando Spark aplicaciones de streaming funcionalidad básica, usando updateStateByKey resultado del cálculo acumulativo, los resultados almacenados en el HDFS, la plataforma de la chispa ejecutar.

Procedimiento experimental II.

2.1 Creación de proyectos de Java

carpeta de la liberación se crea el marco del proyecto, se spark2.4.0 importación paquete frasco

La creación de paquetes y clases Java bajo src

2,2 simulador generar SimulatorSocket.java datos analógicos

package org.apache.spark;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
public class SimulatorSocket {
    public static void main(String[] args) throws Exception {
        //创建一个线程来启动模拟器
        new Thread(new SimulatorSocketLog()).start();
    }
}
class SimulatorSocketLog implements Runnable{
    //假设一共有10000个商品
    private int GOODSID = 10000;
    //随机发送消息的条数
    private int MSG_NUM = 200;
    //假设用户浏览该商品的次数
    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,socketTextStream 其实就是相当于一个客户端
             */
            ServerSocket sScoket = new ServerSocket(9999);
            System.out.println("successfully start stimulator data block,run 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-"+(r.nextInt(GOODSID)+1));
                    sb.append("::");
                    sb.append(r.nextInt(BROWSE_NUM)+1);
                    sb.append("::");
                    sb.append(r.nextInt(STAY_TIME)+r.nextFloat());
                    sb.append("::");
                    sb.append(COLLECTION[r.nextInt(2)]);
                    sb.append("::");
                    sb.append(BUY_NUM[r.nextInt(9)]);
                    sb.append("::");
                    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
                    sb.append(df.format(new Date()));
                    System.out.println(sb.toString());
                    //发送消息
                    pw.write(sb.toString()+"\n");
                }
                pw.flush();
                pw.close();
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    System.out.println("thread sleep failed");
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("port used");
        }

    }

}

2.3 Cálculo en tiempo real de los bienes StreamingGoods.java atención

package org.apache.spark;
import java.io.Serializable;
import java.util.List;

import org.apache.spark.HashPartitioner;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.Optional;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;
import org.apache.spark.streaming.Duration;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaPairDStream;
import org.apache.spark.streaming.api.java.JavaReceiverInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;

import scala.Tuple2;

public class StreamingGoods implements Serializable{
    private static final long serialVersionUID = 1L;
    //定义一个文件夹,用于保存上一个RDD的数据。该文件夹会自动创建,不需要提前创建
    private static String checkpointDir = "checkDir";
    public static void main(String[] args) throws InterruptedException {
        SparkConf sparkConf = new SparkConf().setAppName("StreamingGoods").setMaster("local[2]");
        //JavaStreamingContext jsc = new JavaStreamingContext(sparkConf,new Duration(1000));
        JavaStreamingContext jsc = new JavaStreamingContext(sparkConf,Durations.seconds(5));
        jsc.checkpoint(checkpointDir);
        JavaReceiverInputDStream<String> jds = jsc.socketTextStream("192.168.100.12", 9999);
        JavaPairDStream<String, Double> splitMess = jds.mapToPair(new PairFunction<String,String,Double>(){
            private static final long serialVersionUID = 1L;
            public Tuple2<String, Double> call(String line) throws Exception {
                // TODO Auto-generated method stub.
                String[] lineSplit = line.toString().split("::");
                Double followValue = Double.parseDouble(lineSplit[1])*0.8+Double.parseDouble(lineSplit[2])*0.6+Double.parseDouble(lineSplit[3])*1+Double.parseDouble(lineSplit[4])*1;
                return new Tuple2<String, Double>(lineSplit[0], followValue);
            }});
        JavaPairDStream<String,Double> UpdateFollowValue = splitMess.updateStateByKey(new Function2<List<Double>, Optional<Double>, Optional<Double>>() {
            public Optional<Double> call(List<Double> newValues, Optional<Double> statValue) throws Exception {
                //对相同的key进行统计,实现累加
                Double updateValue=statValue.or(0.0);
                for(Double values: newValues){
                    updateValue += values;
                }
                return Optional.of(updateValue);
            }
        },new HashPartitioner(jsc.sparkContext().defaultMinPartitions()));
        
        UpdateFollowValue.foreachRDD(new VoidFunction<JavaPairRDD<String,Double>>(){
            private static final long serialVersionUID = 1L;
            public void call(JavaPairRDD<String, Double> followValue) throws Exception {
                // TODO Auto-generated method stub
                JavaPairRDD<Double,String> followValueSort = followValue.mapToPair(new PairFunction<Tuple2<String,Double>,Double,String>(){

                    public Tuple2<Double, String> call(
                            Tuple2<String, Double> valueToKey) throws Exception {
                        // TODO Auto-generated method stub
                        return new Tuple2<Double,String>(valueToKey._2,valueToKey._1);
                    }
                }).sortByKey(false);
                followValueSort.saveAsTextFile("hdfs://192.168.100.10:8020/spgzd");
                //followValueSort.saveAsTextFile("hdfs://192.168.100.10:8020/spgzd"+System.currentTimeMillis());
            }});
        jsc.start();
        jsc.awaitTermination();

    }
}

III. Los experimentos de ejecución

Se inicia en un host Hadoop, Spark, empaquetan el proyecto en un paquete frasco, Spark colocado en el directorio.

A medida que el código escrito para ejecutarse en una atención SimulatorSocket de productos de computación de la dirección de oyente, y StreamingGoods A continuación, ejecute en el host.

Generar datos de simulación en la máquina, ejecute el bin / encendido por chispa presentar --master: //192.168.100.10: 7077 --class org.apache.spark.SimulatorSocker stream.jar

Que se ejecuta en un contenedor de host / encendido por chispa presentar --master: //192.168.100.10: 7077 --class org.apache.spark.StreamingGoods stream.jar

En este momento, se producirá hdfs datos de escritura, se puede ver el archivo en hdfs por la interfaz de Hadoop.

 

 

 

 

Publicado 36 artículos originales · ganado elogios 19 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/qq_27182767/article/details/85644930
Recomendado
Clasificación