屠龙记

Posted Timeless

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了屠龙记相关的知识,希望对你有一定的参考价值。

我是一个正经的大龄c#程序员,突然接到了一个大数据报表需求,开发语言python,框架pyspark,脚本运行环境juypter.

需求是这样的:

工厂有很多生产线,每个生产线都有一套工序,每个工序都要扫码,我的任务就是得到工序之间的时间差,计算一个叫leadtime的指标,分析每条产线的哪个环节耗时比较多。

工厂每天大概扫码1000w左右,所有扫码信息都存在一个pg数据库的一个表里面,格式大概为一个编码列,一个json列。编码列主要存储玻璃码信息,json列里面含有各种信息需要提取。数据库尺寸非常庞大,会定期做归档。

一个产线的扫码大致是这样的,白片阶扫白片码,镭码工序有白片码和成品码,成品阶之后只扫成品码。意思就是说一个产品线的工序之间没有一个码贯穿,必须通过镭码工序衔接。当然这是典型的情况,也有其它情况。

拿到这个需求,头很大,有没有。公司要求2个月搞定,慌不慌?

既来之则安之。

python不会怎么办,恶补,spark不会怎么办,现找资料。以上工作大概2周弄了个大概,开干。

大致理了一下思路:

1把数据同步到ods层(hive)

2清洗json,提取白片码,成品码,工序,产品线,扫码时间等关键信息(dwd层)

3dws层,这层很头疼,到底该如何计算?如何存储?

4dm层,好像没啥太大难度

5报表绑定,也很容易

问题主要就卡在第三步,如此大的数据量算两两之差到底盖如何设计表?

找了几个程序员头脑风暴了一番,感觉都没啥好的思路,能说服我就那样或者这样干。都把它当成在sql数据库的常识来看待问题了,如何设置主键,设置索引,如何分区,同事们想到的大多是一行一个码,工序,时间,产线。转码如何从头到尾关联,数据量如此庞大如何处理?关于计算方面,也没啥好的建议,反正比较乱,感觉不靠谱。既然都没有这方面经验借鉴,看来还得自己努力!

思索几天,突然灵光一闪,列式存储。数据行数将大大减小。虽然每个产品线的工序数量不一样,但是完全可以做点冗余,工序默认30列,那么差值就是29列。这样既方便计算又方便检验。

工序如何和列名对应呢?首先列名肯定不能是工序名,工序名是配置的,不固定,肯定不行。然后是如何体现工序的顺序呢?思来想去一个想法涌现出来:工序列就叫p1,p2,p3,差值列叫diff1,diff2...,后面再根据工序,产线配置表确定p1,p2是什么意思。

接着是下一个问题,码到底应该如何处理?特别是转码,如何像糖葫芦一样形成一个串?

只存白片码?只存成品码?白片成品都存?hive还是kudu?一时之间不好定夺。既然不好定夺,那就撸起代码再说。三套方案:

1hive表存,假设hive sql非常强大,直接sql join搞定

2hive表存,假设spark join运算能力优秀,搞定

3kudu表,做upsert操作(根据主键做insert或者update)

代码1 方案1思路,上sql,实验直接报废,join太多,第一个工序和最后一个工序的时间差值可能很大,数据量太大,直接能跑死

代码2 方案1思路,sql结合spark编程,虽然对过程做了一些分解,依然算死

代码3 全spark写法,依然被斩落马下

.

.

.

代码m 依旧没能成功

虽然没成功,却积累了很多经验。所谓大数据平台,所谓map计算,也不是吊炸天的存在!必须对任务进行友好划分,任务大小需要均匀分布才有可能打开成功的门。

有了前面的积累开始卷土重来,开始实验方案3,写了4个版本之后,第5个版本终于迎来了曙光,能跑出数据来了!虽然能跑出数据,耗时却很高,另外一个问题就是cpu被我的程序抢太多了,其它程序运行不好。这时候ai发挥了强大这时ai起到了很大作用,对着ai一大堆灵魂拷问,终于调对了spark参数,问题基本得到解决。(ai还不是特别精确,经常会给出错误的东西,所以还是需要不断尝试)

屠龙术&平凡的世界

x

听过很多道理,却依然过不好这一生

  小时候,总觉得世上肯定存在屠龙术.就像<倚天屠龙记>里面张无忌学的<乾坤大挪移>/<九阳真经>一般,

学会了就可以一人单挑光明顶六大门派...

  貌似武侠小说中很多类似的例子,跳下悬崖,喜获秘籍,独步武林,笑傲江湖...

慢慢长大...

  长大了,觉得世界上可能存在这样的屠龙术,但是命里有时终须有,命里无时莫强求啊...

大道五十,天衍四十九,留一线生机...

 
插曲.记忆中<中华传统美德>书中的一个小典故
  
在广州陶侃算是清闲了许多,为此有个关于他的典故,说 他每天早上把100块砖从书房搬到屋外,晚上又把100块砖搬到书房里, 大家感到很奇怪,问他:你这样折腾是为什么啊? 陶侃回答说:我的志向是收复中原大地,如果悠闲安逸的生活过惯了, 就怕一旦遇到大事我没有精力啊。 从此,他得了了“搬砖将军”的称号。 公元332年,朝廷拜陶侃为大将军...
有次和同事聊天,不知道聊得啥,我突然说起这个典故...
同事忽然问我,"你就说搬砖能不能成为将军吧?"
那感觉就像在说,难道搬砖也是屠龙术?
我后来认真想了下,
同事问的问题,就像是,
屠龙术如果可以用来搬砖,那么搬砖算是屠龙术嘛?
我觉得是:不能的...

技术图片

  虽然不是男主角,毕竟有一线生机,最终你也可以有自己的屠龙术的.

  比如:搬砖?那是人家的...

正宗的屠龙术只有一套,但是每个人的道不像童年,注定千奇百怪...

你的童年我的童年
好像都一样
小小肩膀大大书包
上呀上学堂
新的时代新的主张
新新的模样 ...
---歌曲<阳光男孩阳光女孩歌词>---

  大家的[背景/学识/智商/情商...],都是不一样的,所以每个人想成功的道,有宽有窄,有独木桥有溜光大道.

父母望子成龙,我长大了成龙了,但是我又学了屠龙术,结果把自己给玩死了...

  作死的人略略略...哈哈...

我的屠龙术第一式:早睡早起,锻炼身体...

  对,不用质疑,我的第一式至今未练成.^_^

我的最后一式,屠龙无悔.可能就是希望世界和平吧.

  然后在这个和平年代,留下些神马也好,留不下更好,细细体会这个平凡的世界...

 

x

 

以上是关于屠龙记的主要内容,如果未能解决你的问题,请参考以下文章

屠龙术&平凡的世界

dict字典的用法

电视剧珍藏

2018第44周日

微积分 01 - 数学的屠龙刀

Java中的屠龙之术:如何方便快捷地生成.class文件