Spark Streaming是一种构建在Spark上的实时计算框架,它扩展了Spark处理大规模流式数据的能力,它可以接收来自Kafka,Flume,Twitter和TCP Socket的数据源。
SparkStreaming是将流式计算分解成一系列短小的批处理作业,也就是将输入数据按照batch size(如5秒)分成一段一段的数据,每一段数据都转换成Spark中的RDD,然后将Spark Streaming中对DStream的Transformation操作为为针对RDD的Transformation操作,将RDD经过操作变成中间结果保存在内存中。
如下程序是以TCPSocket为数据来源,演示SparkStreaming通过监听TCP套接字得到数据服务器上的文本数据,,并计算其中各单词的个数。此代码是在spark自带的NetworkWordCount例子的基础上,做了点小改动而成的,主要是使用Log4j屏蔽掉了控制台打印的大量的日志信息,就只打印结果信息,并将batch size修改为5秒。
package sparkstreaming
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.streaming.StreamingContext._
import org.apache.spark.storage.StorageLevel
import org.apache.log4j.{Level, Logger}
object NetworkWordCount {
// 屏蔽不必要的日志显示在终端上
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
def main(args:Array[String]) {
if(args.length < 2) {
System.err.println("Usage: NetworkWordCount <hostname> <port>")
System.exit(1)
}
// Create the Context with a 5 seconds batch size
val conf = new SparkConf().setAppName("NetworkWordCount")
//将输入数据按照batch size为5秒来分成一段一段的数据
val ssc = new StreamingContext(conf, Seconds(5))
// args(0)为监听的服务器的IP,args(1)为监听的端口
val lines = ssc.socketTextStream(args(0), args(1).toInt, StorageLevel.MEMORY_AND_DISK_SER)
val words = lines.flatMap(_.split(" "))
val wordsCount = words.map(x=>(x,1)).reduceByKey(_ + _)
wordsCount.print()
ssc.start()
ssc.awaitTermination()
}
}
将上述程序打包成SparkStreaming.jar,并使用spark-submit提交至spark集群进行运行(打包操作,可参考:
spark实例:用spark-submit运行spark程序)。
这里使用Netcat作为数据服务器,这个工具在unix-like系统中一般都存在。执行如下命令即可启动Netcat服务:
nc -lk 9999 // 以9999为服务端口
现在来启动Spark Streaming程序,新开一个终端,执行如下命令:
$SPARK_HOME/bin/spark-submit --master spark://namenode1:7077 --executor-memory 512m --class sparkstreaming.NetworkWordCount SparkStreaming.jar namenode1 9999
如果要原封不动使用spark自带的示例,只要机器上已部署了spark,则可以执行如下命令:
./bin/run-example org.apache.spark.examples.streaming.NetworkWordCount 192.168.11.120 9999
在Netcat这边输入how are you ?,然后看spark这边的结果:
-------------------------------------------
Time: 1419088925000 ms
-------------------------------------------
(are,1)
(how,1)
(you,1)
(?,1)-------------------------------------------
Time: 1419088930000 ms
-------------------------------------------