updateStateByKey案例(Java版本)
来源:互联网 发布:廉租住房软件 编辑:程序博客网 时间:2024/06/18 01:02
package gh.spark.SparkStreaming;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.Optional; //注意Optional的包
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.streaming.Durations;
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 UpdateStateByKeyWC {
public static void main(String[] args) throws Exception {
SparkConf conf=new SparkConf().setAppName("UpdateStateByKeyWC")
.setMaster("local[2]");
JavaStreamingContext jsc=new JavaStreamingContext(conf,Durations.seconds(5));
/** 第一点,如果要使用updateStateByKey算子,就必须设置一个checkpoint目录,开启checkpoint机制
* 这样的话才能把每个key对应的state除了在内存中有,那么也要checkpoint一份
* 因为你要长期保存一份key的state的话,那么spark streaming是要求必须用checkpoint的,
* 以便于在内存数据丢失的时候,可以从checkpoint中恢复数据
**/
// 开启checkpoint机制,很简单,只要调用jssc的checkpoint()方法,设置一个hdfs目录即可
jsc.checkpoint("hdfs://tgmaster:9000/in/chk");
JavaPairDStream<String, Integer> pairRDD = lines.flatMap(new FlatMapFunction<String, String>() {
private static final long serialVersionUID = 1L;
public Iterator<String> call(String line) throws Exception {
List<String> words = Arrays.asList(line.split(" "));
return words.iterator();
}
}).mapToPair(new PairFunction<String, String, Integer>() {
private static final long serialVersionUID = 1L;
public Tuple2<String, Integer> call(String word) throws Exception {
// TODO Auto-generated method stub
return new Tuple2<String, Integer>(word, 1);
}
});
// 到了这里,就不一样了,之前的话,是不是直接就是pairs.reduceByKey
// 然后,就可以得到每个时间段的batch对应的RDD,计算出来的单词计数
// 然后,可以打印出那个时间段的单词计数
// 但是,有个问题,你如果要统计每个单词的全局的计数呢?
// 就是说,统计出来,从程序启动开始,到现在为止,一个单词出现的次数,那么就之前的方式就不好实现
// 就必须基于redis这种缓存,或者是mysql这种db,来实现累加
// 但是,我们的updateStateByKey,就可以实现直接通过Spark维护每个单词的全局的统计次数
//*****注意Optional的包
JavaPairDStream<String, Integer> updateStateByKeyRDD = pairRDD.updateStateByKey(new Function2<List<Integer>, Optional<Integer>, Optional<Integer>>() {
private static final long serialVersionUID = 1L;
public Optional<Integer> call(List<Integer> values, Optional<Integer> state)
throws Exception {
// 首先定义一个全局的单词计数
Integer newValue = 0;
/**
* 1、在新输入的内容中,没有出现,但是之前已经存在
* 2、在新输入的内容中,第一次出现,之前不存在
*/
if(state.isPresent()) {
newValue = state.get();
}
/**
* 在新输入的内容中,又出现了,并且之前也已经存在,此时需要累加
*/
for(Integer value : values) {
newValue += value;
}
return Optional.of(newValue);
}
});
/**到这里为止,相当于是,每个batch过来是,计算到pairs DStream,就会执行全局的updateStateByKey算子,
* updateStateByKey返回的JavaPairDStream,其实就代表了每个key的全局的计数
*/
// 将结果打印出来
updateStateByKeyRDD.print();
jsc.start();
jsc.awaitTermination();
jsc.close();
}
}
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.Optional; //注意Optional的包
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.streaming.Durations;
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 UpdateStateByKeyWC {
public static void main(String[] args) throws Exception {
SparkConf conf=new SparkConf().setAppName("UpdateStateByKeyWC")
.setMaster("local[2]");
JavaStreamingContext jsc=new JavaStreamingContext(conf,Durations.seconds(5));
/** 第一点,如果要使用updateStateByKey算子,就必须设置一个checkpoint目录,开启checkpoint机制
* 这样的话才能把每个key对应的state除了在内存中有,那么也要checkpoint一份
* 因为你要长期保存一份key的state的话,那么spark streaming是要求必须用checkpoint的,
* 以便于在内存数据丢失的时候,可以从checkpoint中恢复数据
**/
// 开启checkpoint机制,很简单,只要调用jssc的checkpoint()方法,设置一个hdfs目录即可
jsc.checkpoint("hdfs://tgmaster:9000/in/chk");
JavaReceiverInputDStream<String> lines = jsc.socketTextStream("tgmaster", 9999);
JavaPairDStream<String, Integer> pairRDD = lines.flatMap(new FlatMapFunction<String, String>() {
private static final long serialVersionUID = 1L;
public Iterator<String> call(String line) throws Exception {
List<String> words = Arrays.asList(line.split(" "));
return words.iterator();
}
}).mapToPair(new PairFunction<String, String, Integer>() {
private static final long serialVersionUID = 1L;
public Tuple2<String, Integer> call(String word) throws Exception {
// TODO Auto-generated method stub
return new Tuple2<String, Integer>(word, 1);
}
});
// 到了这里,就不一样了,之前的话,是不是直接就是pairs.reduceByKey
// 然后,就可以得到每个时间段的batch对应的RDD,计算出来的单词计数
// 然后,可以打印出那个时间段的单词计数
// 但是,有个问题,你如果要统计每个单词的全局的计数呢?
// 就是说,统计出来,从程序启动开始,到现在为止,一个单词出现的次数,那么就之前的方式就不好实现
// 就必须基于redis这种缓存,或者是mysql这种db,来实现累加
// 但是,我们的updateStateByKey,就可以实现直接通过Spark维护每个单词的全局的统计次数
//*****注意Optional的包
JavaPairDStream<String, Integer> updateStateByKeyRDD = pairRDD.updateStateByKey(new Function2<List<Integer>, Optional<Integer>, Optional<Integer>>() {
private static final long serialVersionUID = 1L;
public Optional<Integer> call(List<Integer> values, Optional<Integer> state)
throws Exception {
// 首先定义一个全局的单词计数
Integer newValue = 0;
/**
* 1、在新输入的内容中,没有出现,但是之前已经存在
* 2、在新输入的内容中,第一次出现,之前不存在
*/
if(state.isPresent()) {
newValue = state.get();
}
/**
* 在新输入的内容中,又出现了,并且之前也已经存在,此时需要累加
*/
for(Integer value : values) {
newValue += value;
}
return Optional.of(newValue);
}
});
/**到这里为止,相当于是,每个batch过来是,计算到pairs DStream,就会执行全局的updateStateByKey算子,
* updateStateByKey返回的JavaPairDStream,其实就代表了每个key的全局的计数
*/
// 将结果打印出来
updateStateByKeyRDD.print();
jsc.start();
jsc.awaitTermination();
jsc.close();
}
}
0 0
- updateStateByKey案例(Java版本)
- updateStateByKey案例(Scala版本)
- Spark之SparkStreaming案例-UpdateStateByKey
- Spark Streaming---UpdatestateBykey(java)
- Spark Streaming updateStateByKey案例实战和内幕源码解密
- 第93课:Spark Streaming updateStateByKey案例实战和内幕源码解密
- 第93讲:Spark Streaming updateStateByKey案例实战和内幕源码
- ArcGIS Server Java ADF 案例教程 v9.3.1 PDF 版本
- 大数据IMF传奇行动绝密课程第93课:SparkStreaming updateStateByKey案例实战和内置源码解密
- Spark常用算子详解汇总 : 实战案例、Java版本、Scala版本
- spark streaming updateStateByKey 用法
- spark streaming updateStateByKey 用法
- spark streaming updateStateByKey 用法
- spark streaming updateStateByKey 用法
- SparkStreaming updateStateByKey 基本操作
- SparkStream:3)updateStateByKey详解
- SparkStreaming updateStateByKey 使用
- Spark updateStateByKey和mapWithState
- 玲珑Round #4-G -- See car
- socket套接字选项和模式
- [翻译]PyMongo官方文档
- JSON.parse()和JSON.stringify()用法解析
- FileInputStream简单用法
- updateStateByKey案例(Java版本)
- GitLab搭建与维护(基于docker镜像sameersbn/docker-gitlab)
- 给定一个自定义函数,random5() 可以随机生成1-5之间的随机数,请利用rondom5()定义一个rondom
- HDU 5935 Car (模拟)
- Ajax对表格中的信息不刷新页面进行更新数据
- Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
- Http和Https 的概念和区别
- updateStateByKey案例(Scala版本)
- spark SQL 读取mysql中的数据日志分析