2021年十二月份总结与2022年一月份计划

Posted by AlstonWilliams on December 28, 2021

快乐

有时会想起儿时自己很傻的时刻。这些时刻是很傻,但却是真实的开心。一件很小的事情就会莫名开心起来。

但随着年龄的增长,这种欢乐慢慢地没了。开心的阈值变得越来越高,连笑容都丢失了。过去的小开心,别人不解,但自己乐在其中的时刻再也不存在了。对世界的看法,对酸甜苦辣的感觉,越来越大众。

人们的悲喜各不想通。但我想其实成年人的世界是相通的,都是被条条框框包围着,拥挤在一个囚笼里面。不管是车水马龙,是灯火阑珊,是推杯换盏,还是路边冻死骨,都一样。

究竟是谁不正常?

技术学习

上个月了解了Apache Calcite的流程。这个月则了解了一下Flink中怎样使用Calcite。总体上还是那个流程,语法解析,语法验证,语义验证,转换成逻辑计划,优化,转换成物理计划。只是在转换成逻辑计划的时候,有自定义一些算子的处理逻辑。

在之前写的Demo中,物理计划那里会定义为直接读数据文件。而在Flink中,则是在生成物理计划时,生成的是Transformation。这样就和Flink Stream保持一致了。

那Flink Stream是如何运行的呢?假设是一个YARN集群,其实还是蛮简单的,跟MapReduce提交到YARN很相似。都是先创建ApplicationMaster,ApplicationMaster负责后续任务的调度,如向YARN申请资源,创建TaskManager等。

之前研究过MapReduce的代码,虽然没有细抠代码细节,但大体对流程还是了解的。其中启动TaskManager的部分当初还帮我们解答了一个很难理解的问题。

如果一个Task在任务执行过程中,出现OOM 的情况。我们最先想到的是堆内存分配的不够大导致的。那如果我们发现堆内存明明分配了10GB,但是OOM时的异常告诉我们的却是申请128MB内存申请不到,是不是就很奇怪?

这时候,我们可能会想是不是代码有问题,导致对象得不到有效回收,把老年代和永久带用满了导致的。

如果顺着这个思路去查,就走远了。

要理解这个问题的原因,不仅要对JVM内存有一定了解,对YARN的资源调度也要有一定了解。JVM内存在进行分配的时候,可以指定最小堆内存和最大堆内存。在JVM启动的时候,会先按照最小堆内存去进行申请,而不是一下就按照最大堆内存申请。如果后面JVM发现不够,会去申请更多内存,直到最大堆内存还是不够用,就会报OOM。

所以其实OOM出现的情况会有两种,一种是去申请扩容时,机器上没有充足的内存资源,另一种则是最大堆内存不够用。而我们遇到的就是第一种。 TaskManager启动的时候,是会生成一个脚本文件的,里面记录了Java启动命令,其中就有最小堆内存,最大堆内存的参数。这些参数都是通过yarn的配置文件指定的。

那了解YARN的都知道,一个TaskManager要启动,首先ApplicationMaster需要跟ResourceManager去申请,只有ResourceManager确认有足够的资源,才会让AM去启动TM。那什么叫有足够的资源呢?就是一台机器上至少有足够启动一个TM的内存和CPU资源。这儿的内存指的是最大堆内存。比如Spark啥的写的Executor-memory。

那既然那个TM启动起来了,就说明它被启动的时候,RM是认为机器上是有足够资源的,那为什么最后会出现OOM呢? 这里我们就要了解一下RM对资源使用是怎么统计的。RM统计可用资源的时候,是通过集群全部资源,减掉分配过的TM的资源。而不是实时获取每台机器的内存和CPU来计算。

举个例子,集群有1T内存,分配了20个TM,每个TM 5G内存,每个TM实际使用了1G内存。那RM会认为集群剩余可用内存为900G,而不是980G。当它分配TM的时候,假设一台机器有16G内存,已经有三个TM,和上面一样,每个5G内存,实际使用1G。那这台机器在RM看来就是已用15G,不能再给它分配TM了。

所以理论上来说,TM都分配成功了,只要没有那种最大堆内存不够的情况,就肯定不会有OOM的情况。

如果只是考虑YARN,这么想确实没问题。但问题是YARN集群里的机器,很多时候还有其它组件,它们本身也会占用内存。这部分内存占用YARN是感知不到的。

所以呢,就有可能一台机器16GB内存,其中15GB被其他组件占用了,当YARN成功分配了一个TM,这个TM以最小堆内存启动后,后面扩容时失败而出现OOM的问题。 特别是现在MPP架构的组件那么多,像Impala,Presto,Doris等。它们的资源占用YARN感知不到,一旦和YARN集群放在一起,就容易出现这种问题。

最后也确实证明,是因为集群上有Presto任务在跑导致的,把Presto任务下掉以后,就再也没出现OOM问题。

Flink和MapReduce在启动ApplicationMaster这方面不同的地方,在于ApplicationMaster的高可用。

MapReduce的ApplicationMaster会在启动时,如果失败了,会进行几次重试。但是,如果启动完成以后,在运行中它失败了,则是会直接导致整个应用程序的失败。

而在Flink中,因为实时应用是要一直运行的,所以Flink内部又对ResourceManager, Dispatcher, JobMaster做了高可用处理。对于Session以及部署在YARN这种模式来说,应用程序首先会通过调用Flink API,向YARN申请到一个Container,然后在其中启动YarnApplicationClusterEntryPoint这个类,作为ApplicationMaster。在这个类内部,会依次启动ResourceManager,Dispatcher。当然这两个组件启动的时候有一个选择leader的过程。都启动完成后,就可以对外提供服务了。客户端可以通过命令将任务提交到Dispatcher上,客户端需要做的事情是将SQL转换成Transformation,然后再转换成JobGraph,提交给Dispatcher。Dispatcher接收到以后,会选择一个作为leader的JobMaster。JobMaster负责将这个任务从JobGraph转换成ExecutionGraph,以及它的资源申请,checkpoint等。

目前就理解到这儿。除了自己啃代码,还参考了Flink Master 详解这篇文章

到这里,我有几个困惑的地方:

  1. 如何从JobGraph转换为ExecutionGraph
  2. Leader选举是如何实现的?因为启动的时候其实只启动了一个ApplicationMaster,正常的一致性算法,像Paxos, Raft, Zab,都是基于有好多台机器,其中有Leader, Follower, Observer,基于共识,即机器数量过半才能持久化一个Proposal。但此时只有一个ApplicationMaster,又是做的什么选主呢?即使用Zookeeper的Watcher机制选主,那也应该至少有几个AM吧?而且看文档高可用是通过把Leader把数据同步到HDFS等地方,如果是通过共识算法的话,那为什么要这么做呢?为什么不抄一下ZK的思路?还是说其实选主是假的,只是用ZK做了一个锁,这样如果Dispatcher故障的话,就自动释放这个锁,然后AM自动重试时,根据HDFS上持久化的信息进行Dispatcher的恢复,JobManager也可以根据持久化的信息进行恢复。如果是这样的话,那这个设计就说的通了
  3. 故障恢复是怎么做的?

复盘

在翻Flink源码解析系列文章时,偶然发现一个人的博客,里面写了Flink一个系列的博客,对他很感兴趣,就去翻了翻其他的文章。其中关于个人成长的部分让我感触许久。

从他的blog中看去,关于个人成长的文章,比较鸡血的文章,大概都是在工作前两年写下的。后面基本就写了一些技术类的文章,成长类的很少。

感触的点在于,我工作前两年,也会经常对自己进行复盘,短则一周一次,长则一个月一次。经常复盘给自己带来了挺大的压力,但自己确实朝着更好的方向发展。

而最近这一年,复盘少了很多,最多也就是工作上复盘,而没有对自己的个人成长进行复盘。以为照着一年的计划前进,就不会有什么差错。

一年一年结束后,每次计划中重要的部分基本都能完成。挺满意。但直到现在,还有一年半就工作五年了,想想按照这种趋势下去,自己在工作第五年时候的样子,不寒而栗。

工作五年的时候,我希望自己是什么样子呢?我不知道。之前制定计划的时候,只是在薪资方面有一定的规划。而对公司,对职位,对工作内容则没有规划。对职位其实也YY过,但是低了就自己瞧不起自己,稍微高一点又觉得不太现实。

也许就是因为没有确定下来目标才导致自己终日不知所终吧。

对未来有一个模糊的景象,现在已经开始在着手做准备,去学习一些新的东西。但由于没有具体时间点,也没有紧迫感,有时就容易浪费时间。

还是得早日确定下来五年的目标,然后再去规划啊。盯着脚下七便士的同时,也要抬头望一下天空啊。

这一年,似乎大多是处在舒适圈。当然,生活方面不是,生活方面一直在走出舒适圈,去挑战自己,但是技术上,格局上,视野上呢?

前两年是学习了很多技术,阅读了很多源码,并且对很多中间件有了比较深的了解。今年倒没有技术上没有走出舒适区,只是把之前学到的线的东西连成了一幅图。而没有在一些自己不熟悉的领域上学习。

格局上,在理财,经济,中国历史,管理等方面都是前两年学的。今年有什么提升吗?完全没有!哦,不对,今年对老龄化做了一些研究,但对格局提升也没什么作用。今年也相对于之前更加浮躁,长的深度的文章,视频,很多都看不完,甚至不会去看。这点是很不可取的。

视野方面,今年学习到了数据产品都有哪些,怎么做。但也只是这些了。对这些数据产品最终的形态,不了解。对数据产品的业务场景,不了解。这是一件很可怕的事。就像之前做DMP系统三年,但是到头来标签体系怎么划分的都不知道。这几年一直没有意识到自己在这方面有点蠢。后面要先把数据产品相关的视野补上,然后是其他方面。

最可怕的是,如果不是今天看到了那个人的文章,我可能会一直这么下去。就像被温水煮的青蛙,到头来自己怎么死的都不知道。

还是得视野扩大一些,听优秀的人分享,总结,演讲,保持自己的敏锐吧。

自己问题还有很多,最大的一点就是很多事情一直在审视,而没有沉浸在其中。

像做饭,一直会觉得这儿做的不好,那儿做的不好,做的时候就会太在意火候,在意调料等,就会很紧张,然后吃的时候心理一直在暗示做的有问题,就会吃的时候很恶心。像唱歌,也是一直在审视自己,导致太过紧张,反而导致声带过紧,音色没有很好的发挥出来。像吉他,也会紧张,然后导致手指僵硬,弹得不好。

沉浸其中,欣赏自己,幻想自己想要的状态,然后去练习,这样才是正确的心态吧。

复盘一下时间使用情况。对于时间利用有些不满,但想想似乎可优化的地方不多。工作时间就不看了,工作时间一直很饱和,没有浪费时间的情况存在。

工作日上,每天吃饭时间,可自己利用的大概一个半小时。这一个半小时基本上都是在看皮皮搞笑或者读书。看皮皮搞笑的话,会看一些能扩大视野的内容。再就是一些搞笑的内容。这些时间似乎没有可以优化的地方。

下班以后的时间,大概看半小时到一小时直播,到九点多一些。练吉他到十点左右,然后练习声乐到十一点,然后洗澡,加起来大概到十一点半左右能结束。双日还可能会加半小时运动。

陪女朋友聊天大概十分钟到半小时。到十二点。

洗完澡就会上床摊着,此时会打开直播,看游戏直播,但很多时候并不会真正看,只是想听个声音而已,偶尔抬头看一眼。这时候会做点其他的事,可能是刷皮皮搞笑,可能是去B站上看一些视频。想十二点半以前睡,但经常会拖到一点左右。

工作日时间虽然满,但没有浪费的情况存在。

周末呢?大概一天和女朋友在一起,逛逛街,做做饭,看看剧,另一天一半时间去上课,上课45分钟,来回通勤三小时。另一半时间,看两小时直播,完全看直播那种,读读书,练一小时吉他,半小时运动,其他时间则洗洗衣服,做些杂七杂八的事情。

这么算下来的话,时间其实都是有得到充分利用的。但总是有许多不满,认为自己没有在技术上,视野上投入时间。

技术上平时会在工作之余忙里偷闲学习,这方面倒也还好。

视野方面则比较难办,读书也没有很振聋发聩的感觉。可能要多跟人聊聊。

说白了对时间利用不满还是因为对自己其他方面不满啊。

选择

选择大于努力,这句话听了很多次了。屡次看见,屡次没什么感触。这次却突然想起这句话。

前几年我们经常会看到一些新闻,哪些公司上市,造就了多少百万千万富翁。这些人往往都是在公司刚开始起步的时候加入那家公司,然后公司发展顺利,赌对了,最后得到了巨大的回报。这些人能力其实不一定有多么厉害,因为能力厉害的人我认为不会在一家公司刚起步就加入,毕竟存在巨大风险,而有能力预判公司未来发展并愿意用自己的青春最宝贵的时间去赌的人,这种人特别少。就是这些刚开始选择对了的人,最终获得了巨大的财富。

而最近两年,看到的新闻,更多的却是一些公司裁员,除了风口上的猪,还有很多之前发展的很不错的公司,比如百度,字节跳动等公司都开始裁员了。当然后者更多的是那些新成立的事业部,比如做K12教育,汽车等的。而前者则更多的是风不吹了以后,从天上掉下来的。也有天上猪太多,被挤下来的。加入这些公司,赌它们上市的人,基本上都赌输了。

这一方面说明选择大于努力,另一方面又值得我们反思,到底该怎样进行选择?

最近十年来,成功出圈的公司也就那么多,有老牌出圈的,比如阿里,京东等,他们创建时间都在2000年以前。新公司成功出圈的,有美团,滴滴,拼多多等为数不多的公司,他们后来成功改变了中国人的习惯,成为了中国的新的基础设施。

这中间我们要反思的有几点:

  1. 为什么老牌公司,像阿里这种公司,成立那么多年,最近十年才出圈?
  2. 新出圈的公司,到底为什么才出圈?为什么它们没有死掉?
  3. 死掉的公司,是因为什么?

对于第一点,我认为原因是在此之前,基础设施,比如网速等达不到支持网购的要求,说白了就是硬性条件不达标。另一方面,也是阿里举办了双十一,一下子带火了网购导致的。政策方面的话不太了解,但可能也跟那些时候政策比较支持的原因。

对于第二点和第三点,就特别值得我们深思。

我们现在看到的活下来的公司,最终都成了新基建,改变了人们的衣食住行。这说明它们确实是刚需,所以有成长的土壤。像美团目标用户是没时间没精力做饭的年轻人群体,而滴滴瞄准的是不会开车或者没有车的群体。它们都是真实的需求。而对应的伪需求,比如共享单车,就发展的不好。共享单车瞄准的是最后一公里,比如坐地铁以后骑单车回家,这个需求本身就不是特别旺盛。大众需求还是希望租房买房找靠近地铁的。要么就是离地铁不近的,四五公里的,这种要么是开车,要么是骑电瓶车,所以这个需求就没什么根基。但共享单车发展的比较好的地区,在那种租住在公司周围,大概一两公里的地方,经常看到小区晚上堆满了共享单车,早晨则一辆找不着,就是因为大家很多人骑共享单车上班。共享单车从校园里发起,大学大家都住校,出去玩也是附近,共享单车确实有旺盛的需求,推广到社会上以后,能看到发展的好的区域基本上和大学这种类似。

除了需求以外,还有很多重要的其他因素。

比如政策。就像K12教育,这个需求是绝对的痛点,但在国家意识到减负,改变了政策以后,这个行业就凉了。

比如经营模式。我们看这些发展的好的企业,基本上都是平台经济,像阿里,美团,滴滴,都是平台经济。而那些重资产模式的企业,像共享单车,衣二三,还有生鲜电商,则大多发展的不是很健康,要么倒闭了。因为它们不如平台经济那么轻,那么容易改变。固定资产方面消耗太大。

比如社会发展,新技术迭代发展。像早期的当当网,卖书,后来随着电子书的普及,卖书就不是一门很好的生意。所以近几年当当网除了传出来李国庆离婚的消息,没有其他的消息。还有爱奇艺等长视频平台,受到了抖音为代表的短视频平台的强烈冲击。最近已经在断臂求生了。

比如运营策略。这方面比较典型的是滴滴,因为上市把数据泄露给美国,导致凉了。

可以看到,选择其实是一件很难的事情。特别是在互联网版图慢慢固定下来的今天,已经没有那么多选择了。只能选择高风险高收益,或者低风险低收益。已经没有像几年前淘宝那样的明显处于低估区间,买到就是赚到的机会了。

这些都是对外界的选择,对内我们也要做选择,对内做选择其实就是职业规划。这些选择可能每个都看起来不大,但折叠起来就造成了人生的巨大差异。

从眼前看,比如该选择做哪个方向,前端后端还是大数据?比如该主要做哪个产品?比如技术框架那么多,该深入学习哪个?

从长远看,五年,十年以后,自己核心竞争力是什么?现在要怎么做准备?自己的从业方向是什么?需要哪些东西?现在要做什么准备?

外界环境我们控制不了,无法选择。但这些内在的选择,则是我们可以把握的住的。而且,我们内在的选择,会影响外部可以选择的范围。今天是昨天决定的,但明天是今天决定的。所以做好当下的选择题,踏踏实实的,就可以了吧。

读书

  • 《Spring技术内幕: 深入解析Spring架构与设计原理》中关于Spring原理的部分
  • 《所有的风只向她们吹》
  • 《天空的另一半》
  • 《微尘》

《所有的风只向她们吹》介绍了四个女人的故事,有老阿姨成功实现理想的,有中年阿姨和老公达成和解的,剩下俩忘记了。

《天空的另一半》则介绍了女人在世界的遭遇,在印度等不尊重妇女的国家的遭遇。没想到世界竟然还有这样的一面。

《微尘》讲的是一些工人的故事,他们大多是煤矿工人,也有破产的老板,他们口述自己的故事,然后作者写下来。完全没想到在九十年代,煤矿工人是那么地危险。

理财

截至现在收益率为1.93%。依旧买入医疗和纳斯达克,等待估值回升。

音乐

在长泰广场听到一个人弹唱,觉得很厉害,但仔细观察了下他弹奏的方式,其实不同的曲子,弹奏方式基本上都一样。之前也有很奇怪,为什么曲子那么多,每首曲子谱子还不一样,那些能一次性唱那么多的人,是怎么记住那么多谱子的。搜了一下才发现,原来他们是用的万能和弦。之前听说过这个,但是一直没有用心去看,这次好好搜索了一番,似乎发现了新大陆。

万能和弦,加上万能节奏型,如果练习好,就能基本上弹唱所有的曲子。所以目前在朝着这个方向努力。练习的时候发现自己细节上一些地方做的不够好,就一点一点学习,一点一点优化吧。

声乐方面,这个月只上了两节课。对过去学到的东西,部分掌握的还不错,有一部分还需要继续强化。比如用气带声,腹式呼吸,控制软腭抬升,进而控制音准。还有另外一些没有系统学习,但是有时候刷视频能看到的技巧方面,如如何带入感情,这些技巧方面也是需要后面去学习的。

晚上回到家往往很累,不想动,对练习有很强的心理抵抗。但是想想自己预期的样子,也就鼓起勇气去练习了。

2022年一月份计划

  • 切记心平气和,享受过程,而不是只看结果
  • 阅读《智造中国》(✔)
  • 声乐方面,在用气带声,腹式呼吸,换声点部位音准做好。牢记胸腔共鸣,放松。
  • 吉他方面,学会万能和弦,以及所有万能节奏型,弹奏时需要用合适的力度,合适的速度,要求音色明亮,不嘈杂,有层次感(✔)
  • 阅读《统一行动》(✔)
  • 阅读《无法落地的战略一文不值》(✔)
  • 阅读《好奇心》(✔)
  • 阅读《2052:未来四十年的中国与世界》(弃读,没什么营养)
  • 参加1.8号的快手数据中台分享(✔)
  • 继续学习完Flink剩下的数据处理链路流程(✔)
  • 将DataFun本月寄过来的季刊中,关于数据应用的部分阅读完(✔)
  • 阅读《Expert one-on-one J2EE Development without EJB》(✔)