ElasticTalk

ElasticTalk

【视频】ElasticTalk#4 Elastic认证考试那些事儿

资讯动态rockybean 发表了文章 • 2 个评论 • 145 次浏览 • 2018-07-27 07:56 • 来自相关话题

Elastic 在今年6月29日推出了面向 Elasticsearch 工程师的认证考试,官方描述如下: The Elastic Certification Program was created to recognize individuals who have demonstrated a high-level of knowledge, competence and expertise with Elasticsearch. Elastic Certified Professionals demonstrate these skills by completing challenging and relevant real-world tasks on a live Elastic Stack cluster in our hands-on, performance-based certification exams. 我们此次直播便邀请中国第1位通过该认证的工程师 rockybean 来分享下认证考试的一些信息,通过这次直播,你可以了解如下信息:
  1. 如何注册考试?费用?
  2. 如何准备考试?
  3. 考试的形式是怎样的?有哪些类型的考题?
本次直播由于设备问题,声音有些卡顿,大家见谅! 视频链接如下: http://v.qq.com/x/page/f073779epxd.html  

【直播预告】ElasticTalk #4 Elastic 官方认证考试那些事儿

资料分享rockybean 发表了文章 • 0 个评论 • 159 次浏览 • 2018-07-23 08:33 • 来自相关话题

大家好,ElasticTalk 第4次直播将于本周进行,主题是关于 Elastic 官方认证考试的。   我于7月初成功通过了 Elastic Certified Engineer 的考试,拿到下面的徽章。
bin_certificate.png
  感兴趣的同学可以扫下面海报中的二维码或者搜索 elastic-talk 微信号,添加好友后进入直播群。  
phone_post.001_.jpeg
 
大家好,ElasticTalk 第4次直播将于本周进行,主题是关于 Elastic 官方认证考试的。   我于7月初成功通过了 Elastic Certified Engineer 的考试,拿到下面的徽章。
bin_certificate.png
  感兴趣的同学可以扫下面海报中的二维码或者搜索 elastic-talk 微信号,添加好友后进入直播群。  
phone_post.001_.jpeg
 

ET001 不可不掌握的 Logstash 使用技巧

Logstashrockybean 发表了文章 • 3 个评论 • 234 次浏览 • 2018-07-21 11:53 • 来自相关话题

Logstash 是 Elastic Stack 中功能最强大的 ETL 工具,相较于 beats 家族,虽然它略显臃肿,但是强在功能丰富、处理能力强大。大家在使用的过程中肯定也体验过其启动时的慢吞吞,那么有什么办法可以减少等待 Logstash 的启动时间,提高编写其处理配置文件的效率呢?本文给大家推荐一个小技巧,帮助大家解决如下两个问题,让大家更好地与这个笨重的大家伙相处。

  1. 减少 Logstash 重启的次数,也就节省宝贵的时间
  2. 方便快捷地向 Logstash 输入需要处理的内容

1. 打开 reload 配置开关

Logstash 启动的时候可以加上 -r 的参数来做到配置文件热加载,效果是:

  • 当你修改了配置文件后,无需重启 Logstash 即可让新配置文件生效。

它的含义如下:

当你写好配置文件,比如 test.conf ,启动命令如下:

bin/logstash -f test.conf -r

启动完毕,修改 test.conf 的内容并保存后,过 1 秒钟,你会发现 Logstash 端有类似如下日志输出(注意红色框标记的部分),此时说明 reload 的成功。

如果你修改的配置文件有错误,会看到报错的日志,你可以根据错误提示修改。

至此,第一个问题解决!

2. 使用 HTTP INPUT

编写配置文件的另一个痛点是需要针对不同格式的输入内容进行详细的测试,以防解析报错的情况出现。此时大家常用标准输入来解决这个问题(stdin input),但是标准输入对于文字编辑支持不太友好,而且配置文件热更新的功能也不支持标准输入。

在这里向大家推荐使用 http input 插件,配置如下:

input{
    http{
        port => 7474
        codec => "json"
    }
}

然后大家再用自己喜欢的 http 请求工具,比如 POSTMan、Insomnia 等向 http://loclahost:7474发送待测试内容即可,如下是 Insomnia 的截图。

至此,第二个问题也解决了。

3. 总结

相信看到这里,大家一定是跃跃欲试了,赶紧打开电脑,找到 Logstash,然后编辑 test.conf,输入如下内容:

input{
    http{
        port => 7474
        codec => "json"
    }
}

filter{

}

output{
        stdout{
        codec => rubydebug{
            metadata => true
        }
    }
}

然后执行启动命令:

bin/logstash -f test.conf -r

打开 Insomnia ,输入要测试的内容,点击发送,开始舒爽流畅的配置文件编写之旅吧!

ElasticTalk #3 Elasticsearch压测实战 II esrally 进阶实战

资料分享rockybean 发表了文章 • 0 个评论 • 86 次浏览 • 2018-07-20 19:51 • 来自相关话题

ElasticTalk 第3期 直播的内容是 Elasticsearch 压测实战之 esrally 进阶实战。 本次我们主要讲解了 esrally 如何自定义测试集群、自定义数据集和报告,最后还讲了三步上手 esrally 的方法。   视频地址如下: http://www.bilibili.com/video/av27117279/
ElasticTalk 第3期 直播的内容是 Elasticsearch 压测实战之 esrally 进阶实战。 本次我们主要讲解了 esrally 如何自定义测试集群、自定义数据集和报告,最后还讲了三步上手 esrally 的方法。   视频地址如下: http://www.bilibili.com/video/av27117279/

ElasticTalk #2 Elasticsearch压测实战 I esrally 入门与实战

资料分享rockybean 发表了文章 • 0 个评论 • 105 次浏览 • 2018-07-20 19:49 • 来自相关话题

  ElasticTalk 第2期 直播的内容是 Elasticsearch 压测实战之 esrally 入门和实战。希望这次直播可以帮助大家快速掌握 esrally 这款优秀的 es 压测工具。   视频地址如下: https://www.bilibili.com/video/av27114309/
  ElasticTalk 第2期 直播的内容是 Elasticsearch 压测实战之 esrally 入门和实战。希望这次直播可以帮助大家快速掌握 esrally 这款优秀的 es 压测工具。   视频地址如下: https://www.bilibili.com/video/av27114309/

ElasticTalk #1 用 ElasticStack 快速收集和分析 Nginx 日志

资料分享rockybean 发表了文章 • 2 个评论 • 130 次浏览 • 2018-07-20 19:45 • 来自相关话题

  去年做了3期 ElasticTalk 的直播节目,预计下周开始恢复。现在放出相关的视频内容,希望对大家有所帮助。   第1期的课程内容为用 ElasticStack 快速收集分析 Nginx 日志,其中详细讲解了如何使用 filebeat 的 module 功能。     视频地址如下: https://www.bilibili.com/video/av27123368/
  去年做了3期 ElasticTalk 的直播节目,预计下周开始恢复。现在放出相关的视频内容,希望对大家有所帮助。   第1期的课程内容为用 ElasticStack 快速收集分析 Nginx 日志,其中详细讲解了如何使用 filebeat 的 module 功能。     视频地址如下: https://www.bilibili.com/video/av27123368/

Elasticsearch snapshot 备份的使用方法

Elasticsearchrockybean 发表了文章 • 1 个评论 • 598 次浏览 • 2018-05-31 23:23 • 来自相关话题

常见的数据库都会提供备份的机制,以解决在数据库无法使用的情况下,可以开启新的实例,然后通过备份来恢复数据减少损失。虽然 Elasticsearch 有良好的容灾性,但由于以下原因,其依然需要备份机制。

  1. 数据灾备。在整个集群无法正常工作时,可以及时从备份中恢复数据。
  2. 归档数据。随着数据的积累,比如日志类的数据,集群的存储压力会越来越大,不管是内存还是磁盘都要承担数据增多带来的压力,此时我们往往会选择只保留最近一段时间的数据,比如1个月,而将1个月之前的数据删除。如果你不想删除这些数据,以备后续有查看的需求,那么你就可以将这些数据以备份的形式归档。
  3. 迁移数据。当你需要将数据从一个集群迁移到另一个集群时,也可以用备份的方式来实现。

Elasticsearch 做备份有两种方式,一是将数据导出成文本文件,比如通过 elasticdumpesm 等工具将存储在 Elasticsearch 中的数据导出到文件中。二是以备份 elasticsearch data 目录中文件的形式来做快照,也就是 Elasticsearch 中 snapshot 接口实现的功能。第一种方式相对简单,在数据量小的时候比较实用,当应对大数据量场景效率就大打折扣。我们今天就着重讲解下第二种备份的方式,即 snapshot api 的使用。

备份要解决备份到哪里、如何备份、何时备份和如何恢复的问题,那么我们接下来一个个解决。

1. 备份到哪里

在 Elasticsearch 中通过 repository 定义备份存储类型和位置,存储类型有共享文件系统、AWS 的 S3存储、HDFS、微软 Azure的存储、Google Cloud 的存储等,当然你也可以自己写代码实现国内阿里云的存储。我们这里以最简单的共享文件系统为例,你也可以在本地做实验。

首先,你要在 elasticsearch.yml 的配置文件中注明可以用作备份路径 path.repo ,如下所示:

path.repo: ["/mount/backups", "/mount/longterm_backups"]

配置好后,就可以使用 snapshot api 来创建一个 repository 了,如下我们创建一个名为 my_backup 的 repository。

PUT /_snapshot/my_backup
{
  "type": "fs",
  "settings": {
    "location": "/mount/backups/my_backup"
  }
}

之后我们就可以在这个 repository 中来备份数据了。

2. 如何备份

有了 repostiroy 后,我们就可以做备份了,也叫快照,也就是记录当下数据的状态。如下所示我们创建一个名为 snapshot_1 的快照。

PUT /_snapshot/my_backup/snapshot_1?wait_for_completion=true

wait_for_completion 为 true 是指该 api 在备份执行完毕后再返回结果,否则默认是异步执行的,我们这里为了立刻看到效果,所以设置了该参数,线上执行时不用设置该参数,让其在后台异步执行即可。

执行成功后会返回如下结果,用于说明备份的情况:

{
  "snapshots": [
    {
      "snapshot": "snapshot_1",
      "uuid": "52Lr4aFuQYGjMEv5ZFeFEg",
      "version_id": 6030099,
      "version": "6.3.0",
      "indices": [
        ".monitoring-kibana-6-2018.05.30",
        ".monitoring-es-6-2018.05.28",
        ".watcher-history-7-2018.05.30",
        ".monitoring-beats-6-2018.05.29",
        "metricbeat-6.2.4-2018.05.28",
        ".monitoring-alerts-6",
        "metricbeat-6.2.4-2018.05.30"
      ],
      "include_global_state": true,
      "state": "SUCCESS",
      "start_time": "2018-05-31T12:45:57.492Z",
      "start_time_in_millis": 1527770757492,
      "end_time": "2018-05-31T12:46:15.214Z",
      "end_time_in_millis": 1527770775214,
      "duration_in_millis": 17722,
      "failures": [],
      "shards": {
        "total": 28,
        "failed": 0,
        "successful": 28
      }
    }
  ]
}

返回结果的参数意义都是比较直观的,比如 indices 指明此次备份涉及到的索引名称,由于我们没有指定需要备份的索引,这里备份了所有索引;state 指明状态;duration_in_millis 指明备份任务执行时长等。

我们可以通过 GET _snapshot/my_backup/snapshot_1获取 snapshot_1 的执行状态。

此时如果去 /mount/backups/my_backup 查看,会发现里面多了很多文件,这些文件其实都是基于 elasticsearch data 目录中的文件生成的压缩存储的备份文件。大家可以通过 du -sh . 命令看一下该目录的大小,方便后续做对比。

3. 何时备份

通过上面的步骤我们成功创建了一个备份,但随着数据的新增,我们需要对新增的数据也做备份,那么我们如何做呢?方法很简单,只要再创建一个快照 snapshot_2 就可以了。

PUT /_snapshot/my_backup/snapshot_2?wait_for_completion=true

当执行完毕后,你会发现 /mount/backups/my_backup 体积变大了。这说明新数据备份进来了。要说明的一点是,当你在同一个 repository 中做多次 snapshot 时,elasticsearch 会检查要备份的数据 segment 文件是否有变化,如果没有变化则不处理,否则只会把发生变化的 segment file 备份下来。这其实就实现了增量备份。

elasticsearch 的资深用户应该了解 force merge 功能,即可以强行将一个索引的 segment file 合并成指定数目,这里要注意的是如果你主动调用 force merge api,那么 snapshot 功能的增量备份功能就失效了,因为 api 调用完毕后,数据目录中的所有 segment file 都发生变化了。

另一个就是备份时机的问题,虽然 snapshot 不会占用太多的 cpu、磁盘和网络资源,但还是建议大家尽量在闲时做备份。

4. 如何恢复

所谓“养兵千日,用兵一时”,我们该演练下备份的成果,将其恢复出来。通过调用如下 api 即可快速实现恢复功能。

POST /_snapshot/my_backup/snapshot_1/_restore?wait_for_completion=true
{
  "indices": "index_1",
  "rename_replacement": "restored_index_1"
}

通过上面的 api,我们可以将 index_1 索引恢复到 restored_index_1 中。这个恢复过程完全是基于文件的,因此效率会比较高。

虽然我们这里演示的是在同一个集群做备份与恢复,你也可以在另一个集群上连接该 repository 做恢复。我们这里就不做说明了。

5. 其他

由于 Elasticsearch 版本更新比较快,因此大家在做备份与恢复的时候,要注意版本问题,同一个大版本之间的备份与恢复是没有问题的,比如都是 5.1 和 5.6 之间可以互相备份恢复。但你不能把一个高版本的备份在低版本恢复,比如将 6.x 的备份在 5.x 中恢复。而低版本备份在高版本恢复有一定要求:

1) 5.x 可以在 6.x 恢复

2) 2.x 可以在 5.x 恢复

3) 1.x 可以在 2.x 恢复

其他跨大版本的升级都是不可用的,比如1.x 的无法在 5.x 恢复。这里主要原因还是 Lucene 版本问题导致的,每一次 ES 的大版本升级都会伴随 Lucene 的大版本,而 Lucene 的版本是尽量保证向前兼容,即新版可以读旧版的文件,但版本跨越太多,无法实现兼容的情况也在所难免了。

6. 继续学习

本文只是简单对 snapshot 功能做了一个演示,希望这足够引起你的兴趣。如果你想进一步深入的了解该功能,比如备份的时候如何指定部分索引、如何查询备份和还原的进度、如何跨集群恢复数据、如何备份到 HDFS 等,可以详细阅读官方手册https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html,如果在使用的过程中遇到了问题,欢迎留言讨论。

Elasticsearch如何实现 SQL语句中 Group By 和 Limit 的功能

Elasticsearchrockybean 发表了文章 • 2 个评论 • 399 次浏览 • 2018-05-21 07:45 • 来自相关话题

有 SQL 背景的同学在学习 Elasticsearch 时,面对一个查询需求,不由自主地会先思考如何用 SQL 来实现,然后再去想 Elasticsearch 的 Query DSL 如何实现。那么本篇就给大家讲一条常见的 SQL 语句如何用 Elasticsearch 的查询语言实现。

1. SQL语句

假设我们有一个汽车的数据集,每个汽车都有车型、颜色等字段,我希望获取颜色种类大于1个的前2车型。假设汽车的数据模型如下:

{
    "model":"modelA",
    "color":"red"
}

假设我们有一个 cars 表,通过如下语句创建测试数据。

INSERT INTO cars (model,color) VALUES ('A','red'); 
INSERT INTO cars (model,color) VALUES ('A','white'); 
INSERT INTO cars (model,color) VALUES ('A','black'); 
INSERT INTO cars (model,color) VALUES ('A','yellow'); 
INSERT INTO cars (model,color) VALUES ('B','red'); 
INSERT INTO cars (model,color) VALUES ('B','white'); 
INSERT INTO cars (model,color) VALUES ('C','black'); 
INSERT INTO cars (model,color) VALUES ('C','red'); 
INSERT INTO cars (model,color) VALUES ('C','white'); 
INSERT INTO cars (model,color) VALUES ('C','yellow'); 
INSERT INTO cars (model,color) VALUES ('C','blue'); 
INSERT INTO cars (model,color) VALUES ('D','red');
INSERT INTO cars (model,color) VALUES ('A','red'); 

那么实现我们需求的 SQL 语句也比较简单,实现如下:

SELECT model,COUNT(DISTINCT color) color_count FROM cars GROUP BY model HAVING color_count > 1 ORDER BY color_count desc LIMIT 2;

这条查询语句中 Group By 是按照 model 做分组, Having color_count>1 限定了车型颜色种类大于1,ORDER BY color_count desc 限定结果按照颜色种类倒序排列,而 LIMIT 2 限定只返回前3条数据。

那么在 Elasticsearch 中如何实现这个需求呢?

2. 在 Elasticsearch 模拟测试数据

首先我们需要先在 elasticsearch 中插入测试的数据,这里我们使用 bulk 接口 ,如下所示:

POST _bulk
{"index":{"_index":"cars","_type":"doc","_id":"1"}}
{"model":"A","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"2"}}
{"model":"A","color":"white"}
{"index":{"_index":"cars","_type":"doc","_id":"3"}}
{"model":"A","color":"black"}
{"index":{"_index":"cars","_type":"doc","_id":"4"}}
{"model":"A","color":"yellow"}
{"index":{"_index":"cars","_type":"doc","_id":"5"}}
{"model":"B","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"6"}}
{"model":"B","color":"white"}
{"index":{"_index":"cars","_type":"doc","_id":"7"}}
{"model":"C","color":"black"}
{"index":{"_index":"cars","_type":"doc","_id":"8"}}
{"model":"C","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"9"}}
{"model":"C","color":"white"}
{"index":{"_index":"cars","_type":"doc","_id":"10"}}
{"model":"C","color":"yellow"}
{"index":{"_index":"cars","_type":"doc","_id":"11"}}
{"model":"C","color":"blue"}
{"index":{"_index":"cars","_type":"doc","_id":"12"}}
{"model":"D","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"13"}}
{"model":"A","color":"red"}

其中 index 为 cars,type 为 doc,所有数据与mysql 数据保持一致。大家可以在 Kibana 的 Dev Tools 中执行上面的命令,然后执行下面的查询语句验证数据是否已经成功存入。

GET cars/_search

3. Group By VS Terms/Metric Aggregation

SQL 中 Group By 语句在 Elasticsearch 中对应的是 Terms Aggregation,即分桶聚合,对应 Group By color 的语句如下所示:

GET cars/_search
{
  "size":0,
  "aggs":{
    "models":{
      "terms":{
        "field":"model.keyword"
      }
    }
  }
}

结果如下:

{
  "took": 161,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "A",
          "doc_count": 5
        },
        {
          "key": "C",
          "doc_count": 5
        },
        {
          "key": "B",
          "doc_count": 2
        },
        {
          "key": "D",
          "doc_count": 1
        }
      ]
    }
  }
}

我们看 aggregations 这个 key 下面的即为返回结果。

SQL 语句中还有一项是 COUNT(DISTINCT color) color_count 用于计算每个 model 的颜色数,在 Elasticsearch 中我们需要使用一个指标类聚合 Cardinality ,进行不同值计数。语句如下:

GET cars/_search
{
  "size": 0,
  "aggs": {
    "models": {
      "terms": {
        "field": "model.keyword"
      },
      "aggs": {
        "color_count": {
          "cardinality": {
            "field": "color.keyword"
          }
        }
      }
    }
  }
}

其返回结果如下:

{
  "took": 74,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "A",
          "doc_count": 5,
          "color_count": {
            "value": 4
          }
        },
        {
          "key": "C",
          "doc_count": 5,
          "color_count": {
            "value": 5
          }
        },
        {
          "key": "B",
          "doc_count": 2,
          "color_count": {
            "value": 2
          }
        },
        {
          "key": "D",
          "doc_count": 1,
          "color_count": {
            "value": 1
          }
        }
      ]
    }
  }
}

结果中 color_count 即为每个 model 的颜色数,但这里所有的模型都返回了,我们只想要颜色数大于1的模型,因此这里还要加一个过滤条件。

4. Having Condition VS Bucket Filter Aggregation

Having color_count > 1 在 Elasticsearch 中对应的是 Bucket Filter 聚合,语句如下所示:

GET cars/_search
{
  "size": 0,
  "aggs": {
    "models": {
      "terms": {
        "field": "model.keyword"
      },
      "aggs": {
        "color_count": {
          "cardinality": {
            "field": "color.keyword"
          }
        },
        "color_count_filter": {
          "bucket_selector": {
            "buckets_path": {
              "colorCount": "color_count"
            },
            "script": "params.colorCount>1"
          }
        }
      }
    }
  }
}

返回结果如下:

{
  "took": 39,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "A",
          "doc_count": 5,
          "color_count": {
            "value": 4
          }
        },
        {
          "key": "C",
          "doc_count": 5,
          "color_count": {
            "value": 5
          }
        },
        {
          "key": "B",
          "doc_count": 2,
          "color_count": {
            "value": 2
          }
        }
      ]
    }
  }
}

此时返回结果只包含颜色数大于1的模型,但大家会发现颜色数多的 C 不是在第一个位置,我们还需要做排序处理。

5. Order By Limit VS Bucket Sort Aggregation

ORDER BY color_count desc LIMIT 3 在 Elasticsearch 中可以使用 Bucket Sort 聚合实现,语句如下所示:

GET cars/_search
{
  "size": 0,
  "aggs": {
    "models": {
      "terms": {
        "field": "model.keyword"
      },
      "aggs": {
        "color_count": {
          "cardinality": {
            "field": "color.keyword"
          }
        },
        "color_count_filter": {
          "bucket_selector": {
            "buckets_path": {
              "colorCount": "color_count"
            },
            "script": "params.colorCount>1"
          }
        },
        "color_count_sort": {
          "bucket_sort": {
            "sort": {
              "color_count": "desc"
            },
            "size": 2
          }
        }
      }
    }
  }
}

返回结果如下:

{
  "took": 32,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "C",
          "doc_count": 5,
          "color_count": {
            "value": 5
          }
        },
        {
          "key": "A",
          "doc_count": 5,
          "color_count": {
            "value": 4
          }
        }
      ]
    }
  }
}

至此我们便将 SQL 语句实现的功能用 Elasticsearch 查询语句实现了。对比 SQL 语句与 Elasticsearch 的查询语句,大家会发现后者复杂了很多,但并非无章可循,随着大家对常见语法越来越熟悉,相信一定会越写越得心应手!

《Elastic Stack 从入门到实践》的课程已在慕课网上线,一次搞定 es logstash beats kibana

资料分享rockybean 发表了文章 • 2 个评论 • 1246 次浏览 • 2018-04-03 22:58 • 来自相关话题

大家好,经过近半年的辛勤努力,我在慕课网推出了《Elastic Stack 从入门到实践》的课程(https://coding.imooc.com/class/chapter/181.html),其中包含了 elasticsearch 教程、beats 和 logstash 教程、kibana 教程,简单看下课程的内容:

第1章 课程概述 对课程整体进行介绍给出相关学习说明和建议 第2章 Elasticsearch 篇之 入门 本章会对 Elasticsearch 篇进行一个总体的介绍,让大家对该篇每一章要讲解的内容有初步的了解。然后会讲解 Elasticsearch 中常见的术语、api,然后运行 Elasticsearch 并实际感受 api 的调用方式,为接下来的课程做好准备。 第3章 Elasticsearch 篇之倒排索引与分词 本章会讲解搜索引擎的基础倒排索引,让大家对倒排索引有一个直观的认识,掌握它的组成。然后为大家讲解分词的相关知识,介绍 es 内置的分词器,还会介绍中文分词的常见解决方案。 第4章 Elasticsearch 篇之Mapping 设置 本章会讲解 Elasticsearch 中数据建模的基础--Mapping,即如何定义数据字段和类型。让大家熟悉 mapping 中常见的配置项,也会讲解 dynamic mapping 和 template 的相关知识。 第5章 Elasticsearch 篇之Search API 介绍 本章会讲解搜索特性,详细讲解 Search API 的组成和分类,带领大家逐个了解、掌握 API 的使用方法和技巧。 第6章 Elasticsearch 篇之分布式特性介绍 本章会讲解 Elasticsearch 集群是如何一步步搭建起来的,让大家了解不同节点类型的作用,shard 设计的意义以及文档是如何存储到 shard 上的,也会给大家介绍脑裂等问题。 第7章 Elasticsearch 篇之深入了解 Search 的运行机制 本章会深入讲解 Search 的运行机制,比如 Query 和 Fetch 阶段具体哪些工作,分片为相关性算分带来了哪些问题。另外还会讲解排序、分页与遍历的解决方案和相关问题。 第8章 Elasticsearch 篇之聚合分析入门 本章会介绍 Elasticsearch 聚合分析的功能,让大家了解其分类、组成,带领大家逐个了解、掌握每一个聚合 API 的使用方法和技巧,为后续 Kibana 使用打好基础。 第9章 Elasticsearch 篇之数据建模 本章会介绍使用 Elasticsearch 中要注意的数据建模常见问题以及优化思路和方案,让大家可以根据自己的业务场景设置最合理的模型。 第10章 Elasticsearch 篇之集群调优建议 本章会介绍 Elasticsearch 集群在搭建、配置上的注意事项,也会讲解读写性能优化的方案和调优的方式。 第11章 Logstash 篇之入门与运行机制 本章会介绍 Logstash 的作用、使用方法,让大家了解其组成和运行机制,带领大家实际操作 Logstash 来收集1个日志文件。 第12章 Logstash 篇之插件详解 本章会详细介绍 Input、Filter、Ouput 以及 Codec 插件 的作用和相关配置,让大家了解常见相关插件的使用场景和效果,以及如何合理选择各个插件来实现自己的业务需求。 第13章 Logstash 篇之实例分析 本章会以实例的形式为大家演示如何使用 Logstash 收集各种类型的数据,比如日志文件、数据库、tcp/udp 等。 第14章 Beats 篇之Filebeat 本章会介绍 Beats 的作用和组成,然后为大家详细介绍 Filebeat 的功能和常见配置,同时会详细讲解如何使用 Module 模块来快速完成日志的收集到分析工作。 第15章 Beats 篇之Metricbeat 本章会介绍 Metricbeat 的功能和使用技巧,让大家对 Metricbeat 的使用有一个直观的感受。 第16章 Beats 篇之Packetbeat 本章会介绍 Packetbeat 的功能和使用技巧,带领大家用 Packetbeat 来收集网络数据并进行分析,让大家对 Packetbeat 有一个直观的感受。 第17章 Beats 篇之其他 beat 本章会介绍其他众多beat的作用和应用场景,带领大家去发现社区提供的多种多样的beat,以满足日常业务开发的需求。 第18章 Kibana 篇之 入门与管理 本章会介绍 Kibana 的入门知识,让大家对 Kibana 有一个整体的了解,另外还会详细介绍Management 的功能,熟悉 Kibana 的配置。 第19章 Kibana 篇之 数据探索 Discovery 本章会介绍 Kibana 的数据探索功能,让大家了解 Discovery 的功能和使用技巧。 第20章 Kibana 篇之 可视化分析 本章会介绍Kibana 的可视化分析功能,首先会带领大家逐个操作 Kibana 提供的每一个图表,并会介绍时序分析工具 Timelion,然后会介绍如何使用 Dashboard功能来整合图表后讲故事或者做报表,也会讲解 Dashboard 使用中要注意的问题和使用技巧。 ... 第21章 实践篇 之搜索项目 本章会讲解一个搜索引擎相关的实践项目,带领大家通过编写少量的代码,快速基于 Elastic Stack 来构建一个具备常见搜索功能的系统,比如类似 Airbnb 的搜房系统、豆瓣电影等。 第22章 实践篇 之日志分析项目 本章会根据慕课网的日志为大家展示如何使用 Elastic Stack 来快速分析日志数据,带领大家一步步完成数据收集、处理、存储到可视化分析的步骤,最终打造属于自己的 Dashboard。 第23章 实践篇 之数据分析项目 本章会为大家展示如何使用 Elastic Stack 来分析身边的数据,比如空气质量分析、订单数据分析等等,让大家通过本章的学习可以快速将 Elastic Stack 应用到实际生活中。  

  实践方面我从搜索项目、日志分析和数据分析三个维度介绍了 Elastic Stack 的功能,可以看下最终的效果截图:  
MyAirbnb.png
 
[Project]_imooc_log_-Nginx_Overview.png
   
[Project]_北京的空气质量这些年有变好吗?.png
[Project]_2016年的北京雾霾.png
  那么剩下的就看你们了!                

ElasticTalk 第一期来袭!使用 ElasticStack 收集分析 Nginx 日志

活动rockybean 发表了文章 • 4 个评论 • 743 次浏览 • 2017-11-27 15:15 • 来自相关话题

今天正式启动 ElasticTalk 的活动,旨在通过线上直播的方式和大家交流 elastic 产品相关的知识。 第一期将于本周四(11月30日)晚8点在线直播,主题为使用 ElasticStack 收集和分析 Nginx 日志。感兴趣的同学可以加群讨论!

elastic_tips.001.jpeg

今天正式启动 ElasticTalk 的活动,旨在通过线上直播的方式和大家交流 elastic 产品相关的知识。 第一期将于本周四(11月30日)晚8点在线直播,主题为使用 ElasticStack 收集和分析 Nginx 日志。感兴趣的同学可以加群讨论!

elastic_tips.001.jpeg

【视频】ElasticTalk#4 Elastic认证考试那些事儿

资讯动态rockybean 发表了文章 • 2 个评论 • 145 次浏览 • 2018-07-27 07:56 • 来自相关话题

Elastic 在今年6月29日推出了面向 Elasticsearch 工程师的认证考试,官方描述如下: The Elastic Certification Program was created to recognize individuals who have demonstrated a high-level of knowledge, competence and expertise with Elasticsearch. Elastic Certified Professionals demonstrate these skills by completing challenging and relevant real-world tasks on a live Elastic Stack cluster in our hands-on, performance-based certification exams. 我们此次直播便邀请中国第1位通过该认证的工程师 rockybean 来分享下认证考试的一些信息,通过这次直播,你可以了解如下信息:
  1. 如何注册考试?费用?
  2. 如何准备考试?
  3. 考试的形式是怎样的?有哪些类型的考题?
本次直播由于设备问题,声音有些卡顿,大家见谅! 视频链接如下: http://v.qq.com/x/page/f073779epxd.html  

【直播预告】ElasticTalk #4 Elastic 官方认证考试那些事儿

资料分享rockybean 发表了文章 • 0 个评论 • 159 次浏览 • 2018-07-23 08:33 • 来自相关话题

大家好,ElasticTalk 第4次直播将于本周进行,主题是关于 Elastic 官方认证考试的。   我于7月初成功通过了 Elastic Certified Engineer 的考试,拿到下面的徽章。
bin_certificate.png
  感兴趣的同学可以扫下面海报中的二维码或者搜索 elastic-talk 微信号,添加好友后进入直播群。  
phone_post.001_.jpeg
 
大家好,ElasticTalk 第4次直播将于本周进行,主题是关于 Elastic 官方认证考试的。   我于7月初成功通过了 Elastic Certified Engineer 的考试,拿到下面的徽章。
bin_certificate.png
  感兴趣的同学可以扫下面海报中的二维码或者搜索 elastic-talk 微信号,添加好友后进入直播群。  
phone_post.001_.jpeg
 

ET001 不可不掌握的 Logstash 使用技巧

Logstashrockybean 发表了文章 • 3 个评论 • 234 次浏览 • 2018-07-21 11:53 • 来自相关话题

Logstash 是 Elastic Stack 中功能最强大的 ETL 工具,相较于 beats 家族,虽然它略显臃肿,但是强在功能丰富、处理能力强大。大家在使用的过程中肯定也体验过其启动时的慢吞吞,那么有什么办法可以减少等待 Logstash 的启动时间,提高编写其处理配置文件的效率呢?本文给大家推荐一个小技巧,帮助大家解决如下两个问题,让大家更好地与这个笨重的大家伙相处。

  1. 减少 Logstash 重启的次数,也就节省宝贵的时间
  2. 方便快捷地向 Logstash 输入需要处理的内容

1. 打开 reload 配置开关

Logstash 启动的时候可以加上 -r 的参数来做到配置文件热加载,效果是:

  • 当你修改了配置文件后,无需重启 Logstash 即可让新配置文件生效。

它的含义如下:

当你写好配置文件,比如 test.conf ,启动命令如下:

bin/logstash -f test.conf -r

启动完毕,修改 test.conf 的内容并保存后,过 1 秒钟,你会发现 Logstash 端有类似如下日志输出(注意红色框标记的部分),此时说明 reload 的成功。

如果你修改的配置文件有错误,会看到报错的日志,你可以根据错误提示修改。

至此,第一个问题解决!

2. 使用 HTTP INPUT

编写配置文件的另一个痛点是需要针对不同格式的输入内容进行详细的测试,以防解析报错的情况出现。此时大家常用标准输入来解决这个问题(stdin input),但是标准输入对于文字编辑支持不太友好,而且配置文件热更新的功能也不支持标准输入。

在这里向大家推荐使用 http input 插件,配置如下:

input{
    http{
        port => 7474
        codec => "json"
    }
}

然后大家再用自己喜欢的 http 请求工具,比如 POSTMan、Insomnia 等向 http://loclahost:7474发送待测试内容即可,如下是 Insomnia 的截图。

至此,第二个问题也解决了。

3. 总结

相信看到这里,大家一定是跃跃欲试了,赶紧打开电脑,找到 Logstash,然后编辑 test.conf,输入如下内容:

input{
    http{
        port => 7474
        codec => "json"
    }
}

filter{

}

output{
        stdout{
        codec => rubydebug{
            metadata => true
        }
    }
}

然后执行启动命令:

bin/logstash -f test.conf -r

打开 Insomnia ,输入要测试的内容,点击发送,开始舒爽流畅的配置文件编写之旅吧!

ElasticTalk #3 Elasticsearch压测实战 II esrally 进阶实战

资料分享rockybean 发表了文章 • 0 个评论 • 86 次浏览 • 2018-07-20 19:51 • 来自相关话题

ElasticTalk 第3期 直播的内容是 Elasticsearch 压测实战之 esrally 进阶实战。 本次我们主要讲解了 esrally 如何自定义测试集群、自定义数据集和报告,最后还讲了三步上手 esrally 的方法。   视频地址如下: http://www.bilibili.com/video/av27117279/
ElasticTalk 第3期 直播的内容是 Elasticsearch 压测实战之 esrally 进阶实战。 本次我们主要讲解了 esrally 如何自定义测试集群、自定义数据集和报告,最后还讲了三步上手 esrally 的方法。   视频地址如下: http://www.bilibili.com/video/av27117279/

ElasticTalk #2 Elasticsearch压测实战 I esrally 入门与实战

资料分享rockybean 发表了文章 • 0 个评论 • 105 次浏览 • 2018-07-20 19:49 • 来自相关话题

  ElasticTalk 第2期 直播的内容是 Elasticsearch 压测实战之 esrally 入门和实战。希望这次直播可以帮助大家快速掌握 esrally 这款优秀的 es 压测工具。   视频地址如下: https://www.bilibili.com/video/av27114309/
  ElasticTalk 第2期 直播的内容是 Elasticsearch 压测实战之 esrally 入门和实战。希望这次直播可以帮助大家快速掌握 esrally 这款优秀的 es 压测工具。   视频地址如下: https://www.bilibili.com/video/av27114309/

ElasticTalk #1 用 ElasticStack 快速收集和分析 Nginx 日志

资料分享rockybean 发表了文章 • 2 个评论 • 130 次浏览 • 2018-07-20 19:45 • 来自相关话题

  去年做了3期 ElasticTalk 的直播节目,预计下周开始恢复。现在放出相关的视频内容,希望对大家有所帮助。   第1期的课程内容为用 ElasticStack 快速收集分析 Nginx 日志,其中详细讲解了如何使用 filebeat 的 module 功能。     视频地址如下: https://www.bilibili.com/video/av27123368/
  去年做了3期 ElasticTalk 的直播节目,预计下周开始恢复。现在放出相关的视频内容,希望对大家有所帮助。   第1期的课程内容为用 ElasticStack 快速收集分析 Nginx 日志,其中详细讲解了如何使用 filebeat 的 module 功能。     视频地址如下: https://www.bilibili.com/video/av27123368/

Elasticsearch snapshot 备份的使用方法

Elasticsearchrockybean 发表了文章 • 1 个评论 • 598 次浏览 • 2018-05-31 23:23 • 来自相关话题

常见的数据库都会提供备份的机制,以解决在数据库无法使用的情况下,可以开启新的实例,然后通过备份来恢复数据减少损失。虽然 Elasticsearch 有良好的容灾性,但由于以下原因,其依然需要备份机制。

  1. 数据灾备。在整个集群无法正常工作时,可以及时从备份中恢复数据。
  2. 归档数据。随着数据的积累,比如日志类的数据,集群的存储压力会越来越大,不管是内存还是磁盘都要承担数据增多带来的压力,此时我们往往会选择只保留最近一段时间的数据,比如1个月,而将1个月之前的数据删除。如果你不想删除这些数据,以备后续有查看的需求,那么你就可以将这些数据以备份的形式归档。
  3. 迁移数据。当你需要将数据从一个集群迁移到另一个集群时,也可以用备份的方式来实现。

Elasticsearch 做备份有两种方式,一是将数据导出成文本文件,比如通过 elasticdumpesm 等工具将存储在 Elasticsearch 中的数据导出到文件中。二是以备份 elasticsearch data 目录中文件的形式来做快照,也就是 Elasticsearch 中 snapshot 接口实现的功能。第一种方式相对简单,在数据量小的时候比较实用,当应对大数据量场景效率就大打折扣。我们今天就着重讲解下第二种备份的方式,即 snapshot api 的使用。

备份要解决备份到哪里、如何备份、何时备份和如何恢复的问题,那么我们接下来一个个解决。

1. 备份到哪里

在 Elasticsearch 中通过 repository 定义备份存储类型和位置,存储类型有共享文件系统、AWS 的 S3存储、HDFS、微软 Azure的存储、Google Cloud 的存储等,当然你也可以自己写代码实现国内阿里云的存储。我们这里以最简单的共享文件系统为例,你也可以在本地做实验。

首先,你要在 elasticsearch.yml 的配置文件中注明可以用作备份路径 path.repo ,如下所示:

path.repo: ["/mount/backups", "/mount/longterm_backups"]

配置好后,就可以使用 snapshot api 来创建一个 repository 了,如下我们创建一个名为 my_backup 的 repository。

PUT /_snapshot/my_backup
{
  "type": "fs",
  "settings": {
    "location": "/mount/backups/my_backup"
  }
}

之后我们就可以在这个 repository 中来备份数据了。

2. 如何备份

有了 repostiroy 后,我们就可以做备份了,也叫快照,也就是记录当下数据的状态。如下所示我们创建一个名为 snapshot_1 的快照。

PUT /_snapshot/my_backup/snapshot_1?wait_for_completion=true

wait_for_completion 为 true 是指该 api 在备份执行完毕后再返回结果,否则默认是异步执行的,我们这里为了立刻看到效果,所以设置了该参数,线上执行时不用设置该参数,让其在后台异步执行即可。

执行成功后会返回如下结果,用于说明备份的情况:

{
  "snapshots": [
    {
      "snapshot": "snapshot_1",
      "uuid": "52Lr4aFuQYGjMEv5ZFeFEg",
      "version_id": 6030099,
      "version": "6.3.0",
      "indices": [
        ".monitoring-kibana-6-2018.05.30",
        ".monitoring-es-6-2018.05.28",
        ".watcher-history-7-2018.05.30",
        ".monitoring-beats-6-2018.05.29",
        "metricbeat-6.2.4-2018.05.28",
        ".monitoring-alerts-6",
        "metricbeat-6.2.4-2018.05.30"
      ],
      "include_global_state": true,
      "state": "SUCCESS",
      "start_time": "2018-05-31T12:45:57.492Z",
      "start_time_in_millis": 1527770757492,
      "end_time": "2018-05-31T12:46:15.214Z",
      "end_time_in_millis": 1527770775214,
      "duration_in_millis": 17722,
      "failures": [],
      "shards": {
        "total": 28,
        "failed": 0,
        "successful": 28
      }
    }
  ]
}

返回结果的参数意义都是比较直观的,比如 indices 指明此次备份涉及到的索引名称,由于我们没有指定需要备份的索引,这里备份了所有索引;state 指明状态;duration_in_millis 指明备份任务执行时长等。

我们可以通过 GET _snapshot/my_backup/snapshot_1获取 snapshot_1 的执行状态。

此时如果去 /mount/backups/my_backup 查看,会发现里面多了很多文件,这些文件其实都是基于 elasticsearch data 目录中的文件生成的压缩存储的备份文件。大家可以通过 du -sh . 命令看一下该目录的大小,方便后续做对比。

3. 何时备份

通过上面的步骤我们成功创建了一个备份,但随着数据的新增,我们需要对新增的数据也做备份,那么我们如何做呢?方法很简单,只要再创建一个快照 snapshot_2 就可以了。

PUT /_snapshot/my_backup/snapshot_2?wait_for_completion=true

当执行完毕后,你会发现 /mount/backups/my_backup 体积变大了。这说明新数据备份进来了。要说明的一点是,当你在同一个 repository 中做多次 snapshot 时,elasticsearch 会检查要备份的数据 segment 文件是否有变化,如果没有变化则不处理,否则只会把发生变化的 segment file 备份下来。这其实就实现了增量备份。

elasticsearch 的资深用户应该了解 force merge 功能,即可以强行将一个索引的 segment file 合并成指定数目,这里要注意的是如果你主动调用 force merge api,那么 snapshot 功能的增量备份功能就失效了,因为 api 调用完毕后,数据目录中的所有 segment file 都发生变化了。

另一个就是备份时机的问题,虽然 snapshot 不会占用太多的 cpu、磁盘和网络资源,但还是建议大家尽量在闲时做备份。

4. 如何恢复

所谓“养兵千日,用兵一时”,我们该演练下备份的成果,将其恢复出来。通过调用如下 api 即可快速实现恢复功能。

POST /_snapshot/my_backup/snapshot_1/_restore?wait_for_completion=true
{
  "indices": "index_1",
  "rename_replacement": "restored_index_1"
}

通过上面的 api,我们可以将 index_1 索引恢复到 restored_index_1 中。这个恢复过程完全是基于文件的,因此效率会比较高。

虽然我们这里演示的是在同一个集群做备份与恢复,你也可以在另一个集群上连接该 repository 做恢复。我们这里就不做说明了。

5. 其他

由于 Elasticsearch 版本更新比较快,因此大家在做备份与恢复的时候,要注意版本问题,同一个大版本之间的备份与恢复是没有问题的,比如都是 5.1 和 5.6 之间可以互相备份恢复。但你不能把一个高版本的备份在低版本恢复,比如将 6.x 的备份在 5.x 中恢复。而低版本备份在高版本恢复有一定要求:

1) 5.x 可以在 6.x 恢复

2) 2.x 可以在 5.x 恢复

3) 1.x 可以在 2.x 恢复

其他跨大版本的升级都是不可用的,比如1.x 的无法在 5.x 恢复。这里主要原因还是 Lucene 版本问题导致的,每一次 ES 的大版本升级都会伴随 Lucene 的大版本,而 Lucene 的版本是尽量保证向前兼容,即新版可以读旧版的文件,但版本跨越太多,无法实现兼容的情况也在所难免了。

6. 继续学习

本文只是简单对 snapshot 功能做了一个演示,希望这足够引起你的兴趣。如果你想进一步深入的了解该功能,比如备份的时候如何指定部分索引、如何查询备份和还原的进度、如何跨集群恢复数据、如何备份到 HDFS 等,可以详细阅读官方手册https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html,如果在使用的过程中遇到了问题,欢迎留言讨论。

Elasticsearch如何实现 SQL语句中 Group By 和 Limit 的功能

Elasticsearchrockybean 发表了文章 • 2 个评论 • 399 次浏览 • 2018-05-21 07:45 • 来自相关话题

有 SQL 背景的同学在学习 Elasticsearch 时,面对一个查询需求,不由自主地会先思考如何用 SQL 来实现,然后再去想 Elasticsearch 的 Query DSL 如何实现。那么本篇就给大家讲一条常见的 SQL 语句如何用 Elasticsearch 的查询语言实现。

1. SQL语句

假设我们有一个汽车的数据集,每个汽车都有车型、颜色等字段,我希望获取颜色种类大于1个的前2车型。假设汽车的数据模型如下:

{
    "model":"modelA",
    "color":"red"
}

假设我们有一个 cars 表,通过如下语句创建测试数据。

INSERT INTO cars (model,color) VALUES ('A','red'); 
INSERT INTO cars (model,color) VALUES ('A','white'); 
INSERT INTO cars (model,color) VALUES ('A','black'); 
INSERT INTO cars (model,color) VALUES ('A','yellow'); 
INSERT INTO cars (model,color) VALUES ('B','red'); 
INSERT INTO cars (model,color) VALUES ('B','white'); 
INSERT INTO cars (model,color) VALUES ('C','black'); 
INSERT INTO cars (model,color) VALUES ('C','red'); 
INSERT INTO cars (model,color) VALUES ('C','white'); 
INSERT INTO cars (model,color) VALUES ('C','yellow'); 
INSERT INTO cars (model,color) VALUES ('C','blue'); 
INSERT INTO cars (model,color) VALUES ('D','red');
INSERT INTO cars (model,color) VALUES ('A','red'); 

那么实现我们需求的 SQL 语句也比较简单,实现如下:

SELECT model,COUNT(DISTINCT color) color_count FROM cars GROUP BY model HAVING color_count > 1 ORDER BY color_count desc LIMIT 2;

这条查询语句中 Group By 是按照 model 做分组, Having color_count>1 限定了车型颜色种类大于1,ORDER BY color_count desc 限定结果按照颜色种类倒序排列,而 LIMIT 2 限定只返回前3条数据。

那么在 Elasticsearch 中如何实现这个需求呢?

2. 在 Elasticsearch 模拟测试数据

首先我们需要先在 elasticsearch 中插入测试的数据,这里我们使用 bulk 接口 ,如下所示:

POST _bulk
{"index":{"_index":"cars","_type":"doc","_id":"1"}}
{"model":"A","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"2"}}
{"model":"A","color":"white"}
{"index":{"_index":"cars","_type":"doc","_id":"3"}}
{"model":"A","color":"black"}
{"index":{"_index":"cars","_type":"doc","_id":"4"}}
{"model":"A","color":"yellow"}
{"index":{"_index":"cars","_type":"doc","_id":"5"}}
{"model":"B","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"6"}}
{"model":"B","color":"white"}
{"index":{"_index":"cars","_type":"doc","_id":"7"}}
{"model":"C","color":"black"}
{"index":{"_index":"cars","_type":"doc","_id":"8"}}
{"model":"C","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"9"}}
{"model":"C","color":"white"}
{"index":{"_index":"cars","_type":"doc","_id":"10"}}
{"model":"C","color":"yellow"}
{"index":{"_index":"cars","_type":"doc","_id":"11"}}
{"model":"C","color":"blue"}
{"index":{"_index":"cars","_type":"doc","_id":"12"}}
{"model":"D","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"13"}}
{"model":"A","color":"red"}

其中 index 为 cars,type 为 doc,所有数据与mysql 数据保持一致。大家可以在 Kibana 的 Dev Tools 中执行上面的命令,然后执行下面的查询语句验证数据是否已经成功存入。

GET cars/_search

3. Group By VS Terms/Metric Aggregation

SQL 中 Group By 语句在 Elasticsearch 中对应的是 Terms Aggregation,即分桶聚合,对应 Group By color 的语句如下所示:

GET cars/_search
{
  "size":0,
  "aggs":{
    "models":{
      "terms":{
        "field":"model.keyword"
      }
    }
  }
}

结果如下:

{
  "took": 161,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "A",
          "doc_count": 5
        },
        {
          "key": "C",
          "doc_count": 5
        },
        {
          "key": "B",
          "doc_count": 2
        },
        {
          "key": "D",
          "doc_count": 1
        }
      ]
    }
  }
}

我们看 aggregations 这个 key 下面的即为返回结果。

SQL 语句中还有一项是 COUNT(DISTINCT color) color_count 用于计算每个 model 的颜色数,在 Elasticsearch 中我们需要使用一个指标类聚合 Cardinality ,进行不同值计数。语句如下:

GET cars/_search
{
  "size": 0,
  "aggs": {
    "models": {
      "terms": {
        "field": "model.keyword"
      },
      "aggs": {
        "color_count": {
          "cardinality": {
            "field": "color.keyword"
          }
        }
      }
    }
  }
}

其返回结果如下:

{
  "took": 74,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "A",
          "doc_count": 5,
          "color_count": {
            "value": 4
          }
        },
        {
          "key": "C",
          "doc_count": 5,
          "color_count": {
            "value": 5
          }
        },
        {
          "key": "B",
          "doc_count": 2,
          "color_count": {
            "value": 2
          }
        },
        {
          "key": "D",
          "doc_count": 1,
          "color_count": {
            "value": 1
          }
        }
      ]
    }
  }
}

结果中 color_count 即为每个 model 的颜色数,但这里所有的模型都返回了,我们只想要颜色数大于1的模型,因此这里还要加一个过滤条件。

4. Having Condition VS Bucket Filter Aggregation

Having color_count > 1 在 Elasticsearch 中对应的是 Bucket Filter 聚合,语句如下所示:

GET cars/_search
{
  "size": 0,
  "aggs": {
    "models": {
      "terms": {
        "field": "model.keyword"
      },
      "aggs": {
        "color_count": {
          "cardinality": {
            "field": "color.keyword"
          }
        },
        "color_count_filter": {
          "bucket_selector": {
            "buckets_path": {
              "colorCount": "color_count"
            },
            "script": "params.colorCount>1"
          }
        }
      }
    }
  }
}

返回结果如下:

{
  "took": 39,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "A",
          "doc_count": 5,
          "color_count": {
            "value": 4
          }
        },
        {
          "key": "C",
          "doc_count": 5,
          "color_count": {
            "value": 5
          }
        },
        {
          "key": "B",
          "doc_count": 2,
          "color_count": {
            "value": 2
          }
        }
      ]
    }
  }
}

此时返回结果只包含颜色数大于1的模型,但大家会发现颜色数多的 C 不是在第一个位置,我们还需要做排序处理。

5. Order By Limit VS Bucket Sort Aggregation

ORDER BY color_count desc LIMIT 3 在 Elasticsearch 中可以使用 Bucket Sort 聚合实现,语句如下所示:

GET cars/_search
{
  "size": 0,
  "aggs": {
    "models": {
      "terms": {
        "field": "model.keyword"
      },
      "aggs": {
        "color_count": {
          "cardinality": {
            "field": "color.keyword"
          }
        },
        "color_count_filter": {
          "bucket_selector": {
            "buckets_path": {
              "colorCount": "color_count"
            },
            "script": "params.colorCount>1"
          }
        },
        "color_count_sort": {
          "bucket_sort": {
            "sort": {
              "color_count": "desc"
            },
            "size": 2
          }
        }
      }
    }
  }
}

返回结果如下:

{
  "took": 32,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "C",
          "doc_count": 5,
          "color_count": {
            "value": 5
          }
        },
        {
          "key": "A",
          "doc_count": 5,
          "color_count": {
            "value": 4
          }
        }
      ]
    }
  }
}

至此我们便将 SQL 语句实现的功能用 Elasticsearch 查询语句实现了。对比 SQL 语句与 Elasticsearch 的查询语句,大家会发现后者复杂了很多,但并非无章可循,随着大家对常见语法越来越熟悉,相信一定会越写越得心应手!

《Elastic Stack 从入门到实践》的课程已在慕课网上线,一次搞定 es logstash beats kibana

资料分享rockybean 发表了文章 • 2 个评论 • 1246 次浏览 • 2018-04-03 22:58 • 来自相关话题

大家好,经过近半年的辛勤努力,我在慕课网推出了《Elastic Stack 从入门到实践》的课程(https://coding.imooc.com/class/chapter/181.html),其中包含了 elasticsearch 教程、beats 和 logstash 教程、kibana 教程,简单看下课程的内容:

第1章 课程概述 对课程整体进行介绍给出相关学习说明和建议 第2章 Elasticsearch 篇之 入门 本章会对 Elasticsearch 篇进行一个总体的介绍,让大家对该篇每一章要讲解的内容有初步的了解。然后会讲解 Elasticsearch 中常见的术语、api,然后运行 Elasticsearch 并实际感受 api 的调用方式,为接下来的课程做好准备。 第3章 Elasticsearch 篇之倒排索引与分词 本章会讲解搜索引擎的基础倒排索引,让大家对倒排索引有一个直观的认识,掌握它的组成。然后为大家讲解分词的相关知识,介绍 es 内置的分词器,还会介绍中文分词的常见解决方案。 第4章 Elasticsearch 篇之Mapping 设置 本章会讲解 Elasticsearch 中数据建模的基础--Mapping,即如何定义数据字段和类型。让大家熟悉 mapping 中常见的配置项,也会讲解 dynamic mapping 和 template 的相关知识。 第5章 Elasticsearch 篇之Search API 介绍 本章会讲解搜索特性,详细讲解 Search API 的组成和分类,带领大家逐个了解、掌握 API 的使用方法和技巧。 第6章 Elasticsearch 篇之分布式特性介绍 本章会讲解 Elasticsearch 集群是如何一步步搭建起来的,让大家了解不同节点类型的作用,shard 设计的意义以及文档是如何存储到 shard 上的,也会给大家介绍脑裂等问题。 第7章 Elasticsearch 篇之深入了解 Search 的运行机制 本章会深入讲解 Search 的运行机制,比如 Query 和 Fetch 阶段具体哪些工作,分片为相关性算分带来了哪些问题。另外还会讲解排序、分页与遍历的解决方案和相关问题。 第8章 Elasticsearch 篇之聚合分析入门 本章会介绍 Elasticsearch 聚合分析的功能,让大家了解其分类、组成,带领大家逐个了解、掌握每一个聚合 API 的使用方法和技巧,为后续 Kibana 使用打好基础。 第9章 Elasticsearch 篇之数据建模 本章会介绍使用 Elasticsearch 中要注意的数据建模常见问题以及优化思路和方案,让大家可以根据自己的业务场景设置最合理的模型。 第10章 Elasticsearch 篇之集群调优建议 本章会介绍 Elasticsearch 集群在搭建、配置上的注意事项,也会讲解读写性能优化的方案和调优的方式。 第11章 Logstash 篇之入门与运行机制 本章会介绍 Logstash 的作用、使用方法,让大家了解其组成和运行机制,带领大家实际操作 Logstash 来收集1个日志文件。 第12章 Logstash 篇之插件详解 本章会详细介绍 Input、Filter、Ouput 以及 Codec 插件 的作用和相关配置,让大家了解常见相关插件的使用场景和效果,以及如何合理选择各个插件来实现自己的业务需求。 第13章 Logstash 篇之实例分析 本章会以实例的形式为大家演示如何使用 Logstash 收集各种类型的数据,比如日志文件、数据库、tcp/udp 等。 第14章 Beats 篇之Filebeat 本章会介绍 Beats 的作用和组成,然后为大家详细介绍 Filebeat 的功能和常见配置,同时会详细讲解如何使用 Module 模块来快速完成日志的收集到分析工作。 第15章 Beats 篇之Metricbeat 本章会介绍 Metricbeat 的功能和使用技巧,让大家对 Metricbeat 的使用有一个直观的感受。 第16章 Beats 篇之Packetbeat 本章会介绍 Packetbeat 的功能和使用技巧,带领大家用 Packetbeat 来收集网络数据并进行分析,让大家对 Packetbeat 有一个直观的感受。 第17章 Beats 篇之其他 beat 本章会介绍其他众多beat的作用和应用场景,带领大家去发现社区提供的多种多样的beat,以满足日常业务开发的需求。 第18章 Kibana 篇之 入门与管理 本章会介绍 Kibana 的入门知识,让大家对 Kibana 有一个整体的了解,另外还会详细介绍Management 的功能,熟悉 Kibana 的配置。 第19章 Kibana 篇之 数据探索 Discovery 本章会介绍 Kibana 的数据探索功能,让大家了解 Discovery 的功能和使用技巧。 第20章 Kibana 篇之 可视化分析 本章会介绍Kibana 的可视化分析功能,首先会带领大家逐个操作 Kibana 提供的每一个图表,并会介绍时序分析工具 Timelion,然后会介绍如何使用 Dashboard功能来整合图表后讲故事或者做报表,也会讲解 Dashboard 使用中要注意的问题和使用技巧。 ... 第21章 实践篇 之搜索项目 本章会讲解一个搜索引擎相关的实践项目,带领大家通过编写少量的代码,快速基于 Elastic Stack 来构建一个具备常见搜索功能的系统,比如类似 Airbnb 的搜房系统、豆瓣电影等。 第22章 实践篇 之日志分析项目 本章会根据慕课网的日志为大家展示如何使用 Elastic Stack 来快速分析日志数据,带领大家一步步完成数据收集、处理、存储到可视化分析的步骤,最终打造属于自己的 Dashboard。 第23章 实践篇 之数据分析项目 本章会为大家展示如何使用 Elastic Stack 来分析身边的数据,比如空气质量分析、订单数据分析等等,让大家通过本章的学习可以快速将 Elastic Stack 应用到实际生活中。  

  实践方面我从搜索项目、日志分析和数据分析三个维度介绍了 Elastic Stack 的功能,可以看下最终的效果截图:  
MyAirbnb.png
 
[Project]_imooc_log_-Nginx_Overview.png
   
[Project]_北京的空气质量这些年有变好吗?.png
[Project]_2016年的北京雾霾.png
  那么剩下的就看你们了!                

ElasticTalk 第一期来袭!使用 ElasticStack 收集分析 Nginx 日志

活动rockybean 发表了文章 • 4 个评论 • 743 次浏览 • 2017-11-27 15:15 • 来自相关话题

今天正式启动 ElasticTalk 的活动,旨在通过线上直播的方式和大家交流 elastic 产品相关的知识。 第一期将于本周四(11月30日)晚8点在线直播,主题为使用 ElasticStack 收集和分析 Nginx 日志。感兴趣的同学可以加群讨论!

elastic_tips.001.jpeg

今天正式启动 ElasticTalk 的活动,旨在通过线上直播的方式和大家交流 elastic 产品相关的知识。 第一期将于本周四(11月30日)晚8点在线直播,主题为使用 ElasticStack 收集和分析 Nginx 日志。感兴趣的同学可以加群讨论!

elastic_tips.001.jpeg