Elastic:机器学习 Demo

在之前的几篇文章中,我已经介绍了关于机器学习的一些文章。在今天的文章中,我准备了一个新的数据集来进一步地做一个练习。希望大家能对这个有一个更深入的了解。如果你还想了解更多关于机器学习的练习,可以参阅之前的文章:

          - Elastic:机器学习的实践 - single metric job

          - Elastic:机器学习的实践 - multi metric job

          - Elastic:机器学习的实践 - population job

          - Elastic:机器学习的实践 - categorization

准备数据

我们现在如下的地址下载我们的实验数据:

git clone https://github.com/liu-xiao-guo/machine-learning-elastic-datasets

当我们下载完这个数据过后,我们进入克隆的目录中,并打入如下的命令:

tar xvf server_metrics.tar.gz

上面命令解压压缩的文件,并把所有的文件解压到 server-metrics 文件夹。我们进入到该文件夹。在这个文件夹中,有三个 .sh 的文件:

upload_server_metrics.sh
upload_server_metrics_noauth.sh

如果你的 Elasticsearch 机器有设置密码,那么你可以在 upload_server_metrics.sh 里修改你的用户名,密码及 URL,并导入数据。如果你没有设置密码,那么你可以使用 upload_server_metrics_noauth.sh 来进行导入。在运行这个脚本之前,请确保 .sh 文件是可以执行的:

chmod a+x upload_server_metrics.sh
chmod a+x upload_server_metrics_noauth.sh

针对我的情况,我使用 upload_server_metrics_noauth.sh:

./upload_server_metrics_noauth.sh 
$ ./upload_server_metrics_noauth.sh 

== Script for creating index and uploading data == 
 

== Deleting old index "server-metrics"== 

{"acknowledged":true}
== Creating Index - server-metrics == 

{"acknowledged":true,"shards_acknowledged":true,"index":"server-metrics"}
== Bulk uploading data to index... 

Server-metrics_7 uploaded
Server-metrics_8 uploaded
Server-metrics_9 uploaded
Server-metrics_10 uploaded
Server-metrics_11 uploaded
Server-metrics_12 uploaded
Server-metrics_13 uploaded
Server-metrics_14 uploaded
Server-metrics_15 uploaded
Server-metrics_16 uploaded
Server-metrics_17 uploaded
Server-metrics_18 uploaded
Server-metrics_19 uploaded
Server-metrics_20 uploaded
 done - output to /dev/null

== Check upload 
health status index          uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   server-metrics 9y3JcUu_SYu1Z-adDDWhCg   1   0     596748            0     40.1mb         40.1mb


== Check count 
{"count":596748,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0}}
 Server-metrics uploaded 

上面显示我们已经创建一个叫做 server-metrics 的索引。

GET _cat/indices

我们可以看到一个叫做 server-metrics 的索引已经被创建了。我们为它创建一个 叫做 “server-*" 的 index pattern,并在 Discover 中进行展示。

在这个数据集中,有63万个数据。集中在2017年的4月1号到27号。每个数据的内容格式如下:

{"@timestamp":"2017-03-23T13:00:00","accept":36320,"deny":4156,"host":"server_2","response":2.4558210155,"service":"app_3","total":40476}

这个数据是一些服务器的访问统计数据。上面的 total 就是总访问量。在今天练习中,我们将使用这个指标来进行分析。

上面的图显示的是总的请求数根据时间的变化曲线。我们将使用机器学的方法来判断在这个时间系列的数据中,有什么异常的事件。

创建 single metric job

在本练习中,我们将使用 Elastic 7.8 进行展示。它的界面可能会和之前的版本有所区别,但是整个的流程还是一样的:

点击上面的 Machine Learning:

点击上面的 Manage jobs (如果你已经有至少一个的 ML 任务),或者 Create jobs (如果你还没有一个 ML 任务)。

选择我们的 server-* index pattern:

选择 Single metric:

选择使用整个数据集,点击 Next 按钮:

在上面,我们选择请求总数 total 字段。在上面,我们可以看到 High sum (total) 及 Low sum (total)。当我们选择 High sum (total) 时,它的意思是当 sum (total)的值超过机器学习预测的值的上线时,它将被标识为异常,而不用去考虑低于下线的情况。同样的,当我们选择 Low sum (total) 时,它的意思指的是当 sum (total) 的值低于机器学习预测值的下限时,这个事件将被标识为异常,但是不考虑高于上线的情况。当我们选择 Sum (total) 时,则表明,高于和低于下线的情况,都将被考虑,都会生产异常事件。针对我们的情况,我们选择 Sum (total):

通常机器学习的 bucket span 被设置为5分钟到60分钟之间。这个数值依赖于实际的数据采集量。这个值越大,有可能漏掉一下异常的事件,如果异常只发生在一个很小的时间区间。你可以参阅之前的文章 Elastic:机器学习的实践 - single metric job 里最后部分的介绍。针对我们的情况,我们选择 30m,也就是30分钟。点击 Next 按钮:

我们给这个机器学习的任务取一个名字 total-request,并点击 Next 按钮:

上面显示一切正常。我们点击 Next 按钮:

点击 Create job:

在上面,我们可以看出来,上面显示的曲线和我们之前使用 Visualization 看到的是一样的。在上面的阴影的部分是依据机器学习所建立的模型预测的值的范围。在开始的部分,你可以看到一个阴影的部分,那个表示机器学习正在建立模型的阶段。点击上面的 View results 按钮:

在上面,我们可以使用两个方向按钮来调整视窗的窗口大小。这样我们可以看到出现异常的详细的信息。

比如,我选择第一个出现异常的地方,并进行放大。我们可看到一些更加细节的地方:

在上面,我们可以看出来,实际的数值远在所预测的值的范围之前,所以被认为是一个异常的事件。在显示的下方,我们可以看见一些异常事件的列表。点击箭头字符:

我们可以看到这个异常事件的详细信息。我们也可以点击 Forecast 按钮来预测未来一些天的情况:

点击 Forecast 按钮:

填入7d,也就是7天。点击 Run 按钮:

在上面,我们可以看到未来7天的数据预测。

创建 multi metric job

接下来,我们来创建一个多指标的机器学习任务。在这个练习中,我们想针对 request 数值及 response time 来同时进行跟踪。同时,我们也想对每个应用做分析,看看他们的 request 及 respone time。

点击 Machine Learning:

点击 Manage jobs:

我们新添加的一个指标就是 High mean (response)。原因是我们想找出响应时间过长的服务或者服务器。通过 request 的数目和 response 时间过长,我们很容易定位出问题所在的地方。

在上面,我们选择 Split field 为 service,也就是我们的机器学习将对每个服务都分别运行。在通常的情况下,这个字段将自动被列入到 influencer 里。我们同时也把 host 列入到 influencer 中,因为我们想在异常发生的时候知道到底哪一个 host 在起关键的作用。点击上面的 Next:

点击 Next 按钮:

点击 Next 按钮:

针对每个服务和指标分别进行机器学习分析。点击 View results:

我们可以点击其中 app_4里的一个异常来进行查看:

点击进入 April 10th, 2017, 13:00 的异常事件:

我们可以发现 server_1 及 server_2 对 app_4的影响很大。我们需要进行查看。

我们也可以分别查看给 host 的异常情况:

在上面的左边,我们可以看到前几位的 app 的影响。

创建 population job

接下来,我们来创建一个 population job。Population job 是为了检测总体中的异常值。也就是说每个指标不是和自己的历史数据来进行比较,而是和同类的数据相比较。拿一个通俗的例子来说,比如同样一个团队,按照正常的加薪范围来说,一般在2%-15%,可是有一个人的薪水加薪幅度在80%。这个显然和其它人的加薪步在同一个层次。这个就是异常。比如在下面的一个图中:

zoralda 显示和比的 entity 是不一样的。这个用户数据传输比别人多很多,而且显得那么鹤立鸡群。

为了做这个练习,我们需要创建一个新的索引。我们首先下载如下的文件:

git clone https://github.com/liu-xiao-guo/machine-learning-datasets-useractivity

当我们下载完后进入到下载的目录中中,并打入如下的命令:

chmod a+x ingest-data.sh 
./ingest-data.sh 

文档的数据格式如下:

{"username": "Frederica", "@timestamp": "2017-04-16T21:06:58.963073", "bytesSent": 313}

在我们的 Kibana 中就可以查看到最新导入的一个叫做 user-activity 的索引。我们需要为这个索引创建一个叫做 user-activity 的index pattern。

我可以通过可视化查看基于每个用户的 mean data transfer 图:

打开 Kibana 机器学习:

选择 user-activity:

选择 Next 按钮:

点击 View results:

我们看到一些异常的 entity。点击上面的一个异常:

点击上面的箭头,我们可以看到这个异常的具体情况:

猜你喜欢

转载自blog.csdn.net/UbuntuTouch/article/details/107013227