public class WordCountOnline2 {
public static void main(String[] args) {
final SparkConf conf=new SparkConf().setAppName("SparkStreamingOnHDFS");
final String checkpointDirectory="hdfs:///liberary/SparkStreaming/CheckPoint";
JavaStreamingContextFactory factory=new JavaStreamingContextFactory() {
public JavaStreamingContext create() {
return createContext(checkpointDirectory,conf);
}
};
/**
* 可以从失败中恢复Driver,不过还需要制定Driver这个进程运行在Cluster,并且在提交应用程序的时候制定
* --superise
*/
JavaStreamingContext jsc = JavaStreamingContext.getOrCreate(checkpointDirectory, factory);
/**
* 此处没有Receiver,SparkStreaming应用程序只是按照时间间隔监控每个batch新增的内容,作为RDD的数据来源生产RDD
*/
JavaDStream<String> lines = jsc.textFileStream("hdfs:///liberary/SparkStreaming/data");
JavaDStream<String> words=lines.flatMap(new FlatMapFunction<String, String>() {
public Iterable<String> call(String line) throws Exception {
return Arrays.asList(line.split(" "));
}
});
/**
* 在单词拆分的基础上对每个单词进行实例计数为1
*/
JavaPairDStream<String, Integer> pairs=words.mapToPair(new PairFunction<String, String, Integer>() {
public Tuple2<String, Integer> call(String word) throws Exception {
// TODO Auto-generated method stub
return new Tuple2<String, Integer>(word, 1);
}
});
/**
* 在每个单词实例计数为1的基础上统计每个单词在文件中出现的总次数
*/
JavaPairDStream<String, Integer> wordCount=pairs.reduceByKey(new Function2<Integer, Integer, Integer>() {
public Integer call(Integer v1, Integer v2) throws Exception {
// TODO Auto-generated method stub
return v1+v2;
}
});
/**
* 此处的print并不会直接触发Job的支持,因为现在的一切都是在SparkStreaming的框架
* 控制之下,对于SparkStreaming而言是否触发真正的Job运行时基于Duration的时间间隔的
* SparkStreaming应用程序要想执行具体的job,对Dstream必须要有outputStream
* 操作,outputStream有很多类型的函数触发,print,saveAsTextFile
* 最重要的一个方法是ForeachRDD,因为SparkStreaming处理的结果一般都会放在
* Redis,数据库,DashBoard等上 面,而foreach就是用来完成这些功能的,
*/
wordCount.print();
/**
* SparkStreaming执行引擎也就是Driver开始运行
* Driver启动运行的时候是位于一条新的线程中的
* 当然其内部有消息循环体用于接受应用程序本身或者Executor中的消息
* 启动框架
*/
jsc.start();
jsc.awaitTermination();
jsc.close();
}
private static JavaStreamingContext createContext(String checkpointDirectory,SparkConf conf){
System.out.println("creating new context");
SparkConf sparkConf=conf;
JavaStreamingContext ssc=new JavaStreamingContext(sparkConf,Durations.seconds(15));
ssc.checkpoint(checkpointDirectory);
return ssc;
}
}