在之前的几篇文章中,我已经介绍了关于机器学习的一些文章。在今天的文章中,我准备了一个新的数据集来进一步地做一个练习。希望大家能对这个有一个更深入的了解。如果你还想了解更多关于机器学习的练习,可以参阅之前的文章:
- 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。点击上面的一个异常:
点击上面的箭头,我们可以看到这个异常的具体情况: