2019/11/05 03-代码合并和分析

在这里插入图片描述在这里插入图片描述
最早讨论是数据的提取,数据的生产者,当前的日志,一半是apahce,tomcat,nginx产生的,一般可以用来预防爬虫,恶意攻击,可以看到里面的日志信息,ip,请求,user agent可以推算别人用的什么浏览器
比如面试写,做了一些日志分析,问数据怎么来的,httpd,tomcat,不同服务器来的,数据放在一个分布式系统上(也可以是大的磁盘阵列里)
这样采集加存储做完了,就需要把文本一行行处理,进行分析,分析之前要过滤,称为清洗,用match,合格的数据留下来,也有可能要进行分析,删除掉的数据是做什么的,为什么被过滤掉
有时候要进行二次过滤,比如只要状态200的,就需要再加个条件即可,不要的就过滤掉

这里用match把数据一行行提取出来,用load方法指定这个文件去做这个事情,load进来,用extract方法来过滤,这个方法就做match,只把固定格式的提取出来,这样拿到数据后就可以再次处理在这里插入图片描述
对于python来讲如果有大量数据,一个个发出来想要处理,最好的方法还是生成器,这就是一个生产数据的过程
在这里插入图片描述
这个代码是模拟的数据源,里面也用到的了队列和多线程
在这里插入图片描述
如果给一个数据源,下面就通过调度,注册一些函数,这些函数未来可以跑起来的函数,从数据源获取数据,按照指定的方式进行处理,获得的数据可能是远远不断的发送过来的数据,把数据切成一小段一小段计算,就是时间窗口,时间窗口把时间内的数据卡住,给你来进行计算
一般服务都是24小时,你只能在一段数据计算一次结果,比如每5分钟。所有统计都是按照时间段来统计的,比如这个一小时,客户有多少
要看下最小粒度是多少,比如按季度看,按月看

在这里插入图片描述
统计的这个宽度,就是最小粒度,因为每10分钟就是看的每10分钟的数据,只不过你是每隔5秒看10分钟数据,统计的还是10分钟的数据,只不过数据是重叠的
一个是控制时间多久做一次,另一个控制多大的时间粒度

在这里插入图片描述
每19分钟统计,就要先攒够10分钟数据,在程序里攒起来很简单,使用容器,看这里计算和顺序无关在这里插入图片描述
如果统计里有去重的要求,那就要选用set和字典都可以在这里插入图片描述
攒到这个时间了就应该做什么事情,下面还需要保留一些数据,因为做的还是重叠的计算在这里插入图片描述
时间窗口主要是按多少分钟进行统计的问题,到这里还有的个分析的数据持久化,还有可视化在这里插入图片描述
把传递数据的方式修改了,以前是自己在窗口函数里直接调用数据源,直接和数据源打交道相当于耦合在一起,但是这样不合适因为耦合度太高,就需要解耦,中间加东西,把生产者的东西攒起来的东西,就是缓冲的,是个消息队列,多线程使用的queue
大集群的就是第三方的,rabbitmq,解决生产者和消费者速度不匹配的问题
在这里插入图片描述
queue放到全局变量使用,但是不想要使用全局变量就可以用传参,传的引用地址,都是用的同一个在这里插入图片描述
现在就把两个函数合到一块去在这里插入图片描述在这里插入图片描述
黏贴到这里
在这里插入图片描述
进行一些修改
extract是提取的过程

在这里插入图片描述
load是读取相当于数据源,下面是模拟用的数据源
在这里插入图片描述
下面就是分析函数,也就是处理函数在这里插入图片描述
下面就是分发器,决定着数据的调度在这里插入图片描述
在这里插入图片描述
原来的数据源,s是测试用的,注释掉,
在这里插入图片描述
现在就可以用load函数的结果在这里插入图片描述
现在数据提取有点死板,不太好用
在这里插入图片描述
思考下,load函数,重新写,我们处理的文件肯定是一大堆,可能传的一批目录,比如今天一个目录,明天一个目录,就需要判断里面是文件还是目录
在这里插入图片描述
paths传进来是一个集合,如果是目录该怎么办,文件该怎么办
在这里插入图片描述
glob不是递归的,拿到日志一个个打开即可,先做个实验试试,
log拿到的还是path对象,就可以直接调用open方法就可以打开了,open方法打开,需要转换成str,因为log是个path对象

在这里插入图片描述在这里插入图片描述
为了保险一点还需要加编码,默认用读方式打开,
日志是用来读的,就需要for line in f

在这里插入图片描述

扩展名。log定太死也可以提取出去,放在一个容器里*
在这里插入图片描述
先打印看下,但是一行行数据没有显示
在这里插入图片描述
函数调用一下,点进去之后可以进去,path.log在里面
在这里插入图片描述在这里插入图片描述
但是数据没打印出来
把这一行注释掉查看有没有效果
在这里插入图片描述
不注释就又不行了,因为List(logs)是迭代器,,已经迭代一遍了,再去for循环访问就到头了
在这里插入图片描述、在里面打印就没什么大问题在这里插入图片描述
用这种方式就可以,注意迭代器在这里插入图片描述

但是比较啰嗦,能不能这么写,如果是目录才有必要isinstance,传一个参数就是一个字符串,就会把列表包起来,装到容器里面,下面代码就可以不改变了,这一段传的不是字符串,这一段是学习标准库,处理一下代码就一样 了
在这里插入图片描述
现在比如日期目录,下面又按小时目录,下面有日志,就需要用递归遍历在这里插入图片描述
前面加r即可,到底递归不递归加个参数即可
递归就用前面的,不递归用后面的
path.rglob(e) if r else path.glob(e)
在这里插入图片描述
现在就是递归查找就有三个
在这里插入图片描述
相对路径没有问题在这里插入图片描述
目录不存在isdir就过不去在这里插入图片描述
用这种方式就可以遍历所有的行出来

然后回到刚才的,把load函数在这里插入图片描述
移到上面
在这里插入图片描述
先不删除上面的
在这里插入图片描述
拿到一行行其实下面的写法都一样
在这里插入图片描述
isfile可以直接调用上面的load,所以就可以把上面的load改成loadfile,就可以 了在这里插入图片描述

rglob直接把所有指定扩展名的文件都找到,log是path对象。所以str即可
在这里插入图片描述
但是这样子有点风险,如果这么做,传过去是相对路径
所以还是转成绝对路径

在这里插入图片描述
把编码也提到上面去在这里插入图片描述
加载目录,遍历出想要的文件,让loadfile去加载文件,是目录就遍历,然后加载,是文件就else直接加载在这里插入图片描述
底下的load就不能这么使用了,给点.即可
在这里插入图片描述
拿到点去搜,确实是个目录,然后看到扩展名,搜.log,现在r=false,不要递归,就是用glob,当前目录下的log。依次记载文件,然后逐个打开提取
在这里插入图片描述
通过正则表达式来提取,一行行转换成一个个字典,最后一个个yield出来
在这里插入图片描述
loadfile其实是个生成器,返回的是个生成器对象,要么next,要么迭代,yield是把生成器丢出去,但是我们要把数据给出去,可以用yield from
也可以for循环

在这里插入图片描述
这是个生成器,可以认为是一个可迭代对象,把可迭代对象,生成的数据一个个拿出来,就是for循环,yield from
在这里插入图片描述
这个s还是个生成器,数据源在源源不断生产数据
在这里插入图片描述
生成器就可以迭代
在这里插入图片描述
生成器使用还是for,yield from一定要使用熟练
在这里插入图片描述
下面的是给4,5,6
yield扔出来一下是个列表,是有区别的

在这里插入图片描述在这里插入图片描述
这个src通过这里传到内部去,外部遍历被内部run函数使用在这里插入图片描述
进行迭代生成器,看到一个个字典,就打到queue里面去了
在这里插入图片描述
handler就从queue找出数据就可以处理了
在这里插入图片描述在这里插入图片描述
一定要清楚这几个区别在这里插入图片描述
现在handler还有问题,avg_handler是有问题的,用的是value,上面是字典生产出来没有vlaue,只有datetime在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值