基于PySpark的网络服务异常检测系统 (四) Mysql与SparkSQL对接同步数据 kmeans算法计算预测异常
基于Django Restframework和Spark的异常检测系统,数据库为MySQL、Redis, 消息队列为Celery,分析服务为Spark SQL和Spark Mllib,使用kmeans和随机森林算法对网络服务数据进行分析;数据分为全量数据和正常数据,每天通过自动跑定时job从全量数据中导入正常数据供算法做模型训练。
使用celery批量导入(指定时间段)正常样本到数据库
def add_normal_cat_data(data):
"""
构建数据model 用yield每次返回1000条数据
:param data
:return:
"""
tmp_cat_normal_models = [] for cat_data in data:
response_time = cat_data.get('response_time')
request_count = cat_data.get('request_count') or 1
fail_count = cat_data.get('fail_count') or 1
cat_data['id'] = str(uuid4())
if response_time < 1.2 and (fail_count / request_count) < 0.2:
cat_obj = CatNormalResource(
**cat_data
)
tmp_cat_normal_models.append(cat_obj) if len(tmp_cat_normal_models) >= 1000:
yield tmp_cat_normal_models
tmp_cat_normal_models = [] yield tmp_cat_normal_models @celery_app.task
def insert_normal_cat_data(data):
"""
使用异步,每次用bulk 批量插入 1000条数据
:param data:
:return:
"""
try:
for i in add_normal_cat_data(data):
CatNormalResource.objects.bulk_create(i)
except Exception as e:
print(e)
raise RsError('插入数据库失败')
通过contab定时job,每天自动导入正常样本
def get_current_timestamp():
"""
获取当前时间戳
:return:
"""
return int(time.time()) * 1000 def convert_datetime_to_timestamp(dtime):
"""
把datetime转换为时间戳
:param datetime:
:return:
"""
timestamp = time.mktime(dtime.timetuple())
return int(timestamp) * 1000 def get_cache_cat_data(start_time, end_time, force=False):
"""
获取指定时间段的cat数据
:param start_time:
:param end_time:
:return:
"""
key = 'GET_CAT_RES_DATA_{0}_TO_{1}'.format(
start_time, end_time
)
content = cache.get(key)
if force or not content:
content = get_cat_res_data(start_time, end_time)
if content:
cache.set(key, content, timeout=CACHE_TIMEOUT_DEFAULT) return content def add_normal_cat_data(data):
"""
构建数据model 用yield每次返回1000条数据
:param data
:return:
"""
tmp_cat_normal_models = [] for cat_data in data:
response_time = cat_data.get('response_time')
request_count = cat_data.get('request_count') or 1
fail_count = cat_data.get('fail_count') or 1
cat_data['id'] = str(uuid4())
if response_time < 1.2 and (fail_count / request_count) < 0.2:
cat_obj = CatNormalResource(
**cat_data
)
tmp_cat_normal_models.append(cat_obj) if len(tmp_cat_normal_models) >= 1000:
yield tmp_cat_normal_models
tmp_cat_normal_models = [] yield tmp_cat_normal_models @celery_app.task
def insert_normal_cat_data(data):
"""
使用异步,每次用bulk 批量插入 1000条数据
:param data:
:return:
"""
try:
for i in add_normal_cat_data(data):
CatNormalResource.objects.bulk_create(i)
except Exception as e:
print(e)
raise RsError('插入数据库失败') def insert_normal_cat_job():
"""
定时导入前一天的正常数据
:return:
"""
logger.info('insert_normal_cat_job ....')
dt_time = datetime.datetime.now() + datetime.timedelta(days=-1)
start_time = convert_datetime_to_timestamp(dt_time)
end_time = get_current_timestamp()
data = get_cache_cat_data(start_time, end_time)
insert_normal_cat_data.delay(data)
SparkSQL读取指定时间段数据,使用Kmeans预测新数据异常
class SparkAnomaly(object):
def __init__(self, appid, start_time, end_time):
self.appid = appid
self.start_time = start_time
self.end_time = end_time
self.spark_sql = SparkSql()
self.cat_res = self.spark_sql.load_table_dataframe('cat_resource')
self.cat_normal_res = self.spark_sql.load_table_dataframe(
'cat_normal_resource'
)
self.filter_str = "appid = {0} " \
"and create_time >= {1} " \
"and update_time <= {2}".format(
self.appid, self.start_time, self.end_time,
)
self.model_filter_str = "appid = {0}".format(self.appid) def get_kmeans_model(self):
"""
得到kmeans聚类模型
:return:
"""
df = self.cat_normal_res.filter(self.model_filter_str)
parsed_data_rdd = df.rdd.map(lambda x: array([x[4], x[5], x[6]])) # 建立聚类模型
clusters = KMeans.train(
parsed_data_rdd, 3,
maxIterations=10,
initializationMode="random"
) return clusters def get_kmeans_predict(self):
"""
获取appid指定时间段的预测结果
:return:
"""
df = self.cat_res.filter(self.filter_str)
parsed_data_rdd = df.rdd.map(lambda x: array([x[4], x[5], x[6]]))
clusters = self.get_kmeans_model()
predict_result = clusters.predict(parsed_data_rdd)
return predict_result.collect() def get_kmeans_result(appid, start_time, end_time):
"""
获取appid指定时间段的cat数据
:param appid:
:param start_time:
:param end_time:
:return:
"""
cat_result_obj = CatResultData.objects.filter(
appid=appid,
start_time=start_time,
end_time=end_time,
algorithm_name="kmeans"
).first()
if not cat_result_obj:
arg_result = SparkAnomaly(appid, start_time, end_time)
content = arg_result.get_kmeans_predict()
cat_result_obj = CatResultData.objects.create(
appid=appid,
start_time=start_time,
end_time=end_time,
algorithm_name="kmeans",
result_data=content
)
ser_data = CatResultDataSerializer(cat_result_obj).data
ser_data['result_data'] = json.loads(ser_data['result_data'])
return ser_data
以上代码为系统的部分代码,详细代码请见我的github https://github.com/a342058040/network_anomaly_detection
基于PySpark的网络服务异常检测系统 (四) Mysql与SparkSQL对接同步数据 kmeans算法计算预测异常的更多相关文章
- 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布
		
之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...
 - 基于PySpark的网络服务异常检测系统     阶段总结(二)
		
在上篇博文中介绍了网络服务异常检测的大概,本篇将详细介绍SVDD和Isolation Forest这两种算法 1. SVDD算法 SVDD的英文全称是Support Vector Data Descr ...
 - 通过Dapr实现一个简单的基于.net的微服务电商系统
		
本来想在Dpar 1.0GA时发布这篇文章,由于其他事情耽搁了放到现在.时下微服务和云原生技术如何如荼,微软也不甘示弱的和阿里一起适时推出了Dapr(https://dapr.io/),园子里关于da ...
 - 通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务
		
我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓"stateful applications"真正具体的一个实现(个人认为),上一章讲到有状态服务可能很 ...
 - 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解
		
首先感谢张队@geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根. 目录:一.通过Dapr实现一个简单的基于.net的微服务 ...
 - 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理
		
状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实 ...
 - 通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪
		
Dapr提供了一些开箱即用的分布式链路追踪解决方案,今天我们来讲一讲如何通过dapr的configuration来实现非侵入式链路追踪的 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系 ...
 - 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权
		
Oauth2授权,熟悉微信开发的同学对这个东西应该不陌生吧.当我们的应用系统需要集成第三方授权时一般都会做oauth集成,今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方 ...
 - 通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定
		
如果说Actor是dapr有状态服务的内部体现的话,那绑定应该是dapr对serverless这部分的体现了.我们可以通过绑定极大的扩展应用的能力,甚至未来会成为serverless的基础.最开始接触 ...
 
随机推荐
- LOJ2340 [WC2018] 州区划分 【FMT】【欧拉回路】
			
题目分析: 这题是WC的题??? 令 $g[S] = (\sum_{x \in S}w_x)^p$ $h[S] = g[S]$如果$S$不是欧拉回路 $d[S] = \frac{f[S]}{g[All ...
 - Win下端口占用问题:OSError: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试
			
常见问题:https://www.cnblogs.com/dotnetcrazy/p/9192089.html netstat -ano|findstr 8080 如果不计较端口,换个即可 也可以查找 ...
 - web.xml:<url-pattern>
			
web.xml 中的 <url-pattern> 是 <servlet-mapping> 或 <filter-mapping> 下的子标签. url :http:/ ...
 - 金融量化分析【day111】:Matplotib-图标标注
			
一.图像标注 1.股票 df = pd.read_csv('601318.csv') df.plot() plt.plot([1,3,4,5]) plt.plot([5,8,7,9]) plt.tit ...
 - kubernetes云平台管理实战:  集群部署(一)
			
一.环境规划 1.架构拓扑图 2.主机规划 3.软件版本 [root@k8s-master ~]# cat /etc/redhat-release CentOS Linux release 7.4.1 ...
 - CMS收集器和G1收集器优缺点
			
首先要知道 Stop the world的含义(网易面试):不管选择哪种GC算法,stop-the-world都是不可避免的.Stop-the-world意味着从应用中停下来并进入到GC执行过程中去. ...
 - 071、如何定制calico网络的IP池(2019-04-16 周二)
			
参考https://www.cnblogs.com/CloudMan6/p/7571272.html 在前面的学习中,我们没有特别配置,calico会自动为网络分配subnet,当然我们也可以根据 ...
 - SpringBoot系列:Pojo validation
			
JSR 303 规范了bean validation, Hibernate validator实现了JSR 303所有的规范, 同时也是最常用的validator 工具包. 使用 Hibernate ...
 - .NET面试题系列(十六)数据库面试题
			
数据库事务的四大特性 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚.因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. ...
 - Gram 矩阵与向量到子空间的距离
			
设 $W$ 是 $n$ 维 Euclidean 空间 $V$ 的子空间, $\beta\in V$, 定义 $\beta$ 到 $W$ 的距离 $$\bex \rd (\beta,W)=|\bet ...