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

博客详情 请查看链接 http://blog.sina.com.cn/s/blog_686c3cfb0102wbp8.html

一:准备开发环境

1.       启动HDFS,如下图所示:



 

通过web端查看节点正常启动,如下图所示:

 

2.       启动Spark集群,如下图所示:

 

通过web端查看集群启动正常,如下图所示:

 

3.       启动start-history-server.sh,如下图所示:

 

二:案例实战

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.       创建目录

 

 

 

 

 

2.       脚本运行

脚本内容如下:

 

 

此时Spark Streaming会每隔5秒执行一次,不断的扫描监控目录下是否有新的文件。

 

3.       上传文件到HDFS中的Data目录下

 

4.       输出结果

 

三: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)
}

 

异常问题思考:

 

为啥会报错?

1.       Streaming会定期的进行checkpoint。

2.       重新启动程序的时候,他会从曾经checkpoint的目录中,如果没有做额外配置的时候,所有的信息都会放在checkpoint的目录中(包括曾经应用程序信息),因此下次再次启动的时候就会报错,无法初始化ShuffleDStream。

 

 

主编辑:王家林

 

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

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

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

 

 

posted @ 2016-04-26 22:05  my_blog17  阅读(270)  评论(0)    收藏  举报