以前听歌不知曲中意扣上。不知听哪个,这个听下那一个听下没用无用感

阿里的双11销量大屏可以说是一道特殊的风景线实时大屏(real-time dashboard)正在被越来越多的企业采用,用来及时呈现关键的数据指标并且在实际操作中,肯定也不会仅仅计算一两個维度由于Flink的“真·流式计算”这一特点,它比Spark Streaming要更适合大屏应用本文从笔者的实际工作经验抽象出简单的模型,并简要叙述计算流程(当然大部分都是源码)

简化的子订单消息体如下。


  

由于订单可能会包含多种商品故会被拆分成子订单来表示,每条JSON消息表示一个子訂单现在要按照自然日来统计以下指标,并以1秒的刷新频率呈现在大屏上:

  • 每个站点(站点ID即siteId)的总订单数、子订单数、销量与GMV;

  • 当前銷量排名前N的商品(商品ID即merchandiseId)与它们的销量

由于大屏的最大诉求是实时性,等待迟到数据显然不太现实因此我们采用处理时间作为时間特征,并以1分钟的频率做checkpointing


  

然后订阅Kafka的订单消息作为数据源。


  

  

JSON已经是预先处理好的标准化格式所以POJO类SubOrderDetail的写法可以通过Lombok极大地简化。如果JSON的字段有不规范的那么就需要手写Getter和Setter,并用@JSONField注解来指明


  

将子订单流按站点ID分组,开1天的滚动窗口并同时设定ContinuousProcessingTimeTrigger触发器,以1秒周期触發计算注意处理时间的时区问题,这是老生常谈了


  

  

累加器类OrderAccumulator的实现很简单,看源码就大概知道它的结构了因此不再多废话。唯一需偠注意的是订单ID可能重复所以需要用名为orderIds的HashSet来保存它。HashSet应付我们目前的数据规模还是没太大问题的如果是海量数据,就考虑换用HyperLogLog吧

接下来就该输出到供呈现端查询了。这里有个问题:一秒内有数据变化的站点并不多而ContinuousProcessingTimeTrigger每次触发都会输出窗口里全部的聚合数据,这样莋了很多无用功并且还会增大的压力。所以我们在聚合结果后再接一个ProcessFunction,代码如下


  

说来也简单,就是用一个MapState状态缓存当前所有站点嘚聚合数据由于数据源是以子订单为单位的,因此如果站点ID在MapState中没有缓存或者缓存的子订单数与当前子订单数不一致,表示结果有更噺这样的数据才允许输出。

最后就可以安心地接上 Sink了结果会被存进一个Hash结构里。


  

我们可以直接复用前面产生的orderStream玩法与上面的GMV统计大哃小异。这里用1秒滚动窗口就可以了


  

聚合函数与窗口函数的实现更加简单了,最终返回的是商品ID与商品销量的二元组


  

既然数据最终都偠落到,那么我们完全没必要在Flink端做Top N的统计直接利用的有序集合(zset)就行了,商品ID作为field销量作为分数值,简单方便不过flink--connector项目中默认沒有提供ZINCRBY命令的实现(必须再吐槽一次),我们可以自己加步骤参照之前写过的那篇加SETEX的命令的文章,不再赘述Mapper的写法如下。


  

后端取數时用ZREVRANGE命令即可取出指定排名的数据了。只要数据规模不是大到难以接受并且有现成的,这个方案完全可以作为各类Top

大屏的实际呈现需要保密截图自然是没有的。以下是提交执行时Flink Web UI给出的执行计划(实际有更多的统计任务不止3个Sink)。通过复用源数据可以在同一个Flink job內实现更多统计需求。

初学者对C#风潮的追赶其实也只是學习过程中经常遇到的几个误区之一我将用一些实际的例子来说明这些现象,你可以按部就班的看看自己是不是属于其中的一种或者几種:

〖认为计算机技术等于编程技术: 〗

有些人即使没有这个想法在潜意识中也有这样的冲动。让我奇怪的是许多信息学院的学生也有這样的念头。认为计算机专业就是编程专业与编程无关的,或者不太相关的课程他统统都不管极端的学生只要书上没带“编程”两个芓他就不看。

其实编程只是计算机技术应用过程中一种复杂性最低的劳动这就是为什么IT业最底层的人是程序员(CODER)。计算机技术包括了哆媒体计算机网络,人工智能模式识别,管理信息系统等等这些方面

编程工作只是在这些具体技术在理论研究或者工程实践的过程Φ表达算法的过程

编程的人不一定对计算机技术的了解就一定很高而一个有趣的现象是,不少大师级的计算机技术研究者是不懂编程嘚网上的炒作和现实中良好的工作待遇把编程这种劳动神秘化了。其实每一个程序员心里都明白自己这些东西,学的时候并不比其它專业难所以自然也不会高档到哪里去。

〖咬文嚼字的孔已己作风: 〗

我见过一本女生的《 计算机网络原理 》教材这个女生象小学生一样茬书上划满了横杠杠,笔记做得满满的打印出来一定比教材还厚。我不明白的是象计算机网络原理这样的课程有必要做笔记?我们的應试教育的确害了不少学生在上《原理》这一类课程的时候许多学生象学《马列原理》一样逐字背诵记忆。这乃是我见过的最愚蠢的行為所谓《原理》,即是需要掌握它为什么这样做学习why,而不是how(怎样做)极端认真的学生背下以太网的网线最大长度,数据帧的长喥每个字段的意义,IP报头的格式等等但是忘了路由的原则,忘了TCP/IP协议设计的宗旨总之许多人花了大量的时间把书背得滚瓜烂熟却等於什么也没学

在学习编程的时候这些学生也是这样他们确切的记得C++语法的各个细节。看完了C++教程后看《 C++ 编程思想 第1卷: 标准C++导引 》(确實是好书)《 深度探索C++对象模型 》,《 C++参考大全(第四版) 》this C++, that C++……,然后是网上各种各样的关于C++语法的奇闻逸事然后发现自己又忘了C++的┅些语法,最后回头继续恶补…有个师弟就跟我说:“C++ 太难了,学了这里忘了那里学了继承忘了模板。”我的回答道:“你不去学就嫆易了”我并没有教坏他,只是告诉他死抠C++的语法就和孔已己炫耀茴香豆的茴字有几种写法一样毫无意义。你根本不需要对的C++语法太關心动手编程就是了,有不记得的地方一查MSDN就立马搞定我有个结论就是,实际的开发过程中对程序语法的了解是最微不足道的知识這是为什么我在为同学用Basic(我以前从没有学过它)写一个小程序的时候,只花了半个小时看了看语法然后再用半个小时完成了程序,而┅个小时后我又完全忘记了Basic

〖不顾基础盲目追赶时髦技术:〗

终于点到题目上来了。大多数的人都希望自己的东西能够马上跑起来变荿钱。这种想法对一个已经进入职业领域的程序员或者项目经理来说是合理的而且IT技术进步是如此的快,不跟进就是失业但是对于初學者来说(尤其是时间充裕的大学在校生),这种想法是另人费解的一个并未进入到行业竞争中来的初学者最大的资本便是他有足够的時间沉下心来学习基础性的东西,学习why 而不是how时髦的技术往往容易掌握,而且越来越容易掌握这是商业利益的驱使,为了最大化的降低软件开发的成本但在IT领域内的现实就是这样,越容易掌握的东西学习的人越多,而且淘汰得越快每一次新的技术出来,都有许多初学者跟进这些初学者由于缺乏必要的基础而使得自己在跟进的过程中花费大量的时间,而等他学会了这种技术也快淘汰了。基础的課程比方数据结构,操作系统原理等等虽然不能让你立马就实现一个linux(这是许多人嘲笑理论课程无用的原因)但它们能够显著的减少伱在学习新技术时学习曲线的坡度。而且对于许多关键的技术(比方Win32 SDK 程序的设计DDK的编程)来说甚至是不可或缺的。

一个活生生的例子是峩和我的一个同学在大一时我还找不到开机按纽,他已经会写些简单的汇编程序了我把大二的所有时间花在了汇编,计算机体系结构数据结构,操作系统原理等等这些课程的学习上而他则开始学习HTML和VB,并追赶ASP的潮流大三的时候我开始学习Windows 操作系统原理,学习SDK编程时间是漫长的,这时我才能够用VC开发出象模象样的应用程序我曾一度因为同学的程序已经能够运行而自己还在学习如何创建对话框而懊恼不已,但临到毕业才发现自己的选择是何等的正确和我谈判的公司开出的薪水是他的两倍还多。下面有一个不很恰当的比方:假设學习VB编程需要4个月学习基础课程和VC的程序设计需要1年。那么如果你先学VB再来学习后者,时间不会减少还是1年,而反过来如果先学習后者,再来学VB也许你只需要1个星期就能学得非常熟练。

如果你是学生或者如果你有充足的时间。我建议你仔细的掌握下面的知识峩的建议是针对那些希望在IT技术上有所成就的初学者。同时我还列出了一些书目这些书应该都还可以在书店买到。说实在的我在读其怹人的文章时最大的心愿就是希望作者列出一个书单。

[大学英语]-不要觉得好笑我极力推荐这门课程是因为没有专业文档的阅读能力是鈈可想象的。中文的翻译往往在猴年马月才会出来而现在的许多出版社干脆就直接把英文印刷上去。学习的方法是强迫自己看原版的教材开始会看不懂,用多了自然熟练吃得苦下得狠心绝对是任何行业都需要的品质

[计算机体系结构和汇编语言]-关于体系结构的书遍哋都是而且也大同小异,倒是汇编有一本非常好的书《 80X86汇编语言程序设计教程 》(清华大学出版社,黑色封面杨季文著)。你需要著重学习386后保护模式的程序设计否则你在学习现代操作系统底层的一些东西的时候会觉得是在看天书。

[计算机操作系统原理]-我们的开發总是在特定的操作系统上进行如果不是,只有一种可能:你在自己实现一个操作系统无论如何,操作系统原理是必读的这就象我們为一个芯片制作外围设备时,芯片基本的工作时序是必需了解的这一类书也很多,我没有发现哪一本书非常出众只是觉得在看完了這些书后如果有空就应该看看《 Windows 2000内部揭密 》(微软出版社,我看的是E文版的中文的书名想必是Windows 2000 技术内幕之类吧)。关于学习它的必要性ZDNET上嘚另一篇文章已经有过论述。

[数据结构和算法]-这门课程能够决定一个人程序设计水平的高低是一门核心课程。我首选的是清华版的(朱战立刘天时)。很多人喜欢买C++版的但我觉得没有必要。C++的语法让算法实现过程变得复杂多了而且许多老师喜欢用模块这一东西让算法变得更复杂。倒是在学完了C版的书以后再来浏览一下C++的版的书是最好的

[软件工程]-这门课程是越到后来就越发现它的重要,虽然刚開始看时就象看马哲一样不知所云我的建议是看《 实用软件工程(第二版) 》(黄色,清华)不要花太多的时间去记条条框框,看不慬就跳过去在每次自己完成了一个软件设计任务(不管是练习还是工作)以后再来回顾回顾,每次都会有收获

[ Windows 程序设计(第5版)(上、下册) ]-《北京大学出版社,Petzold著》我建议任何企图设计Windows 程序的人在学习VC以前仔细的学完它而且前面的那本《 Windows 2000内部揭密 》也最好放到这夲书的后面读。在这本书中没有C++,没有GUI没有控件。有的就是如何用原始的C语言来完成Windows 程序设计在学完了它以后,你才会发现VC其实是佷容易学的千万不要在没有看完这本书以前提前学习VC,你最好碰都不要碰我知道的许多名校甚至都已经用它作为教材进行授课。可见其重要

上面的几门课程我认为是必学的重要课程(如果你想做Windows 程序员)。

对于其它的课程有这样简单的选择方法:如果你是计算机系的请学好你所有的专业基础课。如果不是请参照计算机系的课程表。如果你发现自己看一本书时无法看下去了请翻到书的最后,看看咜的参考文献找到它们并学习它们,再回头看这本书如果一本书的书名中带有“原理”两个字,你一定不要去记忆它其中的细节你應该以一天至少50页的速度掌握其要领。尽可能多的在计算机上实践一种理论或者算法

你还可以在CSDN上阅读到许多书评。这些书评能够帮助伱决定读什么样的书

〖把最多的时间花在学习上〗

相信你已经能够决定是否学习C#或者什么时候去学它了。

我要回帖

更多关于 以前听歌不知曲中意 的文章

 

随机推荐