Sparkstreaming之实时数据流计算实例(Scala)

本文的列子来自http://blog.csdn.net/zfszhangyuan/article/details/52522974,部分内容做了相应的修改和添加


首先我们要做一个日志生产器,方便本地模拟线上环境:
直接上代码吧(原理是根据一个原始日志log,然后随机的从中挑选行添加到新生产的日志中,并且生产的数据量呈不断的增长态势)
[hadoop@h71 hui]$ vi FileGenerater.scala

import java.io._  
import java.text.SimpleDateFormat  
import org.apache.spark.{SparkConf, SparkContext}  
import java.util.Date  
import java.io.{PrintWriter}  
import scala.io.Source
  
import scala.util.matching.Regex  
object FileGenerater {  
  
  def main(args: Array[String]) {  
  
    var i=0  
    while (i<100 )  
    {
      val filename = args(0)  
      val lines = Source.fromFile(filename).getLines.toList  
      val filerow = lines.length  
      val writer = new PrintWriter(new File("/home/hadoop/a/sparkstreamingtest"+i+".txt" ))
      i=i+1  
      var j=0  
      while(j<i)  
      {
        writer.write(lines(index(filerow)))  
        println(lines(index(filerow)))  
        j=j+1  
      }  
      writer.close()  
      Thread sleep 5000  
      log(getNowTime(),"/home/hadoop/a/sparkstreamingtest"+i+".txt generated")
    }  
  }  
  def log(date: String, message: String)  = {  
    println(date + "----" + message)  
  }  
  /**
    * 从每行日志解析出imei和logid
    *
    **/
  def index(length: Int) = {  
    import java.util.Random  
    val rdm = new Random  
    rdm.nextInt(length)  
  }  
  def getNowTime():String={  
    val now:Date = new Date()  
    val datetimeFormat:SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")  
    val ntime = datetimeFormat.format( now )  
    ntime  
  }  
  /** 
    * 根据时间字符串获取时间,单位(秒) 
    * 
    **/  
  def getTimeByString(timeString: String): Long = {  
    val sf: SimpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss")  
    sf.parse(timeString).getTime / 1000
  }  
}

zhangfusheng.txt内容如下:
安徽 宿州市 汽车宿州分公司 王红岩 18955079 20538
浙江 嘉兴市 汽车海宁分公司 金韩伟 15305793 15703
安徽 滁州市 汽车滁州分公司 严敏 15385906 14403
湖北 武汉市 汽车湖北汽车服务分公司 张晴 18902923 10870
安徽 淮北市 汽车淮北分公司 李亚 15305501 10484
安徽 滁州市 汽车滁州分公司 王旭东 153055412 10174
安徽 淮南市 汽车淮南分公司 尹芳 181096430 10085
湖北 省直辖行政单位 汽车仙桃分公司 汤黎 189170533 9638
湖北 null 汽车潜江分公司 朱疆振 18996689 9479
安徽 宣城 汽车宣城分公司 李倩 18098229 9381
江苏 徐州 丰县分公司 李萍 18914805005 9340 归属地
安徽 滁州市 汽车滁州分公司 阚家萍 15304795 9180
广东 中山 汽车服务中心 农小萍 18070101 9095 归属地
湖北 孝感 汽车孝感分公司 黄燕平 189957628 8595 归属地
安徽 芜湖 null 邹恒清 18055349069 8537 归属地
江西 null 汽车江西分公司产品事业部(汽车服务分公司、互联网安全管理中心) 张凯 17118 8089
安徽 淮南市 汽车淮南分公司 李磊 18957707 8039
湖北 省直辖行政单位 汽车仙桃分公司 朱艳 189770380 8025
浙江 温州 汽车温州分公司(本部) 吴玉春 153050010 7729 归属地
安徽 淮北市 汽车淮北分公司 魏薇 15305232 7533
湖北 省直辖行政单位 汽车仙桃分公司 王雪纯 18972060 7405
湖北 宜昌市 汽车宜昌分公司 刘丽娟 189086005 7269
湖北 武汉市 汽车湖北汽车服务分公司 陶劲松 189182796 7209
安徽 淮北 汽车合肥分公司 刘洁 181561187 7108 归属地
湖北 null 宜昌电信公司 鲜艳 18908606 7000
安徽 淮北市 汽车淮北分公司 钱玉 105612841 6837
湖北 武汉市 汽车湖北汽车服务分公司 谢真华 187181833 6757
安徽 null 马鞍山公司 张颖 153096590 6710
安徽 芜湖市 汽车芜湖分公司 许丽丽 155535300 6694
安徽 合肥市 汽车合肥分公司 杨华丽 15305168 6666
安徽 铜陵市 汽车铜陵分公司 黄琳 153629216 6665
安徽 马鞍山 汽车马鞍山分公司 林花 13395726 6487
贵州 null 汽车贵州分公司10000号运营中心 陈宣宏 189101372 6421
安徽 合肥市 汽车合肥分公司 黄乐 153005266 6271
安徽 淮南市 汽车淮南分公司 赵乃艳 153058367 6263
湖北 武汉市 汽车湖北汽车服务分公司 蔡蕾 189076931 6218
湖北 null 汽车潜江分公司 陈晓辉 18996898 6176
安徽 马鞍山市 汽车马鞍山分公司 陈凤 15305365 6116
安徽 合肥市 汽车合肥分公司 李大燕 18096819 6036


注:原文章中的分隔符是\t,但是在Linux的vim中复制数据时就会把\t变成了空格,很蛋疼的,我这里索性就都改成了空格,省的到时候出错


运行上面的代码:

[hadoop@h71 hui]$ scala FileGenerater /home/hadoop/b/zhangfusheng.txt

湖北 武汉市 汽车湖北汽车服务分公司 谢真华 187181833 6757
2017-03-18 06:25:06----/home/hadoop/a/sparkstreamingtest1.txt generated
安徽 滁州市 汽车滁州分公司 严敏 15385906 14403
湖北 孝感 汽车孝感分公司 黄燕平 189957628 8595 归属地
2017-03-18 06:25:11----/home/hadoop/a/sparkstreamingtest2.txt generated
安徽 宿州市 汽车宿州分公司 王红岩 18955079 20538
安徽 淮北市 汽车淮北分公司 钱玉 105612841 6837
浙江 温州 汽车温州分公司(本部) 吴玉春 153050010 7729 归属地
2017-03-18 06:25:16----/home/hadoop/a/sparkstreamingtest3.txt generated
安徽 铜陵市 汽车铜陵分公司 黄琳 153629216 6665
湖北 null 宜昌电信公司 鲜艳 18908606 7000
安徽 null 马鞍山公司 张颖 153096590 6710
安徽 淮南市 汽车淮南分公司 赵乃艳 153058367 6263
2017-03-18 06:25:21----/home/hadoop/a/sparkstreamingtest4.txt generated
安徽 淮北市 汽车淮北分公司 李亚 15305501 10484
湖北 宜昌市 汽车宜昌分公司 刘丽娟 189086005 7269
安徽 淮南市 汽车淮南分公司 尹芳 181096430 10085
安徽 芜湖市 汽车芜湖分公司 许丽丽 155535300 6694
湖北 武汉市 汽车湖北汽车服务分公司 谢真华 187181833 6757
2017-03-18 06:25:26----/home/hadoop/a/sparkstreamingtest5.txt generated
湖北 武汉市 汽车湖北汽车服务分公司 陶劲松 189182796 7209
湖北 武汉市 汽车湖北汽车服务分公司 蔡蕾 189076931 6218
湖北 null 汽车潜江分公司 朱疆振 18996689 9479
安徽 淮北市 汽车淮北分公司 李亚 15305501 10484
安徽 合肥市 汽车合肥分公司 杨华丽 15305168 6666
湖北 省直辖行政单位 汽车仙桃分公司 王雪纯 18972060 7405

注意:还得在.bash_profile中的export CLASSPATH添加:/home/hadoop/spark-1.6.3-bin-hadoop2.6/lib/*,否则会报这个错:
[hadoop@h71 ~]$ scalac FileGenerater.scala 

FileGenerater.scala:3: error: object spark is not a member of package org.apache
import org.apache.spark.{SparkConf, SparkContext}  
                  ^
one error found

编写sparkstreaming代码:

import org.apache.spark.SparkConf  
import org.apache.spark.streaming._;  
object SparkStreaming {  
  
  def main(args: Array[String]) {  
    //开本地线程两个处理,local[4]:意思本地起4个进程运行,setAppName("SparkStreaming"):设置运行处理类  
    val conf = new SparkConf().setMaster("local[4]").setAppName("SparkStreaming")  
    //每隔5秒计算一批数据
    val ssc = new StreamingContext(conf, Seconds(5))  
    // 指定监控的目录  
    val lines = ssc.textFileStream("file:///home/hadoop/a")
    //按\t 切分输入数据
    val words = lines.flatMap(_.split(" "))
    //计算wordcount
    val pairs = words.map(word => (word, 1))
    //word ++
    val wordCounts = pairs.reduceByKey(_ + _)
    //排序结果集打印,先转成rdd,然后排序true升序,false降序,可以指定key和value排序_._1是key,_._2是value  
    val sortResult = wordCounts.transform(rdd => rdd.sortBy(_._2, false))
    sortResult.print()
    ssc.start() // 开启计算
    ssc.awaitTermination() // 阻塞等待计算
  }
}

将代码打成haha.jar并上传到Linux的/home/hadoop/spark-1.6.3-bin-hadoop2.6目录下,在运行FileGenerater.scala的同时运行SparkStreaming.scala
[hadoop@h71 spark-1.6.3-bin-hadoop2.6]$ bin/spark-submit --class SparkStreaming haha.jar

-------------------------------------------
Time: 1489789730000 ms
-------------------------------------------
(null,9)
(武汉市,7)
(汽车湖北汽车服务分公司,7)
(省直辖行政单位,5)
(汽车仙桃分公司,5)
(汽车合肥分公司,4)
(合肥市,4)
(汽车马鞍山分公司,4)
(汽车淮北分公司,3)
(汽车滁州分公司,3)
...


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小强签名设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值