Spark从入门到精通39:Spark Streaming:输入DStream之基础数据源以及基于HDFS的实时wordcount程序

1. 输入DStream之基础数据源

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

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

streamingContext.fileStream(dataDirectory)
streamingContext.fileStreamKeyClass, ValueClass, InputFormatClass

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

2.基于HDFS的实时wordcount程序
package streaming;

import org.apache.spark.SparkConf;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaPairDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import scala.Tuple2;

import java.util.Arrays;

public class HDFSWordCount {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf()
                .setMaster("local[2]")
                .setAppName("HDFSWordCount");
        JavaStreamingContext jssc = new JavaStreamingContext(conf, Durations.seconds(5));
        // 首先,使用JavaStreamingContext的textFileStream()方法,针对HDFS目录创建输入数据流
        JavaDStream lines = jssc.textFileStream("hdfs://spark1:9000/wordcount_dir");
        // 执行wordcount操作
        JavaDStream words = lines.flatMap(x -> Arrays.asList(x.split(",")));
        JavaPairDStream pairs = words.mapToPair(x -> new Tuple2(x, 1));
        JavaPairDStream wordCounts = pairs.reduceByKey((v1, v2) -> (v1 + v2));
        wordCounts.print();
        jssc.start();
        jssc.awaitTermination();
        jssc.close();


    }
}

scala版本:

package cn.spark.study.streaming

import org.apache.spark.SparkConf
import org.apache.spark.streaming.StreamingContext
import org.apache.spark.streaming.Seconds

/**
 * @author Administrator
 */
object HDFSWordCount {
  
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
        .setMaster("local[2]")  
        .setAppName("HDFSWordCount")
    val ssc = new StreamingContext(conf, Seconds(5))
    
    val lines = ssc.textFileStream("hdfs://spark1:9000/wordcount_dir")  
    val words = lines.flatMap { _.split(" ") }  
    val pairs = words.map { word => (word, 1) }  
    val wordCounts = pairs.reduceByKey(_ + _)  
    
    wordCounts.print()  
    
    ssc.start()
    ssc.awaitTermination()
  }
  
}

你可能感兴趣的:(Spark从入门到精通39:Spark Streaming:输入DStream之基础数据源以及基于HDFS的实时wordcount程序)