2016年11月22日星期二

10 Online Big Data Courses

1. Udacity
Udacity is a MOOC (Massive Open Online Course), so-called because it aims to be “audacious for you, the student”. Dumb name aside, Udacity has dozens of courses tailored to skill levels, from people who are entirely new to tech to proficient computer scientists. They start with Intros to Computer Science, Descriptive Statistics and Inferential Statistics, then progress to more in-depth, tech-specific tutorials focused around R, MongoDB, Machine Learning and more. The courses aren’t free- the “Intro to Computer Science” is $150 a month- but you do get a 14-day free trial to decide if the course is right for you.

2. EMC
Big data “technology has evolved faster than the workforce skills to make sense of it and organizations across sectors must adapt to this new reality or perish”, reads the ominous course blurb for EMC’s Big Science and Big Data Analytics course. Luckily, EMC are here to help you adapt to the rapidly-evolving big data environment, walking you through basic and advanced data analysis methods, as well walking you through the basic tools of the trade and the end-to-end analytics lifecycle. However, EMC isn’t cheap- the starter kit is $600, and the full course will set you back $5,000.

3. Coursera
Coursera is also a MOOC, and it’s completely free. All of the courses are taught in conjunction with a leading University- so you can learn Data Science with the University of Washington’s Bill Howe, Machine Learning with Stanford’s Andrew Ng, or Statistics with Alison Gibbs & Jeffrey Rosenthal of the University of Toronto. Course durations vary wildly between programmes (Data Science is 8 weeks, Statistics is 47), and stipulate recommended working hours per week (typically between 5 and 10). Coursera is a fantastic free resource for those looking to take the first steps into data science exploration.

4. CalTech’s Learning from Data
CalTech offer a free introductory course to machine learning online, with video recordings of lectures by Professor Yaser Abu-Moustafa. The course covers the basic theory and algorithms related to machine learning, as well as a variety of of commercial, financial and medical applications. Complete with 8 homework sets and a final exam, this a great taster of machine learning for the self-motivated.

5. MIT Open Courseware
While not a course in itself, OCW is an initative by the Massachusetts Institute of Technology to publish all of their course materials online, and make the accessible to all. Whilst this has the obvious disadvantage of no hands-on teaching, it is a great opportunity to explore the course materials (including exam papers as well as recommended reading) of one of the best STEM schools in the world. Check out Data Mining and Advanced Data Structures for a taste.

6. Jigsaw Academy
Jigsaw Academy is an online school based out of India, specialising in Analytics. They offer courses for beginner, intermediate and advanced levels, ranging from a broad overview of analytics for total newcomers, to in-depth investigations of analytics in finance and retail. They’re currently offering their Beginner’s course at a discounted price of Rs. 8,000 for students in India, and $149 for international students.

7. Stanford’s OpenClassroom
OpenClassroom‘s tagline is: “Full courses. Short Videos. Free for everyone.”  Which pretty much sums up everything you need to know about the initiative. A particular highlight is the machine learning course, devised by Andrew Ng (whose course also appears on Coursera, of which he is the co-founder). The course takes you through everything from Linear Regression to Naive Bayes algorithms, and the course image is a dog in a wizard hat. If that’s not enough to convice you to take a look, I don’t know what is.

8. Big Data University
Big Data University offer courses across the big data and data science ecosystem, including database-specific training, real-time analytics, 11 different courses on Hadoop and even relational management systems for beginners. The courses are self-paced, and mostly free (although you do sometimes have to pay to access the specific technologies, such as IBM SmartCloud Enterprise).

9. Code School
Code School offer many courses on specific programming languages, such as R, Java, and a course on mastering Github. Not all of their courses are free, but some of them (including Try R, helpfully) are. Their courses are also broken up into “Levels”, and Code School is by far the best-looking website on this list, if that swings it for you.
10. Udemy
Udemy is a MOOC based out of Silicon Valley, with the simple mission of allowing anyone to learn anything. With 4 million students, 10 thousand instructors and 10 million course enrollments, they’re well on their way. If you search for “Big Data” in their courses, there are over 160 results, helping you to learn anything from mastering Hadoop to developing a big data strategy for your business. Since Udemy is home to so many different instructors with different levels of qualification and experience, price and quality vary considerably, but it’s still worth having a look at what’s available for pretty modest costs

 

2016年11月12日星期六

K-means聚类算法

 

     K-means也是聚类算法中最简单的一种了,但是里面包含的思想却是不一般。最早我使用并实现这个算法是在学习韩爷爷那本数据挖掘的书中,那本书比较注重应用。看了Andrew Ng的这个讲义后才有些明白K-means后面包含的EM思想

     聚类属于无监督学习,以往的回归、朴素贝叶斯、SVM等都是有类别标签y的,也就是说样例中已经给出了样例的分类。而聚类的样本中却没有给定y,只有特征x,比如假设宇宙中的星星可以表示成三维空间中的点集。聚类的目的是找到每个样本x潜在的类别y,并将同类别y的样本x放在一起。比如上面的星星,聚类后结果是一个个星团,星团里面的点相互距离比较近,星团间的星星距离就比较远了

     在聚类问题中,给我们的训练样本是,每个,没有了y

     K-means算法是将样本聚类成k个簇(cluster),具体算法描述如下:

1 随机选取k个聚类质心点(cluster centroids)为

2 重复下面过程直到收敛 {

               对于每一个样例i,计算其应该属于的类

              

               对于每一个类j,重新计算该类的质心

              

}

     K是我们事先给定的聚类数,代表样例ik个类中距离最近的那个类,的值是1k中的一个。质心代表我们对属于同一个类的样本中心点的猜测,拿星团模型来解释就是要将所有的星星聚成k个星团,首先随机选取k个宇宙中的点(或者k个星星)作为k个星团的质心,然后第一步对于每一个星星计算其到k个质心中每一个的距离,然后选取距离最近的那个星团作为,这样经过第一步每一个星星都有了所属的星团;第二步对于每一个星团,重新计算它的质心(对里面所有的星星坐标求平均)。重复迭代第一步和第二步直到质心不变或者变化很小

     下图展示了对n个样本点进行K-means聚类的效果,这里k2

    

     K-means面对的第一个问题是如何保证收敛,前面的算法中强调结束条件就是收敛,可以证明的是K-means完全可以保证收敛性。下面我们定性的描述一下收敛性,我们定义畸变函数(distortion function)如下

    

     J函数表示每个样本点到其质心的距离平方和。K-means是要将J调整到最小。假设当前J没有达到最小值,那么首先可以固定每个类的质心,调整每个样例的所属的类别来让J函数减少,同样,固定,调整每个类的质心也可以使J减小。这两个过程就是内循环中使J单调递减的过程。当J递减到最小时,c也同时收敛。(在理论上,可以有多组不同的c值能够使得J取得最小值,但这种现象实际上很少见)

     由于畸变函数J是非凸函数,意味着我们不能保证取得的最小值是全局最小值,也就是说k-means对质心初始位置的选取比较感冒,但一般情况下k-means达到的局部最优已经满足需求。但如果你怕陷入局部最优,那么可以选取不同的初始值跑多遍k-means,然后取其中最小的J对应的c输出

     下面累述一下K-meansEM的关系,首先回到初始问题,我们目的是将样本分成k个类,其实说白了就是求每个样例x的隐含类别y,然后利用隐含类别将x归类。由于我们事先不知道类别y,那么我们首先可以对每个样例假定一个y吧,但是怎么知道假定的对不对呢?怎么评价假定的好不好呢?我们使用样本的极大似然估计来度量,这里是就是xy的联合分布P(x,y)了。如果找到的y能够使P(x,y)最大,那么我们找到的y就是样例x的最佳类别了,x顺手就聚类了。但是我们第一次指定的y不一定会让P(x,y)最大,而且P(x,y)还依赖于其他未知参数,当然在给定y的情况下,我们可以调整其他参数让P(x,y)最大。但是调整完参数后,我们发现有更好的y可以指定,那么我们重新指定y,然后再计算P(x,y)最大时的参数,反复迭代直至没有更好的y可以指定

     这个过程有几个难点,第一怎么假定y?是每个样例硬指派一个y还是不同的y有不同的概率,概率如何度量。第二如何估计P(x,y)P(x,y)还可能依赖很多其他参数,如何调整里面的参数让P(x,y)最大。这些问题在以后的篇章里回答

     这里只是指出EM的思想,E步就是估计隐含类别y的期望值,M步调整其他参数使得在给定类别y的情况下,极大似然估计P(x,y)能够达到极大值。然后在其他参数确定的情况下,重新估计y,周而复始,直至收敛

     上面的阐述有点费解,对应于K-means来说就是我们一开始不知道每个样例对应隐含变量也就是最佳类别。最开始可以随便指定一个给它,然后为了让P(x,y)最大(这里是要让J最小),我们求出在给定c情况下,J最小时的(前面提到的其他未知参数),然而此时发现,可以有更好的(质心与样例距离最小的类别)指定给样例,那么得到重新调整,上述过程就开始重复了,直到没有更好的指定。这样从K-means里我们可以看出它其实就是EM的体现,E步是确定隐含类别变量M步更新其他参数来使J最小化。这里的隐含类别变量指定方法比较特殊,属于硬指定,从k个类别中硬选出一个给样例,而不是对每个类别赋予不同的概率。总体思想还是一个迭代优化过程,有目标函数,也有参数变量,只是多了个隐含变量,确定其他参数估计隐含变量,再确定隐含变量估计其他参数,直至目标函数最优

 

2016年11月5日星期六

如何拥有职场中的Growth Mindset

斯坦福大学教授社会心理学教授Carol Dweck提出的Growth Mindset(成长型思维模式)理念近年来获得诸多欧美精英人士的推崇,其中包括微软CEO Satya。研究表明,拥有 Growth Mindset 的人相信能力是通过努力不断提高的,失败和挑战是提高过程中必不可少的环节。换句话说,只要勇敢拥抱变化,乐观从容地面对艰难,坚守本心去奋斗拼搏,每个人都能谱写出自己的职场赞歌。


 

微软将"Growth Mindset"作为公司文化转型中的重要方向,并为员工发挥潜能提供更多的支持与帮助。同时,作为多元与包容文化(Diversity & Inclusive,简称:D&I)的倡导者和践行者,鼓励职场女性运用Growth Mindset为自己和世界创造不一样的精彩。日前,以Growth Mindset为核心,面向微软员工的全球女性大会和社会职场女性的微软女性论坛Women Think Next相继登陆北京。来自微软、瑞银、天士力、东芝等等不同公司、领域的杰出女性代表,分享了她们的成长历程以及对 Growth Mindset 的感悟。
 

你知道为什么有些人好像做什么事都很成功,而另外一些人则很无助,生活中有不断的失败吗?Carol  Dweck决心要找到其中的原因。于是她开始观察小孩子,并企图从两组不同的小朋友中找到他们之间的差异,以及问题的答案。她给小朋友出了不同难度的习题,结果自然是有成功的,有失败的。真正让Dweck震惊的,是那些成功的小朋友的做法――他们不仅仅能够接受失败,而且他们喜欢失败!当题变得越来越困难的时候,他们并没有开始责难自己;他们舔一下自己的嘴唇,然后说道:"我喜欢接受挑战。"


 

Dweck发现,这些孩子们之间的差异在于思维模式


 

Dweck先前一直以为:"一个人的天赋是确定的。你要么聪明,要么就不聪明。假如你失败了,也就意味着你不够聪明。"这也是为什么,当那些无助的孩子开始失败的时候,他们就无法接受现实了――因为失败仅仅是告诉他们,他们弱爆了(自己是那么容易就困惑,自己的记性是如此不好)。Dweck将这种想法称为"固定型思维模式"(Fixed Mindset),即认为你的能力是确定的,这世界只是一系列的测试来告诉你你的能力怎么样。而那些成功孩子的观念恰恰相反,他们认为:所有的事情都离不开个人努力,而这个世界上也充满了有趣的挑战来帮助你学习成长。Dweck将其称为"成长型思维模式"(Growth Mindset)。这也就是为什么他们在碰到更难的智力拼图时会那么兴奋――因为那些简单的题目不具有挑战性,他们从中也学不到任何东西。但是那些难题就不一样了。这些题简直太棒了――可以让他们发展一个新技能,或者征服一个新问题。


 

在那些有固定型思维模式的人看来,成功来源于证明你自己有多棒。努力是一个不好的预兆――假如你需要努力尝试,还要不断地问问题,那显然说明你不够优秀。而当这些人找到了自己能够做好的事情时,他们就会想着重复做这件事,以显示自己对这东西有多么在行。而在那些有成长型思维模式的人看来,成功来源于成长,而这当中的精髓就是努力――因为只有努力才会成长。当他们对某件事情已经非常擅长的时候,就会把它放在一边,并继续找那些更有挑战性的事情,这样来保持持续地成长。


 

具有固定型思维模式的人会在自己不犯错误的时候觉得自己很聪明,而有成长型思维模式的人会在自己为某件事苦苦挣扎,并最终找到解决方案时觉得自己很聪明。当事情不顺利的时候,前者会埋怨整个世界,而后者会想着如何改变自己。前者会害怕努力地去尝试,因为一旦他们失败了,就说明他们是一个失败的人,而后者永远不会惧怕尝试。


 

固定型思维的人会说:"如果你失败了呢?你会是个失败者。"而成长型的人会说:"大多数成功的人都是一路失败来的。"变得更好的第一步是相信你可以变得更好。

18年海外工作经历,让刘晓煜成为联想收购IBM后,柳传志相中的推进联想国际化项目、培养国际化团队的核心人才。"做这个决定并不容易", 刘晓煜说,"那时候我只想安心生了宝宝,而且,联想是制造业,我没有计划过回国加入一个制造业的企业。"但在柳传志、杨元庆"你要帮助中国企业走出国门"之类上升到民族情怀的游说下,刘晓煜热血沸腾了。于是,在20077月,刘晓煜生完孩子月子都没坐完,就举家从海外回到中国。
 

当时正值收购整合,两种文化的碰撞让刘晓煜的工作有些"煎熬","两家公司文化差异很大,联想是指哪打哪,看到哪有问题就去解决,执行力强,IBM则是流程文化。中国团队认为我是说中文的,是他们那拨的,美国团队认为我英文那么好又是海外回来的,应该他们那拨的。"其实,这些都是表象,当时联想面临严峻的挑战,很重要的原因是收购和整合中的运营消耗。刘晓煜用不到一年的时间,将84人的国际化团队扩展到700人,运营160个国家和地区的项目。700多人是刘晓煜从北大、清华等名校招聘到的一群优秀的毕业生,当然也是"娃娃兵"。但刘晓煜愿意给他们一个国际化的舞台,"只要你愿意成长,你一天可以工作16个小时,但是,你要记住这16个小时就是你成长的16个小时,所以,当时的团队非常拼。"彼时,杨元庆还没回归CEO的位置,时任的CEO质疑刘晓煜的娃娃兵。"我看起来笑眯眯的,其实是个个性非常坚持的人,面对CEO这样的质疑,我把军令状'拍'到了他眼前:做不成功我就辞职。" 刘晓煜说。 


 

因为是国际项目,工作起来真的好似"日不落",各种时间都在开会、出差,甚至包括晚上陪孩子的时间。以至于刘晓煜的儿子在幼儿园被问及妈妈的工作是什么的时候,孩子会用"Meeting"来回答。因为正在哺乳期,刘晓煜开会、出差还要兼顾孩子的哺乳,所以,"挤奶"就变成一件非常重要的事情,无论是开会还是出差,这是必修课。她家冰箱里密密麻麻全是一包包的奶,就这样,刘晓煜坚持喂奶喂了一年零两个月。


 

后来,刘晓煜带的团队受到了各方的挖角,IBM、埃森哲等等公司出2~3倍的价钱来挖人……"现在回头再看会发现,当你觉得痛苦的时候,就是你成长的时候,市场价值终会证明你的价值。而且,这个过程中,还能学会很多钱都换不来的经验和体悟。" 

对职业女性来说,有些"痛苦"的选择是必须做的,比如有了孩子之后是回归家庭还是继续在职场上打拼?来自台湾的陈梅明女士曾在事业如日中天时选择回归家庭,理由是"用自己的十年换女儿的一生"。但是,这十年间她并未间断自己的学习和积累。待女儿读高中后,她加入瑞银。"二度就业"的她在陌生的环境与年青人一起打拼,以"扫马路"的方式一家一家打开人脉,连续四年做到公司的全国前三名。她认为自己是幸运的,因为相比很多努力了却没有收获的人,她的努力能看到成果。Growth Mindset 理念令她重返职场时能够平静地坚持,在一次次的不确定中找到属于自己的一片天。
 

陈杨秋加入日立已经18年了,2014开始,担任日立中国研究开发有限公司总经理。在年功序列文化的日本企业、在男性扎堆的技术工作领域,陈杨秋是如何做到"鹤立鸡群"的?陈杨秋的法则很简单:第一,要有女性意识,第二,不要有女性意识。凡事要有自己的见解,并有推动事情前进的能力。


 

第一,要有女性意识。"我们公司有40%的女性员工,而且都是理工科毕业的。我觉得女性就应该要时尚、要精致,要让自己美美的,这不仅会让自己心情好,也是对自己和他人的尊重。同时,在与人沟通的时候,你要温和、要微笑。这样自己也心情好,这是一个女性意识。另外,在跟人沟通时候,你要温和、要微笑,这都是女性很重要的特点。" 陈杨秋说。第二则是不要有女性意识,要有距离感、要独立思考。"有时候在一些企业中,服从是文化,但我认为在职场,无论男女,不需要永远说'是''知道了',是可以说'NO'的,是可以说'事情不是这样,而是怎样的'。"作为一个职场人,你需要对事情有自己的思考和见解。"当然,凡事不是为反对而反对,你需要提出自己的想法和见解,并且能提出方案推动它。"在陈杨秋看来,这些职场法则是不分男女的。

 

相较而言,女性会被认为不太适合做研发,陈杨秋作为一个技术领域的女性领导者,会怎么看女性在技术领域的发展?"这个问题我想从内外两个视角看。" 陈杨秋说,"从外看,在科学、研发领域,女性并没有什么弱势,相反,女性坚忍不拔、有逻辑、系统分析事情等特质使得很多女性在一些科研领域非常优秀,我有很多女性朋友都是这个领域的。所以,我们在公司内部也在做很多努力,研究怎样把女性领导人和女性研发推上更高的岗位,或者让她们取得更大的成就。"但在陈杨秋看来,更重要的是女性自身怎么看这个问题,就好像她自己从最初的政府机关,到外企,再到外企的研发部门。"好像并没有给自己非常远大的规划,就是看下步想做的、喜欢的是什么。" 陈杨秋说,"你可以称这个为'跟着感觉走',但感觉的背后一定是热爱。我们的人生,有2/3的时间是在工作,如果不能遵从内心的选择,做你喜欢的事情,因为成就而开心,因为热爱而执着,那工作就会变成煎熬。无论是技术还是其他,你热爱它,并付出努力,自然而然就会站到一个制高点。那些科学家、女科学家其实与我们没有什么不同,最不同的,就是他们对科学的热爱和坚持。"


 


张冬梅

微软亚洲研究院 软件分析组首席研究员

 

微软亚洲研究院软件分析组首席研究员张冬梅一直希望 "用科学改变世界"。她将女性的智慧融入硬科技中,使科技更好地服务于人、造福于人。


 

与初入职场时的状态不同,带团队,成为了成长中职场人的必修课。


 

张冬梅也不例外。如何让大家跟自己一样有洋溢的热情和坚毅的追求?如何激发大家的热情,让大家向着一个目标前进? 作为研究组内唯一的女性,且身为领导的她认为领导(Leading)比管理(Managing)更为重要。

在科研环境中,研究员对自己的专业发展和研究方向都有自己的理解。作为团队领导,要能引导大家分享各自的想法,这样才会产生更多更好的想法。女性领导的特点,是我们能够敏锐地捕捉到分歧和不同,对引导和解决问题可以起到非常重要的作用。这是很好的女性特征的体现,我们在工作中自然地发挥出来,我们就有可能把团队非常好地团结在一起。


 

带领团队,领导力是最重要的。你需要找到激发大家让大家觉得这件事情真的是很有意思、很值得去投入的能力,这并不容易。不管是从你的理念,还是你的想法出发,激发了他人自己个人能力的挖掘,这也是一种激励。"冬梅说,"所以,我觉得最重要的还是大家在理念上能够匹配在一起,因为做的东西不见得是一样的,方向也不见得是一样的,但如果你能有一种理念,长期地通过项目和大家在一起工作,并使其成为一种文化性的东西的话,大家会认同,这样大家做起事情来就比较能够协调。"


 

其次,在冬梅看来,团队的多样性也非常重要。领导者更应该做到的是尊重每个人的风格和听取来自不同方向的声音。"讨论问题时候对事不对人,如果真的涉及到工作方式则下面沟通。久而久之,大家就会知道我们需要的是把事情做好。因为做研究如果不是一流的,就很容易被人超越。我们都要树立对自己的高要求。领导者就是表率。" 


 

张冬梅坦言,人的职业发展最终需要的是自我的驱动,公司提供条件和环境, "公司鼓励你对自己的职业发展有想法,鼓励你在日常的工作中学习你自己想要发展的这些技能。在微软是'10%~20%~70%法则'。70%是在岗学习,你每天的工作就是一个学习的过程,你要增长的才干大部分要在这方面体现。另外20%是向他人学习,实际上是同事之间从别人身上来学习,互相交流。还有10%是公司会提供一些培训的机会。


 

但无论如何,个人的职业生涯其实还得靠自己去主张,公司可以给你提供制度,提供便利条件,甚至是让你可以找更好的导师。但是,实际上自己的职业生涯还是得自己有一个想法和目标,还是自己的愿望和目标主观能动性更重要。而对更多的年轻人而言,张冬梅始终认为,在职场"成长思维非常重要"因为,"成长比成功更重要"。


 
武红的名字也许人们不是太熟悉,但说到博鳌论坛,现在知道的人一定不少。而武红就是首届博鳌论坛的重要参与者。

 

2001年的时候,中国财经领域并没有在国际上叫得响的经济论坛,人们好像只知道达沃斯。一群人为了让亚洲在世界上发出更大声音,开始筹建博鳌亚洲论坛。武红就是博鳌论坛最初的参与者。她和其他三个姐妹,成立了工作小组,负责博鳌论坛的前期策划和宣传任务,"真的是从无到有,从Logo的设计、网站建设到议题,每一件事情所有的细节我都参与过"。从此,也跟博鳌结下了不解之缘。

 

那时博鳌只是海南一个小渔村,很多人甚至把"鳌"读成"鳖",但如今已经有很多专业人士把博鳌亚洲论坛同达沃斯论坛相提并论。

 

"做这样国际级别的会议,一是要有激情,二是要踏实和注重细节,外交无小事。比如每个领导坐什么车、如果是火车坐哪个车厢、领导和领导之间如何排座位……这些都需要连夜跟大使们沟通排好。"武红回忆说,"现在想想当时也是够有勇气的,什么都没有就敢开始做。但也是通过这样的过程,你会发现人,尤其是女人当内心强大起来之后,很多事情就都能做到并能做好。女性是有这样的潜质的。"

其实无论是博鳌论坛刚开始的几年还是现在,那些位高权重的人群中,女性领导者还是凤毛麟角。在这样一个由强势男性参与者为多的论坛活动中,武红练就了怎样的沟通技巧呢?武红说,在跟一些强势的男性领导者沟通的时候,女性需要利用自身善于沟通的特长,柔软下来,即便是在讲述不同意见的时候,不需要'女强人'气势。另外,在工作的时候,女性也不能过于感性,否则就会被认为��嗦和叽叽歪歪,不职业,尤其工作遇到困难的时候,理性才是帮助思考和解决的问题的钥匙。"

现在,武红在做一个新的平台,以传播科学家和科学思想为核心。"科学一定是影响中国未来的重要因素"武红说,"我想,我是个有勇气并且有些理想主义的人,我一路坚守理想从来没有放弃,做自己感兴趣的,做一睁开眼睛就觉得兴奋的事情。这才是最幸福的。"

成长型思维模式的养成,固然很大程度上取决于个人的自我提升、心智历练,但也需要一个健康的环境,鼓励每个人对用于面对挫折,尝试创新。在职场中,成长型思维模式的养成,也与企业文化息息相关。研究表明,在工作效能(Task Performance)方面,具有多元性文化的企业要比单一文化的企业高出20%。换句话说,多元与包容性文化更利于激发团队成员的创新潜能,这特别有助于成长型思维模式的养成。

上述优秀职场女性所在的企业大都倡导多元文化,这些公司相信,由多元化团队创造的技术,才有潜力去服务地球上的每一个人。公司中的导师计划、职业发展辅导、轮岗学习等多种形式的支持,并共同发掘"她"经济的机遇。

超越批处理的世界:流计算

 

今日,流式数据处理是大数据里的很重要一环。原因有不少,其中包括:


 

        商业(竞争)极度渴望更快的数据,而转换成流计算则是一个好的方法来降低延迟。

        海量的、无穷数据集在现在的商业环境里变的越来越常见,而用专门设计来处理这样数据的系统来应对这些数据则更为容易。

        在数据到达时就对他们进行处理能够更加平均地把负载进行均衡,取得更好的一致性和更可预测的计算资源消耗。


 

尽管业务驱动带来了对流计算兴趣的猛增,但绝大部分现有的流计算系统相比于批处理还不够成熟,而后者已经产生了很多令人激动的、多产的应用。


 

作为从事海量大规模流计算系统的从业者(在谷歌工作超过五年,开发了MillWheelCloud Dataflow),我很高兴能看到对于流计算的时代热潮。考虑到批处理系统和流计算系统在语义上的不同,我也很愿意来帮助大家来理解流计算的方方面面,如它能做什么?怎么使用它最好?O'Reilly的编辑邀请我就我在2015 Strata+Hadoop World伦敦大会上的演讲《对批处理说再见》写一些文字的东西。这就是你所看到的这篇博文。


 

1.      流计算:主要介绍一些基础背景知识,澄清了一些技术术语。随后会进入技术细节,关注时间域的内容,并对常见的数据处理方法(包括批处理和流计算)做一个高层次的总览。


 


 

好的,下面会有很长的内容,让我们变成技术狂吧。


 

  

背景
 


 

开始我会介绍一些对我们理解后文的内容很重要的背景知识。我会分三个主题来讲:


 

        技术术语:为了能精确地讲解复杂的题目,必须对相关术语做精确的定义。对于一些已经被滥用的术语,我也会很明确地说明我用它们时的意思。

        能力:我会对一些反复感受到的流计算系统的缺点做一些评论。我也会提出我所认为的数据处理系统的建造者应采用的基本思路,基于这样思路构建的系统或可以应对现代数据消费者不断增长的需求。

        时间域:我会介绍与数据处理相关的两个主要时间域概念,解释他们是如何相关的,并给出这两个域所带来的一些难题。


 

  

技术术语:什么是流计算
 


 

在继续前行前,让我们先解决一个重要问题:"什么是流计算?"。尽管文章到这里为止我也是在随意的用着这个名词。流计算这个词有很多不同的意思,这就导致了关于到底什么是流计算或者到底流计算系统能做什么的误解。正因如此,我愿意在这里先精确地定义它。


 

这个问题的难点在于很多术语本应该被描述成他们是什么(例如无穷数据处理和近似结果处理),但却被描述为他们过去是怎么被实现的(例如通过流计算执行引擎)。缺乏精确的定义模糊了流计算真正的意思,在某些场合下它还被贴上了它的能力仅限于"流"的那些特征(如近似结果、推测结果处理)的标签。鉴于良好设计的流计算系统能与现有的批处理引擎一样产生准确、一致和可再现的结果,我更愿意把流计算非常明确地定义为:一种被设计来处理无穷数据集的数据处理系统引擎。仅此而已。考虑到完整性,需要强调的是这个定义不仅包含了真正的流计算实现,也包括微批处理(micro-batch)的实现。


 

下面是与流计算相关的其他几个经常出现的术语,我也给出了更精确和清晰的解释。希望业界能够采纳和使用。


 

1.      无穷数据Unbounded data):一种持续生成,本质上是无穷尽的数据集。它经常会被称为"流数据"。然而,用流和批次来定义数据集的时候就有问题了,因为如前所述,这就意味着用处理数据的引擎的类型来定义数据的类型。现实中,这两类数据的本质区别在于是否有限,因此用能体现出这个区别的词汇来定性数据就更好一些。因此我更倾向于用无穷数据来指代无限流数据集,用有穷数据来指代有限的批次数据。

2.     
 

3.      无穷数据处理Unbounded data processing):一种发展中的数据处理模式,应用于前面所说的无穷数据类型。尽管我本人也喜欢使用流式计算来代表这种类型的数据处理方式,但是在本文这个环境里,这个说法是误导的。用批处理引擎循环运行来处理无穷数据这个方法在批处理系统刚开始构思的时候就出现了。相反的,设计完善的流计算系统则比批处理系统更能承担处理有穷数据的工作。因此,为了清晰明了,本文里我就只用无穷数据处理。

4.     
 

5.      低延迟,近似和/或推测性结果Low-latencyapproximateand/or speculative results):这些结果和流处理引擎经常关联在一起。批处理系统传统上不是设计来处理低延迟或推测性结果这个事实仅仅是一个历史产物,并无它意。当然,如果想,批处理引擎也完全能产生近似结果。因此就如其他的术语,最好是用这些术语是什么来描述这些结果,而不是用历史上它们是用什么东西(通过流计算引擎)产生的来描述。


 

此后,文里任何地方我使用术语"流计算",我就是指为无穷数据集所设计的处理引擎,仅此而已。当我使用上述任何术语时,我就会明确说无穷数据、无穷数据处理,或低延迟,近似和/或推测性结果。这些也是我在Cloud Dataflow里使用的术语,我也建议业界去使用。


 

  

流计算的最夸张的限制
 


 

下面让我们看看流计算系统能和不能做什么,重点是能做什么。在这个博文里我非常想让读者了解的一件事便是一个设计合理的流计算系统能做什么。长久以来,流计算系统被认为是专为提供低延迟、不精确/推测性结果的某些特定市场而设计,并配合一个更强大的批处理系统来提供最终准确的结果,如Lambda架构(Lambda Architecture)。


 

对于不熟悉Lambda架构的读者,它的基本思想就是与批处理系统一起运行流计算系统,同时进行几乎一样的计算。流计算系统提供低延迟、不准确的结果(或是因为使用了近似算法,或是因为流计算系统本身没能提供足够准确的结果),而一段时间之后当批处理计算完成,再给出正确的结果。这个架构最初是由推特的内森•马兹(Natan MarzStorm的发明人)提出的,结果在当时非常成功。因为在当时这是一个非常好的主意:流计算引擎在正确性方面还令人失望,而批处理引擎则是固有的缓慢和笨重,所以Lambda就给出了一套现成的解决方案。不幸的是,维护Lambda系统是一个麻烦:需要搭建、部署、维护两套独立的数据流管道系统,并将两个系统产生的结果在最后进行某种程度的合并。


 

作为曾多年从事强一致流计算引擎的从业者,我认为Lambda架构的基本原理是有问题的。不出意外,我是杰伊•克雷普(Jay Krep)的博文《质问Lambda架构》的超级粉丝。很高兴的,下面是反对双模式运行必要性的很好的陈述之一。克雷普通过使用可重放的系统(如Kafka)作为流计算交汇点来解决重复性的问题,并更进一步的提出"Kafka架构"。此架构的基本思路就是使用单套合理设计的引擎作为数据流管道来处理Lambda关注的任务。虽然我并不认同这个概念需要一个名字,但是我完全支持这个观点里的基本原理。


 

实话实说,我愿意更进一步。我认为设计良好的流计算系统的能力是批处理系统的功能的超集(包含关系)。或许排除增量的效益,未来将不再需要如今日的批处理系统1Flink基于这个想法开发了一套完全流计算模式的系统(同时也支持批处理模式)的做法是值得称赞的。我喜欢他们的工作!


 

上述思路的必然结果就是,结合了鲁棒的框架、并不断成熟的流计算系统可以充分应对无穷数据,也终将会把Lambda架构送进博物馆。我认为这个时刻已经到来。因为如果想用流计算在批处理擅长的领域打败它,你只需要能实现两件事:


 

1.      正确性:这保证流计算能和批处理平起平坐。


 

本质上,准确性取决于存储的一致性。流计算系统需要一些类似于checkpoint的方法来保证长时间的持久化状态。克雷普斯(Kreps)在他的博文《为什么本地状态化是流计算系统的一个基础》讨论了这个问题。同时流计算系统还必须针对系统宕机后还能保证数据一致性进行精心的设计。几年前,当Spark刚刚出现在大数据领域的时候,它几乎就是照亮了流计算黑暗面的灯塔(译者注:因为Spark支持强一致)。在这之后,情况越来越好。但是还是有不少流计算系统被设计和开发成尽量不去支持强一致性。我实在是不能明白为什么"最多处理一次(at-most-once processing)"这样的方式仍然存在。


 

再次强调一遍重点:强一致性必须是"只处理一次(exactly-once processing)",这样才能保证正确性。只有这样的系统才能追平并最终超越批处理系统。除非你对计算的结果是否正确并不介意,否则我还是请你放弃任何不能保证强一致性的流计算系统。现有的批处理系统都保证强一致性,不会让你在使用前去检查计算结果是否正确。所以也不要浪费你的时间在那些达不到这样标准的流计算系统上。


 

如果你很想了解如何才能在一个流计算系统里提供强一致性,我建议你去读一读MillWheelSpark Streaming这两个链接里的文章。两篇文章都有相当的篇幅来介绍一致性。同时这个题目也有大量的文献可供参考,所以这里就不再详细讨论了。


 

  

时间推理的工具:这一点让流计算超越批处理。


 

在处理无穷的、无序的、事件―时间分布不均衡的数据时,好的时间推理工具对于流计算系统是极其重要的。现在越来越多的数据已经呈现出上面的这些特征,而现有的批处理系统(也包括几乎所有的流计算系统)都缺少必要的工具来应对这些特性带来的难题。我会在这篇文章的余下部分和下一篇博文的大部分内容里来关注于这个题目。


 

首先,我会介绍时间域里的一些重要概念。随后我会深入介绍上面所说的无穷性、无序性和事件―时间分布不均衡这几个特性。在本文剩下的部分里面,我会介绍常见的处理无穷和有穷数据的方法,包括批处理和流计算两种系统。


  
事件时间和处理时间


 

为了能更好的说明无穷数据处理,就需要很非常清楚的理解时间域的内容。任何一个数据处理系统里,都包含两种典型的时间:


 

        事件时间(Event time):是指事件发生的时间。

        处理时间(Processing time):系统观察到事件发生的时间。


 

不是所有的应用场景都关心事件时间(如果你的场景不用,你的日子就好过多了),但大部分都关注。随便举几个例子,比如一段时间里的用户行为刻画、计费应用和很多的异常检测应用。


 

理想化的情况下,事件时间和处理时间应该总是相同的,即事件在它发生的同时就被处理了。但现实是残酷的,处理时间和事件时间之间的偏移不仅是非零的,还经常是由多种因素(如输入源、处理引擎和硬件)的特性所共同组合成的一个可变方程。可以影响这个偏移的因素包括:


 

        共享的资源使用情况:比如网络拥塞、网络分区或共享环境里的CPU使用情况。

        软件因素:如步分布系统逻辑、资源争夺等。

        数据自身的特征:包括键分布、吞吐量变化、失序导致的变化(比如乘坐飞机的旅客在飞机落地后把手机从飞行模型调整到正常模式,然后某些事件才发生)。


 

因此,如果把在实际系统里的事件时间和处理时间的关系画出来,你很可能会得到类似图1这样的一些图。

 

1:时间域对应的例子。图里X轴代表系统里的事件时间,即事件发生的时间在某一点之前的所有事件,Y轴代表事件被处理的时间,即处理某事件数据时系统的时间。泰勒•阿克道制作


 

图中,黑色的虚线的斜率是1,代表了理想的情况,即事件时间和处理时间是一样的。红色的线代表现实的情况。在这个例子里,系统在处理时间开始阶段有一些延迟,随后趋于理想状况的同步,最后又产生了一些延迟。在理想情况和实际情况之间的水平距离则代表了处理时间和事件时间之间的偏移。本质上,偏移就是由处理管道产生的延迟。


 

可见事件时间和处理时间之间的偏移并不是静态的,这就意味着如果你关注的是事件时间(比如事件确切发生的时间点),在你处理数据数据时不能只看数据被观察的时间(处理时间)。不幸的是,现在很多的流计算系统却是按照处理时间设计来处理无穷数据的。为了应对无穷数据集的无限的特性,这些系统一般都会提供一些把输入数据按时间分片的机制。下面会仔细的讨论分片机制,但其本质都是按时间把数据切割成有限的块。


 

如果你真正关心的是正确性并希望分析的是事件时间,你就不能用处理时间来定义数据的时间边界(比如,用处理时间来分片),虽然现有的很多流计算系统是这么做的。鉴于事件时间和系统时间之间没有一个一致的关联,某些数据可能会被错误的分到按处理时间分片的数据片里,尽管它们的事件时间并不属于这个片。这可能是由于分布式系统内在的延迟,或是由于很多数据源的在线/离线特性所造成的。但后果就是准确性就无法得到保证。下面(包括下一篇博文)我会用一些案例来更详细地讨论这个问题。


 

糟糕的是,即便是用事件时间来分片,情况也不那么美好。对于无穷数据,失序和偏移的变化给分片带来了另外一个问题:完整性,即既然无法预测事件时间和处理时间之间的偏移,你怎么能确定你获得了分片时间内的所有数据?对很多的真实数据,这个问题的答案是无法确定。现有的大部分数据处理系统都依赖某种完整性的想法,对于无穷数据而言这可能会带来严重的困难。


 

我建议与其试图去把无穷的数据梳理成有限的信息片,我们应该设计这样的工具(系统),他们可以让我生活在这些复杂数据造成的不确定性中。当新的数据到来时,我们可以抽取或者更新旧数据。任何系统都应该能应对这些不确定性,去方便的优化完整性的概念,而不只是一个口头上的必须。


 

在介绍我们是如何在Cloud Dataflow里面使用Dataflow模型去构建这样一个系统前,让我们再讲一些有用的背景知识:常见的数据处理模式。


 

  
数据处理模式


 

到目前为止,我们已经获得了足够的背景知识来开始研究处理无穷数据和有穷数据的常见的核心模型。下面我会在批处理和流计算两种引擎的环境下分别对两种处理模式进行介绍。这里我把微批处理和流计算归为一种,因为在这个层面上,他们没有什么特别大的区别。

  
有穷数据处理

 

处理有穷数据是很简单直接的,相信大家都比较的熟悉了。如下图(图2)所示,我们会先对左边非结构化的据进行操作。使用某种分析引擎(通常是批处理类型的,但一个设计良好的流计算引擎也能做的一样好),比如MapReduce,对这些数据做运算。最后得到图右边所示的有规则的结构化数据,并获得其内在的价值。

 

2:用经典的批处理引擎来处理有穷数据。左边有限的非结构化数据经过一个数据处理引擎的处理,转变成了右侧的相应的结构化数据。泰勒•阿克道制作


 

尽管上述过程可能有无数多种变形的版本,但他们总体的模式是很简单的。更有趣的是如何处理无穷数据集,下面就让我们来看一看各种处理无穷数据的典型方法。我们从使用传统的批处理引擎开始,最后以使用专门为无穷数据集而设计的系统(例如大部分流计算或微批处理系统)来结束。


 

  
无穷数据―批处理


 

批处理引擎尽管不是设计来处理无穷数据的,但从它们诞生开始就已经被用来处理无穷数据集了。可以想像的是,这个方法一般都涉及到把无穷数据分片成一系列有穷数据集,再用批处理引擎来处理。


 

  
固定的时间窗口


 

批处理引擎最常见的处理无穷数据集的方法就是重复性地把输入数据按固定时间窗口分片,然后再把每个片当作一个独立有穷数据源进行处理。特别是像日志这样的数据源,事件被记录进有层级的文件系统,而日志文件的名字就对应于它们相应的时间窗口。第一感就会用这个(固定窗口)方法。因为本质上,在数据创建之前就已经进行了基于事件时间的排列来把数据写入适当的时间窗口了。


 

然而在实际场景中,很多系统依然需要处理完整性的问题。例如,要是由于网络原因某些事件写入日志被延迟了,怎么办?要是你的所有日志都要被传送到一个通用的存储区后才能被处理,怎么办?要是事件是从移动设备上发送来的,怎么办?这些场景都会需要对原先的处理方法进行一定的修改(例如,延迟处理知道确保所有的时间片内的事件都收集齐;或如果有数据晚到了,就对整个时间窗口内的数据再处理一次)。

 

3:通过临时的固定窗口,用经典的批处理引擎来处理无穷数据。无穷数据集先通过固定的时间窗口被采集整理成有穷数据,然后再通过重复运行批处理引擎来处理。泰勒•阿克道制作


  
会话单元


 

更复杂的时间窗口策略可以是会话单元。这个方法把无穷数据进行了更细的划分,以方便批处理引擎来处理无穷数据。会话一般是被定义为活动(如某个特定用户)的时间周期,以一段时间的不活跃来判定结束。使用批处理引擎来计算会话单元时,也经常会碰到同一个会话被分到了两个单元里,就如图4里的红色块所示。这种情况是可以通过增加批次的大小来减少,但相应的延迟也就会增加。另外一个选择是增加额外的逻辑来把分到前一次运行里的会话补进本次运算,但这会带来额外的复杂度。

 

4:通过临时的固定窗口并结合会话单元,用经典的批处理引擎来处理无穷数据。无穷数据集先通过固定的时间窗口被采集整理成有穷数据,并再进一步划分成不同的会话单元,然后再通过重复运行批处理引擎来处理。泰勒•阿克道制作


 

使用传统的批处理引擎来计算会话单元还不是最理想的方法。一个更好的方法则是用流的方式来构建会话。下面我们就来讨论。


  
无穷数据―流计算


 

与基于批次的无穷数据处理方法的临时特性相反的是,流计算系统天生就是为无穷数据开发的。如前文所说的,对于很多现实世界里的分布式数据源,你不仅要应对数据的无穷性,还要处理下面两个特性:


 

        对应于事件时间的高度无序性。这意味着你需要某种程度上对事件做时间排序,如果你想按事件时间来做分析。

        时间漂移的变化性。这意味着在一个固定的Y时间的增量里你不能假定你可以看到大部分发生在对应的X时间增量范围内的事件。


 

有多种可以处理有这样特性的数据集的方法。我大致把它们分成四类:

        时间不可知(Time-agnostic

        近似算法(Approximation algorithms

        按处理时间做时间窗口分片

        按事件时间做时间窗口分片


 

下面就分别看一看这几种方法。


 

  
时间不可知

 

时间不可知处理方法的使用场景是当时间本质上无关,所有的逻辑仅关心数据本身而非时间。因为这种场景下只关心数据的到达,所以并不需要流计算引擎来做特殊的支持,只要保证数据的传递就可以了。因此,本质上现有的所有流计算系统都支持时间不可知场景(当然对于准确性有要求的用户,还需要排除那些对强一致性的保证不支持的系统)。批处理系统也能很好的支持时间不可知的无穷数据的应用场景,只要简单地把数据分成特定的有穷数据块序列,再依次处理即可。下面会介绍一些实际的例子,但考虑到这种场景的处理比较的容易理解,我不会用过多的篇幅。


 

过滤(Filtering

非常基础的一个场景就是过滤。比如你要处理网站流量日志,想过滤掉不是来自某个特定域名的所有流量。那么就只要在数据到达的时候,检查一下是不是来自那个特定的域,如果不是就丢弃掉。这种场景只依赖于数据元素本身,因此跟数据源是否是无穷的、失序的或是延迟有变化的就没有关系了。

5:过滤无穷数据。不同类型的数据从图左向右流进,被过滤后形成了只包含一种类型数据的统一数据集。泰勒•阿克道制作。


 

内连接(Inner-Join

另外一种时间不可知的应用场景就是内连接(也叫哈希连接, Hash-Join)。当连接两个无穷数据源的时候,如果你只想得到在两个数据源里都有的元素,那么这里的逻辑就跟时间无关了。在得到一个新的值后,只要简单地把它持久的缓存起来,再一直等到另外一个源里也送来这个值,然后输出即可。当然有可能这里会需要一些垃圾回收机制来把那些从来没出现的连接的元素给清理掉,这时候就跟时间有关了。但是对于那些不会出现不完全连接的场景,这个就没什么了。

6:对两个无穷数据源做内连接。当来自两个数据源中都出现了相同的观察值后,就进行连接操作。泰勒•阿克道制作。


 

如果问题转变成了外连接(Outer-Join),这就会出现之前讨论的完整性的问题,即当你看到连接的一边,你怎么能知道另外一边是否会出现?事实是,你不知道!这种情况下,你就必须采用某种超时机制,而这就又涉及到了时间。这里的时间本质上就又是一种时间窗口分片,后面会仔细分析。


 

  
近似算法(Approximation algorithms

 

7:对无穷数据源进行近似计算。数据进入后通过了一个复杂的近似算法的运算,得到差不多你想要的结果。泰勒•阿克道制作。

第二类方法是近似算法,比如近似Top-N、流K-means聚类等。他们都以无穷数据为输入,并计算出差不多你想要的结果。这些近似算法的好处是它们一般开销小,而且就是设计来处理无穷数据的。缺点是这类方法数量有限,且实现都比较复杂,更新也难。近似的特性又使得它们不能广泛应用。


 

值得注意的是,这些算法一般都有一些时间域的特性(例如,某种衰退机制)。同时也因为这些方法一般都是在数据到达后就处理,所以它们基本用的都是处理时间。对于有些可以提供证明的错误范围的算法,这一点很重要。因为如果算法能够利用数据到达的顺序来预测错误范围,那么即便是事件―时间漂移有变化,对于无穷数据,这些错误都可以忽略不计了。请记住这一点。


 

近似算法本身是很有趣的话题,但它们本质上也是时间不可知方法的一种(如果不考虑它们自身带有的一些时间域特性)。而且这些算法也很直白容易理解和使用,这里就不再详细地介绍了。

  
时间窗口分片


 

另外两个无穷数据处理的方法都是时间窗口分片法的变形。在继续前,我会花一些篇幅来讲清楚时间窗口分片的具体含义是什么。分片就只是对应于一个输入数据源(无穷或有穷),按时间区间把数据分成有限个片,再来处理。图8里面给出了三种分片的方式。

 

8:不同的时间窗口分片机制。每个例子都包括三个输入键对应的数据,并按不同的分片方式进行了划分,如窗口对齐的(对所有的键都适用)和窗口不对齐的(只对应于某些键的)。泰勒•阿克道制作。

        固定窗口(Fixed windows):固定时间窗口按固定长度的时间来分片。如图8所示,固定时间窗口典型地会对所有的数据集进行划分,也叫对齐的窗口。在某些情形下,可能会希望对不同的数据子集应用不同的相位偏移,从而能让分片的完整度更加的平均。这时就不再是对齐的窗口,而是非对齐的。

        滑动窗口(Sliding windows):滑动窗口是固定窗口的一个更一般化的形式。一般会定义两个量,即窗口大小(时间长短)和滑动时间。如果滑动时间比窗口要小,则窗口会重叠;如果相等,这就是固定窗口;如果滑动时间比窗口大,就产生了一种特殊的数据采样,也就是按时间只看数据集里的一部分子集的数据。类似于固定窗口,滑动窗口一般也是对齐的。出于性能考虑也会在某些情况下是非对齐的。需要注意的是,图8里为了能表明滑动的性质而没有把每个窗口对应到所有的键。实际情况里是都要对应到的。

        会话单元(Sessions):是动态窗口的一种。一个会话是在不活跃时间段之间的一连串事件。这个不活跃时间一般是设定的比超时的时间要长。会话单元一般用来做用户行为分析,即观察在一个会话单元里用户的一系列事件。会话单元的长度一般都没法提前确定,完全取决于实际数据的情况。会话单元也是非对齐窗口的一个经典案例,因为实际情况下,不同子集数据的会话单元长度几乎不可能一致地对齐。


 

上面讨论的处理时间和事件时间是我们最关心的两个概念2。在两种情况下,时间窗口分片都可以使用。所以下面我们会详细的来看看他们的区别。由于按处理时间做窗口分片是最常见的,我们就想讲它吧。


 

按处理时间做时间窗口分片

9:按处理时间对数据做固定窗口的分片。数据按照它们到达处理管道的时间(处理时间)顺序地被分成固定窗口的片。泰勒•阿克道制作。

这种方式下,系统本质上是把进来的数据进行缓存,达到一定的处理时间窗口再对缓存的数据进行处理。例如,在一个5分钟的固定窗口里,系统会按自己的系统时间缓存5分钟内的数据,然后把这5分钟内的数据视为一片,交由流程的下一步做处理。


 

用处理时间做窗口分片有一下几个好的特性:

        简单。实现起来非常简单明了,不用担心数据失序和重排序。只要把数据缓存后按时交给下游就好了。

        判断完整性很容易。因为系统能很清楚地知道某窗口里的数据是否已经全部到到,所以数据的完整性很容易保证。这就意味着系统不用操心去处理那些"晚到的"数据了。

        如果你关心的是事件被观察到后的信息,那么按处理时间做时间窗口分片就是你所需要的方法。很多监控应用场景都可以归到这一类。比如你想获得某大型网站的每秒访问量,再通过监控这个数量来判断网站是否有服务中断,这时候用处理时间做时间窗口分片就是绝佳的选择。


 

尽管有这些好处,这个方法也有一个非常大的缺陷,即如果要处理的数据包含事件时间,而时间窗口需要反映的是数据的事件时间,那么就需要数据严格地按照事件时间来到达。不幸的是,在现实中这种按事件时间排好序到达的数据几乎是没有的。


 

举一个简单的例子,手机里的App收集上传用户的使用数据用于后期分析。当手机离网一段时间后(比如无网络连接、飞行模式等),这期间记录的数据就需要等到手机接入网络后才能上传。这意味着处理时间和事件时间就会出现从分钟到几周不等的偏移。这时候用处理时间来做时间窗口分片就没法对这样的数据做出有效的处理并产生有用的信息。


 

另外一个例子是有些分布式的数据源在系统正常情况下可以提供按事件时间排序好(甚至非常好)的数据。但是当系统的健康状况得不到保证的时候,就很难保证有序性了。比如某全球业务需要处理采集自多个大洲的数据。而洲际间的网络带宽一般会受限(不幸的是,这很常见),这时就会出现突然间一部分数据会比通常情况下晚到。再用按处理时间做分片,就不再能有效地反映数据实际发生时的情景了。这时窗口内的数据就已经是新旧混合的数据了。


 

这两个例子里,我们真正想用的都是事件的发生时间,因为这样才能保证数据到达的有序性。这就需要按事件时间进行时间窗口分片。


 

按事件时间做时间窗口分片

当你需要的是把事件按照发生时的时间分进有限的块内,你所需要的就是按事件时间做时间窗口分片。这是时间窗口分片的黄金标准。很不幸,目前绝大多数系统都不支持这样的方法。尽管那些支持强一致的系统(比如HadoopSpark)经过一些修改都可以支持这种方法。


 

下图就给出了一个用一小时的固定窗口对无穷数据做按事件时间分片的演示。

10:按照事件时间用固定窗口分片。数据按照他们发生的时间收集。白色箭头指出把那些事件时间属于同一个分片的数据放到同一个窗口中去。泰勒•阿克道制作。


 

图里的白色箭头线对应于两个特别的数据。这两个数据先后达到处理管道的时间和他们的事件时间并不一致。如果是按照处理时间来分片处理,但实际我们关心的是事件发生时的信息,那么计算出的结果就会不正确了。如此,用事件时间分片来保证事件时间计算的正确性就很完美了。


 

这个方法来处理无穷数据的另外一个好处就是你可以使用动态大小窗口,比如会话单元,而不用出现前面用批处理引擎来处理会话时会出现的会话被分到两个窗口里(见图4)。

11:按照事件时间做会话单元的窗口分片。数据按照他们发生的时间以及活动性被分到了不同的会话单元里。白色箭头指出把那些事件时间属于同一个分片的数据放到同一个窗口中去并按事件时间排序。泰勒•阿克道制作。


 

当然,天下没有免费的午餐,按事件时间做时间窗口分片也不例外。由于窗口必须要比窗口的长度存在更长的时间(处理时间),所以它有两个很大的缺点。


 

        缓存:由于窗口的存在时间要长,所以就需要缓存更多的数据。比较好的是,现在持久化已经是整个数据处理系统资源里最便宜的部分(其他的是CPU、带宽和内存)。所以在一个设计良好的数据处理系统里,用强一致的持久化机制加上好的内存缓存机制后,这个问题可能并没想像的那么严重。另外不少的聚合运算(比如求和、算平均)都不需要把所有的数据都缓存起来,只要把很小的中间结果缓存下来,并逐步累积就可以了。

        完整性:考虑到我们通常没有好的方法来确定已经收集到了一个窗口片里的所有数据,我们怎么知道什么时候可以把窗口里的数据交给下游去处理?事实是,我们确实不知道。对很多输入类型,系统可以给出一个相对合理准确的完整性估计,比如在MillWheel系统里使用的水印(在第二篇博文里会有更多的介绍)。但是对于绝对的准确要求极度高的场景(比如计费),唯一的选择就是提供一个方法让引擎来决定什么时候交出数据,同时能让系统不断地修正结果。应对窗口内数据的完整性是一个非常有趣的题目,但最好是能在一个具体的例子里来讨论说明,以后我会再介绍。


  
结论


 

哇噢!很多内容是不是?如果你坚持读到这里,你应该得到表扬。到这里我基本讲了我想说的一半内容。所以让我们适当地的停一下,在继续第二篇文章前,先回顾一下都讲了什么。令人高兴的是,第一篇的内容比较的沉闷,而第二篇的内容会相对有趣很多。


 


 


 


 

泰勒•阿克道(Tyler Akidau

泰勒•阿克道是谷歌的一名高级软件工程师。他是谷歌内部流计算数据处理系统(如MillWheel)的技术带头人,在过去的五年里开发了多个大规模流计算数据处理系统。他热忱地认为流计算应该是大规模海量计算的更通用的模型。他最喜欢的交通工具是货运自行车,可以把他的两个小女儿放到拖兜里面。 泰勒•阿克道是谷歌的一名高级软件工程师。他是谷歌内部流计算数据处理系统(如MillWheel)的技术带头人,在过去的五年里开发了多个大规模流计算数据处理系统。他热忱地认为流计算应该是大规模海量计算的更通用的模型。他最喜欢的交通工具是货运自行车,可以把他的两个小女儿放到拖斗里面。


 

来源:OReilly Data

网站:https://www.oreilly.com.cn