Spark Streaming 是核心Spark API的扩展,可实现实时数据流的可伸缩,高吞吐量,容错流处理。可以从许多数据源(例如Kafka,Flume,Kinesis或TCP sockets)中提取数据,并且可以使用复杂的算法处理数据,这些算法用高级函数表示,如map、reduce、join和window。最后,可以将处理后的数据推送到文件系统,数据库和实时仪表板。实际上,可以在数据流上应用Spark的机器学习和图形处理算法。
在内部,它的工作方式如下。 Spark Streaming接收实时输入数据流,并将数据分成批次,然后由Spark引擎进行处理,以生成批次的最终结果流。
Spark Streaming提供了一种高级抽象,称为离散流或DStream,它表示连续的数据流。DStreams可以从Kafka、Flume和Kinesis等源的输入数据流创建,也可以通过在其他DStreams上应用高级操作创建。在内部,DStream表示为RDDs序列。
1. 了解Spark
Apache Spark 是一个用于大规模数据处理的统一分析引擎
特性:
快
将工作负载运行速度提高100倍
Apache Spark使用最新的DAG调度程序,查询优化器和物理执行引擎,为批处理数据和流数据提供了高性能。
易用
可以使用Java,Scala,Python,R和SQL快速编写应用程序。
通用
结合SQL、流和复杂的分析
Spark为包括SQL和DataFrames,用于机器学习的MLlib,GraphX和Spark Streaming在内的一堆库提供支持。您可以在同一应用程序中无缝组合这些库。
到处运行
Spark可在Hadoop,Apache Mesos,Kubernetes,独立或云中运行。它可以访问各种数据源。
可以在EC2,Hadoop YARN,Mesos或Kubernetes上使用其独立集群模式运行Spark。访问HDFS,Alluxio,Apache Cassandra,Apache HBase,Apache Hive和数百种其他数据源中的数据。
2. 入门案例
统计单词出现的次数,这个例子在Hadoop中用MapReduce也写过。
JavaStreamingContext是java版的StreamingContext。它是Spark Streaming功能的主要入口点。它提供了从输入源创建JavaDStream和JavaPairDStream的方法。可以使用context.sparkContext访问内部的org.apache.spark.api.java.JavaSparkContext。在创建和转换DStream之后,可以分别使用context.start()和context.stop()启动和停止流计算。
1 public static void main(String[] args) throws InterruptedException { 2 // Create a local StreamingContext with two working thread and batch interval of 1 second 3 SparkConf conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount"); 4 JavaStreamingContext jssc = new JavaStreamingContext(conf, Durations.seconds(1)); 5 6 // Create a DStream that will connect to hostname:port, like localhost:9999 7 JavaReceiverInputDStream<String> lines = jssc.socketTextStream("localhost", 9999); 8 9 // Split each line into words 10 JavaDStream<String> words = lines.flatMap(x -> Arrays.asList(x.split(" ")).iterator()); 11 12 // Count each word in each batch 13 JavaPairDStream<String, Integer> pairs = words.mapToPair(s -> new Tuple2<>(s, 1)); 14 JavaPairDStream<String, Integer> wordCounts = pairs.reduceByKey((i1, i2) -> i1 + i2); 15 16 // Print the first ten elements of each RDD generated in this DStream to the console 17 wordCounts.print(); 18 19 // Start the computation 20 jssc.start(); 21 // Wait for the computation to terminate 22 jssc.awaitTermination(); 23 }
3. 基本概念
3.1. Maven依赖
1 <groupId>org.apache.spark</groupId> 2 <artifactId>spark-streaming_2.12</artifactId> 3 <version>2.4.5</version> 4 <scope>provided</scope> 5 </dependency>
为了从其它数据源获取数据,需要添加相应的依赖项spark-streaming-xyz_2.12。例如:
1 <dependency> 2 <groupId>org.apache.spark</groupId> 3 <artifactId>spark-streaming-kafka-0-10_2.12</artifactId> 4 <version>2.4.5</version> 5 </dependency>
3.2. 初始化StreamingContext
为了初始化一个Spark Streaming程序,必须创建一个StreamingContext对象,该对象是所有Spark Streaming功能的主要入口点。
我们可以从SparkConf对象中创建一个JavaStreamingContext对象
1 import org.apache.spark.SparkConf; 2 import org.apache.spark.streaming.Duration; 3 import org.apache.spark.streaming.api.java.JavaStreamingContext; 4 5 SparkConf conf = new SparkConf().setAppName(appName).setMaster(master); 6 JavaStreamingContext ssc = new JavaStreamingContext(conf, new Duration(1000));
appName 参数是显示在集群UI上的你的应用的名字
master 参数是一个Spark、 Mesos 或 YARN 集群URL,或者也可以是一个特定的字符串“local[*]”表示以本地模式运行。实际上,当在集群上运行时,肯定不希望对在程序中对master进行硬编码,而希望通过spark-submit启动应用程序并在其中接收它。然而,对于本地测试,你可以传“local[*]”来运行Spark Streaming。
还可以从一个已存在的JavaSparkContext中创建一个JavaStreamingContext对象