大家:
好!SparkStream的两种经典使用方式,仅仅涉及到SparkStream,没有涉及到各种对接,数据来源是tcp的端口号
第一种: 按照间隔对数据进行计算,对历史数据不做处理
package SparkStream
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.streaming.{Seconds, StreamingContext}
/**
* Created by Administrator on 2017/10/10.
* 功能:演示sparkStream的wordcount
*
*/
object StreamWc {
def main(args: Array[String]): Unit = {
//设置日志的级别
LoggerLevels.setStreamingLogLevels()
val conf=new SparkConf().setAppName("StreamWc").setMaster("local[2]")
val sc=new SparkContext(conf)
val ssc=new StreamingContext(sc,Seconds(5))
//创建DStream 接收数据
val DStream=ssc.socketTextStream("192.168.17.108",8888)
val result=DStream.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
result.print()
//启动spark任务
ssc.start()
//等待结束任务
ssc.awaitTermination()
}
}
首先,从TCP端口中读取数据
yum install nc
nc -lk 8888
其次运行 SparkStream,查看从tcp中输入的数据,SparkStream是否进行了加工
第二种: 按照间隔对数据进行计算,需要对历史数据进行整合
package SparkStream
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{HashPartitioner, SparkConf, SparkContext}
/**
* Created by Administrator on 2017/10/10.
* 功能:演示SparkStream中的wordcount的累加
*
*/
object StreamWc_Sum {
/**
* String : 单词 hello
* Seq[Int] :单词在当前批次出现的次数
* Option[Int] : 历史结果
*/
val updateFunc=(iter:Iterator[(String,Seq[Int],Option[Int])])=>{
//iter.flatMap(it=>Some(it._2.sum + it._3.getOrElse(0)).map(x=>(it._1,x)))
iter.flatMap{case(x,y,z)=>Some(y.sum+z.getOrElse(0)).map(m=>(x,m))}
}
def main(args: Array[String]): Unit = {
//设置日志的级别
LoggerLevels.setStreamingLogLevels()
val conf=new SparkConf().setAppName("StreamWc_Sum").setMaster("local[2]")
val sc=new SparkContext(conf)
val ssc=new StreamingContext(sc,Seconds(5))
// ss做累加之前,一定要做checkpoint,而且存储的目录一定是hdfs
//做checkpoint 写入共享存储中
ssc.checkpoint("c://test//wc_sum")
val lines=ssc.socketTextStream("192.168.17.108",8888)
//没有累加的计数
// val result=lines.flatMap(_.split(" ")).map((_,1)).reduceByKey()
// 用默认的hash分区, true表示以后也这样用的
//updateStateByKey结果可以累加但是需要传入一个自定义的累加函数:updateFunc 三个参数
val result=lines.flatMap(_.split(" ")).map((_,1)).updateStateByKey(updateFunc,
new HashPartitioner(ssc.sparkContext.defaultParallelism), true)
result.print()
//启动sparkstream
ssc.start()
////等待结束任务
ssc.awaitTermination()
}
}
首先,从TCP端口中读取数据
yum install nc
nc -lk 8888
其次运行 SparkStream,查看从tcp中输入的数据,SparkStream是否进行了加工,重点看看对历史数据的处理:
个人认为的核心点:
1 函数 updateFunc
2 scala的算子updateStateByKey,以前在此之前要做的checkpoint
这两点都不好写,我是建议代码保存。下次在此基础上进行修改,不要从零开始写