58 面试

来源:互联网 发布:新西兰留学利弊端 知乎 编辑:程序博客网 时间:2024/04/30 09:20

58 面试到时没有什么


被Spark的demo 给搞晕了。

附录Spark 在线和实时的统计。

架构图:



1.yum 安装一个 nc 


启动端口9999



2.编写 SparkStreaming 程序 


object  NetworkworkCount{    def main( args: Array[String]){        //设置日志级别        LoggerLevel.setStreamingLogLevels()        //创建sparkConf 并配置 本地模式        var conf =new SparkConf().setMaster("local[2]").setAppNamesetAppName("NetworkWordCount");        //设置DStream 批次的时间间隔为2s        var ssc=new StreamingContext(conf,Seconds(2));        //通过网络读取数据库        var lines=ssc.socketTextStream("192.168.10.101",9999);        //讲读到的数据用空格切成单词        var words=lines.flatMap( _.split("") );        //将单词进行分组求相同的单词出现的次数        var wordCounts=pairs.reduceByKey(_+_)        //打印结果的输出到控制台         wordCounts.print()         ssc.start();        ssc.awaitTermination();                }
  }
//启动Spark Steaming 程序:由于使用的是本地i的模式

注意: 要制定并行度,如在本地运行设置setMaster(""),相当于启动了2个线程

一个给recevier,一个给computer.如果是在集群中,必须要求可用的core数目大于1.


 4.启动Sparking Streaming 程序

在linux 端命令行输入单词

nc -lk 9999


5.在IEDA控制台中查看结果



每次在Linux短输入的单词次数被正确的统计出来,但是结果不能累加。

如果需要累加需要使用updateStateBykey(func) 来更新状态。


代码如下:


var updateFunc=(iter:Iterator[(String,Seq[Int]),Option[int]])=>{


//iter.flatMap{case(x,y,z)  => Some(y.sum+z.getOrElse(0)).map(m=>(x,m))  }




//主函数变化如下

def main (args: Array[String]){


LoggerLevel.setStreamingLogLevels()


var conf =new SparkConf().setMaster("").setAppName("")


var ssc=new StreamingContext(conf,Seconds(5));


//做checkpoint("c://aaa")

var lines=ssc.socketTextStream("","")


//reduceByKey 结果不累加

//var resut=lines.flatMap(_.split("").map((_,1))).reduceByKey(+)

//updateStateBykey 结果可以累加但是需要传入一个自定义的累加函数:updateFunc


var results=lines.flatMap(_.split("").map (_1)) .updateStateBykey(updateFunc,new HashPartitioner(ssc.sparkContext.defaultParallelism)

,true);

result.print()

ssc.start();

ssc.awaitTerminnation();





}




demo02: 


spark Streaming 整合kafka 完成网站点击流实时统计


1.安装并配置zk 

2,安装病配置kafka 


6.编写spark Streaming 应用程序


obejct UrlCount{


var updateFunc=(iterator:Iterator[( String,Seq[int],Optiones[Int]) ] )=){

iterator.flatMap{ case(x,y,z) => Some(y.sum+ z.getOrElse(0)). map(n=>(x,n))}


}


def main(args:array[String]){


//接收命令行的中的参数

var Array(zkQuorum,groupId,topics,numThreads,hdfs)=args


//创建sparkConf 并配置AppName

var conf =new SparkConf().setAppname("urlCount");


//创建StreamingContext

var ssc=new StreamingContext(conf,Sends(2));


//设置检查点

ssc.checkPoint(hdfs);


//设置topic 信息


var lines=KafkaUtils.createStream(ssc,zkQuorm,groupdID,topicMap,StoreLevevl.Memory_AND_DISK);


//切分数据,截取用户点击的url

var urls=lines.map(x=>(x.split("")(6),1))


//切分数据,截取用户点击的url

var urls=lines.map(x=>(x.split("")(6),1));


//统计url 点击量

var result=urls.updateStateByKey(updateFunc,new HashPartitioner(ssc.sparkContext,defalutParallslims),true);



result.print()

ssc.start()

ssc.awaitTermnation();






}
















0 0