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内のファイルを表示することができます。