使用SparkStreaming实现词频累加统计
一、实验环境
Windows10+centos7+idea+spark+nc
二、需求分析
在服务端不断的产生数据,在SparkStreaming客户端持续统计服务端产生的单词的词频的总数
三、实验环境准备
1、启动hadoop集群
分别启动hdfs和yarn:
start-dfs.sh 和 start-yarn
启动整个hadoop集群:
start-add.sh
*两种启动方式选择一个即可
2、在hdfs中创建检查点,名字自定,
hadoop fs -mkdir -p /spark/checkpoint
并且为checkpoint赋权限,我这里需要,你们不一定需要
hadoop fs -chmod 777 /spark/checkpoint
3、检查服务器中是否安装nc,没安装的使用如下命令进行安装:
yum -y install nc
四、编程实现
1、编写代码
import org.apache.spark.storage.StorageLevel
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.streaming.{Seconds, StreamingContext}
object TotalNetworkWordCount {
def main(args: Array[String]): Unit = {
//创建SparkConf
val sparkconf = new SparkConf().setMaster("local[*]").setAppName("SparkStreamingTestOne")
//创建SparkContext
val sc = new SparkContext(sparkconf)
//利用SparkContext创建SparkStramingContext
val streamingContext = new StreamingContext(sc,Seconds(3))
//设置检查点
streamingContext.checkpoint("hdfs://ethan001:9000/spark/checkpoint")
//创建一个DStream,ethan002是我这里数据来源和安装nc服务器,6666是netcat服务的端口号
val datas = streamingContext.socketTextStream("ethan002",6666,StorageLevel.MEMORY_AND_DISK_SER)
//对一行数据进行分词
val words = datas.flatMap(_.split(" "))
//定义函数用于累计每个单词出现的次数
val addWordFunction = (currentValues:Seq[Int],previousValueState:Option[Int])=>{
//通过spark内部的reduceByKey按key规约,然后这里传入某key当前批次的Seq/List,再计算当前批次的总和
val currentCount = currentValues.sum
//已经进行累加的值
val previousCount = previousValueState.getOrElse(0)
//返回累加后的结果,是一个Option[Int]类型
Some(currentCount+previousCount)
}
//给每个单词标注 1
val pairs = words.map((_,1))
//调用累计函数持续统计服务器传入的单词词频
val result = pairs.updateStateByKey[Int](addWordFunction)
result.print()
//启动SparkStreaming实时计算
streamingContext.start()
//等待计算结束
streamingContext.awaitTermination()
}
}
2、在虚拟机中启动nc
启动命令:
nc -l -p 6666
3、执行SparkStreaming程序
在idea中启动sparkstreaming程序TotalNetworkWordCount
4、逐渐输入测试数据,输入后换行
- 输入1
- 输入2
- 输入3
5、实验结果
-
结果1
-
结果2
-
结果3
6、查看结果数据是否存检查点上
实验到此结束,如果您发现有错误的地方,**还望指正**,一起努力学习!