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

来源:互联网 发布:建筑设计mars软件简介 编辑:程序博客网 时间:2024/05/29 18:49

本文的列子来自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 67572017-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 62632017-03-18 06:25:21----/home/hadoop/a/sparkstreamingtest4.txt generated安徽 淮北市 汽车淮北分公司 李亚 15305501 10484湖北 宜昌市 汽车宜昌分公司 刘丽娟 189086005 7269安徽 淮南市 汽车淮南分公司 尹芳 181096430 10085安徽 芜湖市 汽车芜湖分公司 许丽丽 155535300 6694湖北 武汉市 汽车湖北汽车服务分公司 谢真华 187181833 67572017-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.apacheimport 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)...