SparkStreaming0nHDFS实战

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值