11月贝壳实习总结

11月贝壳实习总结(一)

距离上一次已经一个多月了,这期间我主要负责一个日志清洗的项目,然后空余时间看了很多的其他的东西,这次我主要说一下我的项目

项目说明

简述

安排给我的是一个日志清洗的任务,就是把日志表中的内容按照需求解析提取出来,然后保存到数据库中,然后提供一个接口供查询,过程还是比较简单的。虽然项目比较简单无脑,但是还是挺有用的,我学习了很多东西。
  首先是日志表,公司用的是hive,这个前面看过一些,然后我用的是python,我就去看了python接hive的库,不过最后没用上,因为需要ip,端口,账号。我是用shell脚本获取数据的(其中我去申请了权限,毕竟是要查询数据,等了好久)。
  之后就是熟悉日志表的内容,这个过程就是不断的找同事咨询,自己看,然后再咨询。沟通真的很重要,因为有什么地方没搞清楚就意味着要改代码,重新跑,公司的数据又那么大,跑起来就停不下来。
  解析脚本,接着我就开始写日志解析的脚本了,用的是python(好用,无理由,亏我学过);这个过程其实很漫长,我第一次直接在服务器上用vim编程,写的很慢,也不是很熟悉,要慢慢调错,说起来就心痛啊,血泪的教训,以致我后面再可能出错的地方全部做了判断或者try,还有输出报错信息!!!实在太重要了。除了调错还要记录统计,看看处理了多少条,留下了多少条,耗时啊等等,还有中间过程输出,这对于后期检验什么的很重要,最后我是配合了一个shell分析脚本来分析运行的情况,毕竟要看看解析率什么的,不能和实际数量差太多。
  数据库,等差不多的时候我开始申请数据库了,本来打算用MongoDB,但是他们不对外,然后我就改用MySql了(算了算每条的数量也不是很大,就几十万,Mysql够用),这个过程也挺麻烦的,要提申请,然后给了我一个端口(刚开始我一脸懵逼,我不是申请数据库吗),然后我自己新建一个数据库,然后建表,一步步的,其中顺便复习了SQL,不过目前用的也是一般般。有了数据库就要学习python接mysql的包,这个还算简单,自己写个封装的类,唯一需要注意的就是连接超时的问题,实践出真知,本来我才不会考虑这东西呢。
  接口,数据有了就需要接口了。带我的老司机刚好搞框架的,他帮我写了接口的框架,在我们公司的gitlab上新建了一个项目,我就又顺便学习了一下gitlab,发现这真是个好东西啊,可以同步代码(我不用再服务器上编程了,然后事实是我还是在服务器上编程)。写接口也不难,关于数据库连接的部分我原来就差不多写好了,拿过来改一改就行了,主要的时间花在了把前端的请求转化为SQL,以及参数!!!这个虽然是小问题,但是一旦出错就会很懵逼,我需要对前端的参数做转化,和转化给前端的数据,同时要十分注意函数调用的参数,我现在怕的都要写全参数的传递,比如data=data这样,这能百分比保证不会出错(别问为什么要说这个)。
  优化,检验,当一切都有了雏形的时候就需要考虑优化了,贝壳的数据不是一般的大,原来我取得一天的数据其实是一个小时,但是已经有100多万了,我最最初的版本跑这个就要好几个小时,因为把时间耗在了数据库上,然后我把操作都放到了内存里面,数据库只有一个插入就快了不是一点点啊。本来已经挺好的了,但是当我发现我的数据是一个小时之后,就又不行了;一天的数据是在两千万左右,这一下了又跑不动了,所以逼着我想怎么优化;把string的id转为int,然后排序去重,二分查找,然而自己写的二分比不上python字典的has_key更快,也更好用,所以我全部都用了字典,而且在解析json之前加了判断,解析json还是挺耗时间的,而且需要的数据也没有那么多,两千万的数据有用的不多,最后用上的数据最多100多万,到现在已经能再次跑的飞快了,一个多小时就能跑完两千万的数据。这个过程让我觉得优化也是很有意思的,而且还挺感兴趣的。
  总结,教训,虽然这个项目并不难,不涉及什么技术和算法,但是作为一个实际的项目对我的帮助非常大。
  
  1.我熟悉了在linux服务器上编程,同时也熟悉了常用的指令什么的,对环境更加的熟悉了,比如tmux,virtualenv,gitlab等,可以说是入门了。
  2.编程的细节问题。
1. 打错变量名。由于没有提示,而我又很容易打错变量名,经常错的我莫名其妙,所以我现在都会用shift+#来检验一下有没有打错。
2. 函数的参数。我原本不以为意,知道我有次参数的顺序写错了,导致我也是一脸懵逼,差错查了好久,想想就心塞,所以我每次都写有=的那种。
3. 编码。这其实先出现于另一个项目,很多时候都设计中文,这个时候就要考虑编码,中文是utf-8,需要转化,decode解码,encode编码,刚开始很容易搞不清楚,你需要清除这个中文有没有解码,需不需要解码,我刚开始也不是很清楚的,多用用就知道了,报错了就改一改嘛,需要注意但是不是很致命。
4. 报错。写代码难免会报错,原先我不以为意,事实证明我错了,血泪教训,总之,可能有问题的地方就try吧,不想try就if判断,然后还要输出报错信息,不输出就完全没意义了,总之小心一点,稳一点总是好的,毕竟出错了还得你自己改。
5. 输出日志。这个实在是太重要了,如果没有日志你的代码跑完了就完了,你也不知道结果到底怎么样,可能是和你预期一样,但是很大概率不是。还有为了可读性,日志有意义,做一下统计输出也是很必要的,提示一下当前运行情况,跑了多少数据,多少时间啊,结果如何啊等等。这对于之后的优化和检验很重要,不然你凭空优化凭空想吗。反正多输出点信息肯定不会有坏处,统计分析的话写个shell脚本就行了,多方便。
  3.作为一个入门的项目,还是让我了解了公司的一些基本情况,各种资源权限啊都要申请,还尽可能全面了解需要,了解工作内容,多沟通。

你可能感兴趣的:(实习)