基于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算法计算预测异常的更多相关文章

  1. 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布

    之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...

  2. 基于PySpark的网络服务异常检测系统 阶段总结(二)

    在上篇博文中介绍了网络服务异常检测的大概,本篇将详细介绍SVDD和Isolation Forest这两种算法 1. SVDD算法 SVDD的英文全称是Support Vector Data Descr ...

  3. 通过Dapr实现一个简单的基于.net的微服务电商系统

    本来想在Dpar 1.0GA时发布这篇文章,由于其他事情耽搁了放到现在.时下微服务和云原生技术如何如荼,微软也不甘示弱的和阿里一起适时推出了Dapr(https://dapr.io/),园子里关于da ...

  4. 通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务

    我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓"stateful applications"真正具体的一个实现(个人认为),上一章讲到有状态服务可能很 ...

  5. 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

    首先感谢张队@geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根. 目录:一.通过Dapr实现一个简单的基于.net的微服务 ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理

    状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实 ...

  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪

    Dapr提供了一些开箱即用的分布式链路追踪解决方案,今天我们来讲一讲如何通过dapr的configuration来实现非侵入式链路追踪的 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系 ...

  8. 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权

    Oauth2授权,熟悉微信开发的同学对这个东西应该不陌生吧.当我们的应用系统需要集成第三方授权时一般都会做oauth集成,今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方 ...

  9. 通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定

    如果说Actor是dapr有状态服务的内部体现的话,那绑定应该是dapr对serverless这部分的体现了.我们可以通过绑定极大的扩展应用的能力,甚至未来会成为serverless的基础.最开始接触 ...

随机推荐

  1. BZOJ4241历史研究——回滚莫队

    题目描述 IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连 ...

  2. React Native——react-navigation的使用

    在 React Native 中,官方已经推荐使用 react-navigation 来实现各个界面的跳转和不同板块的切换. react-navigation 主要包括三个组件: StackNavig ...

  3. 【洛谷P1313 计算系数】

    题目连接 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio&g ...

  4. 关于设计项目UI界面的软件工具

    关于画UI界面的软件,我在网上找了几个,今天式用这几款软件还可以 1.墨刀:国产的,这个专门画APP界面的,用起来比较简单,有免费版的,要注册才能用,提供云存储,收费版的云存储空间会多一些.网站: h ...

  5. HDU 6108(整除判断 数学)

    题意是求在给定的 P 进制下,满足条件的数字 B 有多少.条件:若任何一个数的各位数字之和能被 B 整除,则该数可被 B 整除. 在 p 进制下,每个正整数都可以都可以表示为:a0*p^0 + a1* ...

  6. PYTHON使用入门

    一 写在开头1.1 本文内容PYTHON语言的基础知识. 二 Q & A2.1 为什么选择PYTHON?软件质量:在很大程度上,PYTHON更注重可读性.一致性和软件质量,从而与脚本语言世界中 ...

  7. Tuxedo 汇总

    ===================================C/S / Tuxedo 架构/ B/S 架构演进===================================Tuxed ...

  8. Shiro 系列: 简单命令行程序示例

    在本示例中, 使用 INI 文件来定义用户和角色. 首先学习一下 INI 文件的规范. =======================Shiro INI 的基本规范================== ...

  9. [再寄小读者之数学篇](2015-06-24 Series)

    (AMM. Problems and Solutions. 2015. 03) Let $\sed{a_n}$ be a monotone decreasing sequence of real nu ...

  10. 调用腾讯、百度翻译API,实现游戏机翻通用程序

    最近玩了款steam独立游戏,没中文,只能自己汉化了,用腾讯跟百度的API实现了一个通用的机翻程序(只需要导入JSON文本), 同样,比较懒,还没写,先占坑