大数据分析利器ElasticSearch入门(一)

1 为什么要学习ElasticSearch?
1.1 为什么要学习ElasticSearch

ElasticSearch(ES)作为一款优秀的分布式搜索分析引擎,越来越收到很多大型互联网公司的关注,像小米、滴滴出行、携程旅游、阿里云和腾讯云都在使用ElasticSearch。

最著名的公司就是github,它采用ES作为搜素引擎对代码进行搜索,虽然它是一款分布式搜索引擎,但是它强大的查询、分析和聚合能力使他与数据库的边界越来越模糊。因此很多大公司都喜欢用ES来存储日志或其他业务数据。最常见的结合就是通过kafka、redis来作数据源,logstash进行转化,ES对数据进行存储、kibana对数据进行展示,ES+logstash+kibana(ELK)一体化的日志分析、业务指标分析。

elasticsearch01

越来越多的公司使用ES,这门技术已不再是大数据工程师必须要掌握的了,ES还提供了Java、Python等API,因此ES将会成为Java和Python工程师必不可少的工具,灵活应用ES将会成为你在未来的一项非常具有竞争力的能力!

1.2 ElasticSearch的特性

ES是分布式的,并且在数据量超大的情况下其查询速度也非常快;

ES是一个近实时的搜索引擎(平台),代表着从添加数据到能被搜索到只有很少的延迟。(大约是1s)

对象中无论多么复杂的关系都可以用JSON格式表达出来,可读性非常高,ES就是以JSON格式存储存储数据的;

支持在线分析、实时分析,ES是基于存储、查询、聚合分析和可视化于一体的解决方案

1.3 ElasticSearch能做什么?
  • 从数据获取、存储计算到可视化,ES开发了一整套解决方案,Logstash、Beat负责抓取数据,ES负责存储计算,kibana对数据进行展示分析;

  • 收费的X-Pack可以实现安全告警、告警、监控和ML等丰富的功能;

  • ES在搜索、日志分析、指标分析和安全分析等领域应用广泛,从前端到后端,从云服务器到最流行的机器学习,ES都提供了一整套解决方案

2 ElasticSearch基本概念
2.1 文档

Elasticsearch是面向文档的,文档是所有可搜索数据的最小单元。可以把文档理解为关系型数据库中的一条记录。文档会被序列化成json格式,保存在Elasticsearch中。同样json对象由字段组成,每个字段都有自己的类型(字符串,数值,布尔,二进制,日期范围类型)。当我们创建文档时,如果不指定类型,Elasticsearch会帮我们自动匹配类型。每个文档都一个ID,你可以自己指定,也可以让Elasticsearch自动生成。json格式,支持数组/嵌套,在一个index/type里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type。

2.2 索引

索引是具有某种相似特性的文档集合。例如,您可以拥有客户数据的索引、产品目录的另一个索引以及订单数据的另一个索引。索引由一个名称(必须全部是小写)标识。在单个集群中,您可以定义任意多个索引。Index体现了逻辑空间的概念,每个索引都有自己的mapping定义,用于定义包含文档的字段名和字段类型。Index体现了物理空间的概念,索引中的数据分散在shard上。可以将其暂时理解为 MySql中的 database。

索引的mapping和setting

  • mapping:定义文档字段的类型
  • setting:定义不同数据的分布
2.3 类型

一个索引可以有多个类型。例如一个索引下可以有文章类型,也可以有用户类型,也可以有评论类型。在一个索引中不能再创建多个类型,在以后的版本中将删除类型的整个概念。
从6.0开始,type已经被逐渐废弃。在7.0之前,一个index可以设置多个types。7.0开始一个索引只能创建一个type(_doc)

2.4 节点

节点是一个Elasticsearch实例,本质上就是一个java进程,节点也有一个名称(默认是随机分配的),当然也可以通过配置文件配置,或者在启动的时候,-E node.name=node1指定。此名称对于管理目的很重要,因为您希望确定网络中的哪些服务器对应于ElasticSearch集群中的哪些节点。

在Elasticsearch中,节点的类型主要分为如下几种:

  • master eligible节点:每个节点启动后,默认就是master eligible节点,可以通过node.master: false 禁止master eligible可以参加选主流程,成为master节点
    当第一个节点启动后,它会将自己选为master节点
    每个节点都保存了集群的状态,只有master节点才能修改集群的状态
  • data节点:可以保存数据的节点。负责保存分片数据,在数据扩展上起到了至关重要的作用
  • Coordinating 节点:负责接收客户端请求,将请求发送到合适的节点,最终把结果汇集到一起每个节点默认都起到了Coordinating node的职责

开发环境中一个节点可以承担多个角色,生产环境中,建议设置单一的角色,可以提高性能等

2.5 分片

索引可能存储大量数据,这些数据可能会超出单个节点的硬件限制。例如,占用1TB磁盘空间的10亿个文档的单个索引可能不适合单个节点的磁盘,或者速度太慢,无法单独满足单个节点的搜索请求。

为了解决这个问题,ElasticSearch提供了将索引细分为多个片段(称为碎片)的能力。创建索引时,只需定义所需的碎片数量。每个分片(shard)本身就是一个完全功能性和独立的“索引”,可以托管在集群中的任何节点上。

为什么要分片?

  • 它允许您水平拆分/缩放内容量
  • 它允许您跨碎片(可能在多个节点上)分布和并行操作,从而提高性能/吞吐量

如何分配分片以及如何将其文档聚合回搜索请求的机制完全由ES管理,并且对作为用户的您是透明的。主分片数在索引创建时指定,后续不允许修改,除非Reindex

2.6 分片副本

在随时可能发生故障的网络/云环境中,非常有用,强烈建议在碎片/节点以某种方式脱机或因任何原因消失时使用故障转移机制。为此,ES允许您将索引分片的一个或多个副本复制成所谓的副本分片,简称为副本分片。

为什么要有副本?

  • 当分片/节点发生故障时提供高可用性。因此,需要注意的是,副本分片永远不会分配到复制它的原始/主分片所在的节点上。

  • 允许您扩展搜索量/吞吐量,因为可以在所有副本上并行执行搜索。

总而言之,每个索引可以分割成多个分片。索引也可以零次(意味着没有副本)或多次复制。复制后,每个索引将具有主分片(从中复制的原始分片)和副本分片(主分片的副本)。

可以在创建索引时为每个索引定义分片和副本的数量。创建索引后,您还可以随时动态更改副本的数量。您可以使用收缩和拆分API更改现有索引的分片数量,建议在创建索引时就考虑好分片和副本的数量。

默认情况下,ES中的每个索引都分配一个主分片和一个副本,这意味着如果集群中至少有两个节点,则索引将有一个主分片和另一个副本分片(一个完整副本),每个索引总共有两个分片。

2.7 倒排索引

elastic_doc

  • DocID:出现某单词的文档ID

  • TF(词频):单词在该文档中出现的次数

  • POS:单词在文档中的位置
    separate_words

3 Linux系统下elasticsearch-7.3.2的安装

3.1 下载和安装

1).下载elasticsearch-7.3.2 tar包 ,下载地址:

https://www.elastic.co/cn/downloads/elasticsearch

由于官网下载太慢,读者可关注本人的微信公众号后发送消息【ES】
获取我的百度网盘上elasticsearch-7.3.2 tar包的下载地址

  1. 登录linux服务器(也可以是VMWare虚拟机上的CentOS系统),cd切换到相应目录下如 /usr/local目录,新建文件传输
    将tar包上传到当前目录,执行如下命令解压

    tar -zxvf esticsearch-7.3.2-linux-x86_64.tar.gz

  2. 新建elasticsearch用户和elasticsearch用户组并授权

	groupadd elasticsearch
	useradd elasticsearch -g elasticsearch
	chown -R elasticsearch:elasticsearch  

在6.xx之前,可以通过root用户启动。但是发现黑客可以透过elasticsearch获取root用户密码,所以为了安全性,在6版本之后就不能通过root启动elasticsearch。所以这里专门创建了elasticsearch用户用于启动ES服务

3.2 修改配置

1) 调整JVM大小(内存大也可不要调整)

执行 vim ./elasticsearch-7.3.2/config/jvm.options

# 将原来的1g改小为512m,然后按住esc+:后输入wq!保存退出
-Xms512m
-Xmx512m

2) 修改network配置,支持通过ip访问

执行 vim ./elasticsearch-7.3.2/config/elasticsearch.yml

cluster.name=luban
node.name=node-1
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
vm最大虚拟内存,max_map_count[65530]太低,至少增加到[262144]
# 按住esc+:后输入wq!保存退出

执行 vim /etc/sysctl.conf

* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

* 所有用户
nofile - 打开文件的最大数目
noproc - 进程的最大数目
soft 指的是当前系统生效的设置值
hard 表明系统中所能设定的最大值

用户的最大线程数[2048]过低,增加到至少[4096]

3.3 安装JDK11

由于ES7.0以上版本依赖JDK11以上版本,ES7.3.2版本安装包中自带了JDK12,但是如果你下系统环境变量中指定了之前安装的JDK8路径,那么启动时会报错。为了解决ES7.3.2启动报错的问题,我们可以先在系统中安装JDK11并配置环境变量。

给笔者的微信公众号发送关键字【JDK11-Linux】即可获得Liunx系统安装对应的JDK11百度网盘下载地址

  1. 使用ftp将jdk-11.0.7_linux-x64_bin.tar.gz文件上传到CentOS7服务器上的/opt/jdk11_linux目录下(读者可自定义目标目录)

  2. 并在目标目录下执行如下命令解压缩tar包

tar -zxvf jdk-11.0.7_linux-x64_bin.tar.gz

解压后为jdk-11.0.7目录
es_dir
jdk_11.0.7为笔者之前通过ZIP包安装的JDK11

3)配置JDK环境变量

执行 vim /etc/profile命令,在文件末尾添加JDK的环境变量

export JAVA_HOME=/opt/jdk11_linux/jdk-11.0.7
export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
# 按住"esc"+":"后输入wq!保存退出

4) 执行 source /etc/profile 使配置生效,然后执行 java -version命令查看安装效果
jdk11
可以看到当前JDK系统版本为11.0.7版本,说明JDK环境变量配置生效了

3.4 防火墙开墙

Linux系统对安全的要求比较严格,通过端口访问服务几乎都要开墙

执行以下命令是使系统放开对9200端口的拦截

#开放9200端口
firewall-cmd --permanent --zone=public --add-port=tcp/9200
#重启防火墙
firewall-cmd --reload

因为笔者使用的是腾讯云服务器,所以还需要登录腾讯云控制台,在安全组中添加9200端口的入站规则,如下所示:

tencnent_es

3.5 启动ES服务

1) 执行 su elasticsearch命令从root用户切换到elasticsearch用户

2) 执行 cd /usr/local/elasticsearch-7.3.2/bin切换到es的bin目录下,
然后执行./elasticsearch命令(或者./elasticsearch -d后台启动)

  1. ES启动成功后可在浏览器中输入 http://${host}:9200然后回车,看到如下
    JSON格式的响应信息则说明ES启动成功了!
{
  "name" : "node-1",
  "cluster_name" : "luban",
  "cluster_uuid" : "X5ohaHE0QVae03k7lGJHlg",
  "version" : {
    "number" : "7.3.2",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "1c1faf1",
    "build_date" : "2019-09-06T14:40:30.409026Z",
    "build_snapshot" : false,
    "lucene_version" : "8.1.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

由于笔者的腾讯云服务器是1核的,在安装好kibana后启动kibana服务因为无法在单核服务器上开启子进程连接ES服务而导致启动一直报错,所以就不演示Linux系统上安装和启动kibana了。下面在windows系统中安装ES和Kibana部分中演示安装和启动kibana

4 Windows 系统下安装ES和Kibana

windows系统下安装和启动ES和Kibana非常简单,下载器对应的压缩包解压后进入bin目录执行启动命令即可

4.1 elasticsearch-7.3.2windows安装包的下载、安装

1) 下载windows系统下对应的elasticsearch-7.3.2版本的安装包
关注笔者的微信公众号后发送关键字【ElasticSearch-Windows】可获得笔者上传到百度网盘的elasticsearch-7.3.2-windows-x86_64安装包下载连接

2)加压安装包并启动
解压安装包,然后进入解压后的elasticsearch-7.3.2\bin目录下双击
elasticsearch.bat windows批处理文件启动ES服务

4)验证
控制台显示启动ES服务成功后在浏览器中输入 http://localhost:9200
然后回车看到如下JSON格式信息代表ES启动成功

{
  "name" : "HESHENGFU1211",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "yPgXhV3CS9eh1zGmBti0HQ",
  "version" : {
    "number" : "7.3.2",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "1c1faf1",
    "build_date" : "2019-09-06T14:40:30.409026Z",
    "build_snapshot" : false,
    "lucene_version" : "8.1.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
4.2 kibana-7.3.2-windows-x86_64下载与安装
  1. 下载 windows对应的kibana-7.3.2版本安装包
    读者我的公众号后发送关键词消息【kibana】可获取笔者上传到百度网盘的kibana-7.3.2-windows安装包下载地址

  2. 解压kibana-7.3.2-windows-x86_64.zip包后,进入
    kibana-7.3.2-windows-x86_64\bin目录下,双击kibana.bat文件启动kibana服务

3) 控制台显示如下信息时表示kibana服务启动成功

kibana
4)在浏览器中输入http://localhost:5601即可看到kibana的可视化界面,如下图所示

kibana_console
点击界面上的Console菜单可进入控制台,使用Rest API对ES数据进行CRUD操作

es_setting
点击右边的按钮执行更改操作后,再执行查询操作 GET /heshengfu

可看到右边出现json格式的查询结果

GET /heshengfu 
{
  "heshengfu" : {
    "aliases" : { },
    "mappings" : { },
    "settings" : {
      "index" : {
        "number_of_shards" : "2",
        "provided_name" : "heshengfu",
        "creation_date" : "1597542252650",
        "number_of_replicas" : "0",
        "uuid" : "shjcXhALTnuDed9I9sfFJA",
        "version" : {
          "created" : "7030299"
        },
        "write" : {
          "wait_for_active_shards" : "1"
        }
      }
    }
  }
}
5 小结

1)本文我们学习了大数据分析搜索利器ElasticSearch的一些基本概念,以及Linux和Windows系统下安装7.3.2版本的ES服务,同时在windows系统下安装了与之对应kibana服务用于可视化操作ES。

2)对于7.0以上版本的ES需要依赖11以上的版本的JDK,7.3.2版本的ES安装包内置了JDK12类库;在Linux系统中,如果配置了JDK的环境变量且JDK版本低于11的话,启动ES服务时就会报错,而windows环境下则没有这一问题;相比较Linux下的安装,windows下的安装和启动ES服务要简单的多。

3)后面的文章笔者将继续记录学习使用kibana可视化界面对ES进行CRUD操作,并结合开源电商SpringBoot项目学习如何使用ES实现海量数据下的搜索引擎功能,敬请期待!

6 参考资料

[1] 鲁班学院太白老师课堂笔记ElasticSearch

[2] gitchat付费专栏《ElasticSearch大数据分析全指南》

欢迎新读者扫描下方二维码关注笔者的微信公众号,有关于本文中你需要的资源百度网盘链接

weixin_erweima

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heshengfu1211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值