todo el mundo:
¡es bueno! Las dos formas clásicas de usar SparkStream solo involucran SparkStream, pero no involucran varias conexiones. La fuente de datos es el número de puerto de tcp.
El primer tipo: Calcule los datos según el intervalo, sin procesar los datos históricos.
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()
}
}
Primero, lea los datos del puerto TCP
yum install nc
nc -lk 8888
En segundo lugar, ejecute SparkStream, verifique la entrada de datos de tcp, si SparkStream se ha procesado
El segundo tipo: Calcule los datos de acuerdo con el intervalo y necesite integrar los datos históricos.
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()
}
}
Primero, lea los datos del puerto TCP
yum install nc
nc -lk 8888
En segundo lugar, ejecute SparkStream para verificar la entrada de datos de tcp, si SparkStream se ha procesado y concéntrese en el procesamiento de datos históricos:
Piense personalmente en los puntos centrales:
1 función updateFunc
2 el operador de scala updateStateByKey, el punto de control que se debe hacer antes
Estos dos puntos no son fáciles de escribir, sugiero guardar el código. Modifique sobre esta base la próxima vez, no escriba desde cero