86、Spark Streaming之输入DStream之基础数据源以及基于HDFS的实时wordcount程序

输入DStream之基础数据源

  1. Socket
    之前的wordcount例子,已经演示过了,StreamingContext.socketTextStream()

  2. HDFS文件
    基于HDFS文件的实时计算,其实就是,监控一个HDFS目录,只要其中有新文件出现,就实时处理。相当于处理实时的文件流。

streamingContext.fileStream(dataDirectory)
streamingContext.fileStream[KeyClass, ValueClass, InputFormatClass](dataDirectory)

Spark Streaming会监视指定的HDFS目录,并且处理出现在目录中的文件。要注意的是,所有放入HDFS目录中的文件,都必须有相同的格式;必须使用移动或者重命名的方式,将文件移入目录;一旦处理之后,文件的内容即使改变,也不会再处理了;基于HDFS文件的数据源是没有Receiver的,因此不会占用一个cpu core。

案例

基于HDFS的实时wordcount程序
Java版本

public class HDFSWordCount {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("HDFSWordCountJava").setMaster("local[2]");
        JavaStreamingContext javaStreamingContext = new JavaStreamingContext(conf, Durations.seconds(10));


        JavaDStream lines = javaStreamingContext.textFileStream("hdfs://hadoop-100:9000/stream/");

        JavaDStream words = lines.flatMap(new FlatMapFunction() {
            @Override
            public Iterable call(String s) throws Exception {
                return Arrays.asList(s.split(" "));
            }
        });

        JavaPairDStream wordsNumber = words.mapToPair(new PairFunction() {
            @Override
            public Tuple2 call(String s) throws Exception {
                return new Tuple2<>(s, 1);
            }
        });

        JavaPairDStream result = wordsNumber.reduceByKey(new Function2() {
            @Override
            public Integer call(Integer v1, Integer v2) throws Exception {
                return v1 + v2;
            }
        });

        result.print();
        javaStreamingContext.start();
        javaStreamingContext.awaitTermination();
        javaStreamingContext.close();
    }
}

Scala版本

object HDFSWordCount {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("HDFSWordCountScala").setMaster("local[2]")
    val streamingContext = new StreamingContext(conf, Seconds(10))

    val lines = streamingContext.textFileStream("hdfs://hadoop-100:9000/stream/")
    val words = lines.flatMap( line => line.split(" "))
    val wordsNumber = words.map(word => (word, 1))
    val result = wordsNumber.reduceByKey(_ + _)

    result.print()

    streamingContext.start()
    streamingContext.awaitTermination()
  }
}

你可能感兴趣的:(86、Spark Streaming之输入DStream之基础数据源以及基于HDFS的实时wordcount程序)