アナログ製品情報は注意スパークストリーミングの程度に基づいて計算されます

A.コンテンツ実験

実験環境

Hadoop2.7.5

Spark2.4.0

日食

コンテンツ実験

使用スパークストリーミングビルドリアルタイムデータコンピューティングシステム、データは累積計算のupdateStateByKey結果を使用して、アプリケーションに基本的な機能をストリーミング、HDFSに格納された結果、スパークプラットフォームを、Javaのソケットプログラミングシミュレートユーザーを使用してスパークを使用して、ブラウズの製品情報を生成し実行します。

II。実験手順

Javaプロジェクトの作成2.1

Libフォルダには、JARパッケージのインポートをspark2.4.0なり、プロジェクトの下に作成されます

src以下のパッケージとJavaクラスの作成

2.2シミュレータアナログデータSimulatorSocket.javaを生成します

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");
        }

    }

}

商品の注意StreamingGoods.javaの2.3リアルタイム計算

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。実験の実行

ホストHadoopを、スパークの開始は、瓶のパッケージにプロジェクトをパッケージ化、スパークはディレクトリに置か。

ホスト上のリスナー・アドレスの計算製品SimulatorSocketの注目上で実行するために書かれたコード、そして実行StreamingGoodsとして。

//192.168.100.10:7077 --class org.apache.spark.SimulatorSocker stream.jarマシン上でシミュレーションデータを生成すると、ビン/火花提出--master火花を実行します

//192.168.100.10:ホストビン/火花提出--masterスパーク上で実行されている7077 --class org.apache.spark.StreamingGoods stream.jar

この時点で、それは、データの書き込みHDFSが生成されます、あなたはHadoopのインターフェイスでHDFS内のファイルを表示することができます。

 

 

 

 

公開された36元の記事 ウォン称賛19 ビュー30000 +

おすすめ

転載: blog.csdn.net/qq_27182767/article/details/85644930