Spark Streaming(4):基于HDFS的SparkStreaming案例实战和内幕源码解密

一:准备开发环境
1.       启动HDFS,如下图所示:
第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密
通过web端查看节点正常启动,如下图所示:
第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密
2.       启动Spark集群,如下图所示:
第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密
通过web端查看集群启动正常,如下图所示:
第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密
3.       启动start-history-server.sh,如下图所示:
第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密
二:案例实战
package com.dt.spark.SparkApps.sparkstreaming;

import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
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.*;
import scala.Tuple2;

import java.util.Arrays;

public class SparkStreamingOnHDFS {
    public static void main(String[] args){
        
        final SparkConf conf = new SparkConf().setMaster("spark://Master:7077").setAppName("SparkOnStreamingOnHDFS");
        
//        JavaStreamingContext jsc = new JavaStreamingContext(conf, Durations.seconds(5));//Durations.seconds(5)设置每隔5秒

        final String checkpointDirectory = "hdfs://Master:9000/library/SparkStreaming/Checkpoint_Data";
        JavaStreamingContextFactory factory = new JavaStreamingContextFactory() {
            @Override
            public JavaStreamingContext create() {
                return createContext(checkpointDirectory,conf);
            }
        };
        
        JavaStreamingContext jsc = JavaStreamingContext.getOrCreate(checkpointDirectory, factory);
        
        //指定从HDFS中监控的目录
        JavaDStream lines = jsc.textFileStream("hdfs://Master:9000/library/SparkStreaming/Data");
        
        JavaDStream words = lines.flatMap(new FlatMapFunction,String>() {
            public Iterable call(String line) throws Exception {
                return Arrays.asList(line.split(" "));
            }
        });
        
        JavaPairDStream,Integer> pairs  = words.mapToPair(new PairFunction, String, Integer>() {
            public Tuple2, Integer> call(String word) throws Exception {
                return new Tuple2,Integer>(word,1);
            }
        });
        
        JavaPairDStream,Integer> wordscount = pairs.reduceByKey(new Function2, Integer, Integer>() {
            public Integer call(Integer v1, Integer v2) throws Exception {
                return v1 + v2;
            }
        });
        
        wordscount.print();
        
        jsc.start();

        jsc.awaitTermination();
        jsc.close();
    }
    
    private static JavaStreamingContext createContext(String checkpointDirectory,SparkConf conf){
        System.out.println("Creating new context");

        SparkConf = conf;

        JavaStreamingContext ssc = new JavaStreamingContext(sparkConf,Durations.seconds(5));
        ssc.checkpoint(checkpointDirectory);

        return ssc;
    }
}
集群运行
1.       创建目录
第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密

第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密

第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密
2.       脚本运行
脚本内容如下:
第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密
第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密
此时Spark Streaming会每隔5秒执行一次,不断的扫描监控目录下是否有新的文件。
第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密
3.       上传文件到HDFS中的Data目录下
第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密
4.       输出结果
第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密
三:Spark Streaming on HDFS源码解密
1.       JavaStreamingContextFactory的create方法可以创建JavaStreamingContext
2.       而我们在具体实现的时候覆写了该方法,内部就是调用createContext方法来具体实现。上述实战案例中我们实现了createContext方法。
trait JavaStreamingContextFactory {
  def create(): JavaStreamingContext
}
3.       checkpoint:
一方面:保持容错
一方面保持状态
在开始和结束的时候每个batch都会进行checkpoint
def checkpoint(directory: String) {
  ssc.checkpoint(directory)
}
4.       remember:
流式处理中过一段时间数据就会被清理掉,但是可以通过remember可以延长数据在程序中的生命周期,另外延长RDD更长的时间。
应用场景:
假设数据流进来,进行ML或者Graphx的时候有时需要很长时间,但是bacth定时定条件的清除RDD,所以就可以通过remember使得数据可以延长更长时间。
def remember(duration: Duration) {
  ssc.remember(duration)
}
5.       在JavaStreamingContext中,getOrCreate方法源码如下:
如果设置了checkpoint ,重启程序的时候,getOrCreate()会重新从checkpoint目录中初始化出StreamingContext。
@deprecated("use getOrCreate without JavaStreamingContextFactor", "1.4.0")
def getOrCreate(
    checkpointPath: String,
    factory: JavaStreamingContextFactory
  ): JavaStreamingContext = {
  val ssc = StreamingContext.getOrCreate(checkpointPath, () => {
    factory.create.ssc
  })
  new JavaStreamingContext(ssc)
}
 
异常问题思考:
第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密
为啥会报错?
1.       Streaming会定期的进行checkpoint。
2.       重新启动程序的时候,他会从曾经checkpoint的目录中,如果没有做额外配置的时候,所有的信息都会放在checkpoint的目录中(包括曾经应用程序信息),因此下次再次启动的时候就会报错,无法初始化ShuffleDStream。


主编辑:王家林

资料来源于:DT_大数据梦工厂(IMF传奇行动绝密课程)

更多私密内容,请关注微信公众号:DT_Spark

如果您对大数据Spark感兴趣,可以免费听由王家林老师每天晚上20:00开设的Spark永久免费公开课,YY房间号:68917580




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31133864/viewspace-2086388/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31133864/viewspace-2086388/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值