Elasticsearch是当前最流行的大数据集分析平台之一,对于日志聚合、商业智能以及机器学习等各类用例而言,Elasticsearch都是一个很有用的工具。Elasticsearch基于 REST的简单的API,使得创建索引、添加数据和进行复杂的查询变得非常简单,这也是它大受欢迎的一大原因。但是,在你开始构建数据集和运行查询之前,您需要设置一个Elasticsearch集群,这可能会有点难。现在我们来看看Rancher Catalog是如何让配置一个可扩展、高可用的Elasticsearch集群变容易的。
假设你已经有一个运行中的Rancher集群,那么让Elasticsearch在你的集群上运行起来非常简单 。只要通过顶部菜单打开 Catalog,然后搜索Elasticsearch。Elasticsearch条目有两个版本,我们假设你使用的是2.x,这是最新的稳定版本。要从集群启动stack,请选择查看详细信息(View Detail),然后在后续屏幕中选择stack名称( Stack Name),集群名称(Cluster Name),然后选择启动。
这个stack会启动以下服务:kopf、client(s)、datanode(s) 和master(s)。kopf容器提供了web界面,用来管理你的elasticsearch 集群。Datanodes储存实际的索引。主节点运行集群管理任务,客户端节点发起和协调你的搜索和其他操作。开始时,你的Elasticsearch集群各种类型的容器都只有一个(master、client、datanodes有两个辅助容器)。但是,您可以根据查询负载和索引的大小扩展每个组件。请注意,你需要不同的物理主机才能使每个datanode容器正常工作。因此,您可能需要注册更多Rancher计算节点。
当所有容器都处于active状态时,您就可以到运行着kopf容器的主机中,启动kopf界面。点击 nodes选项卡,就会看到我之前提过的各种组件。如你所见,为了为我的索引提供冗余存储,我启动了第二个数据节点。我们将很快看到,当创建索引时,我们可以控制数据片的数量和每个片的备份。这样不仅可以提供冗余,还可以提升查询处理的速度。
在kopf的顶部的菜单中,选择更多(more),然后选择创建索引(create index)。在之后的页面中,你会被要求输入索引名称(Index Name),分片数(Number of Shards)和副本数(Number of replicas)。默认值为5个分片和1个副本。为索引设置的分片数和副本数高度依赖于数据集和查询模型。shard数有助于将数据扩展到多个节点,并且并行处理查询。如果你只有一个datanote,多分片可能看不到很多好处。此外,如果你期望数据快速增长,你可能需要更多分片,以便于你稍后添加节点并将数据移动到这些分片上。另外要注意的一点是,Elasticsearch建议最大的堆大小为32GB,所以最大的分片大小应该约为该大小,以便它可以尽可能地保存在内存中。
另一方面,副本与数据大小不太相关,它与冗余和性能的关系更紧密。所有对索引的查询都需要查看每个分片的一个副本,如果一个分片有多个副本,当一个节点不可用时,数据也依然可用。此外,使用多个副本,对指定分片的查询负载会分散在多个节点间。多个副本只有在集群中具有多个数据容器或节点时才有意义,而且在扩展越来越大的集群时会变得更加重要。
举例来说,我们来定义一个叫movies的索引,给它设置2个分片和2个副本。现在从顶部菜单中选择Rest选项卡,以便我们向索引中添加一些文档并测试一些查询。Elasticsearch是无模式的,所以我们可以向索引中添加任意形式的数据,只要它是合法的JSON格式就行。将path字段更新为 /movies/movie/1。path的格式为 /INDEX_NAME/TYPE/ID,movies是我们刚刚创建的索引,movie是我们给即将提交的文档类型的名称,id是这个索引中文档的唯一ID。ID是可选的,如果你在path中省略了,那么你的文档会被创建一个随机的ID。添加了path之后,选择POST方法,在底部的文本字段中输入你的JSON文档,点击发送。这样将把这个文档添加到索引中,并且向你发送一个确认消息。
在添加了几个movie到索引中之后,我们就可以用同样的界面从索引中搜索和聚合数据了。将path字段更新为 /movies/movie/_search。path的格式为 /INDEX_NAME/TYPE/_search,INDEX_NAME,TYPE都是可选的。如果省略type,则会搜索所有类型,如果省略索引名,则会搜索所有索引。
Elasticsearch支持多种不同类型的查询,我们在这里只介绍几种常见的类型。第一种类型是自由文本查询,查询字符串参数允许使用Elasticsearch Query DS进行相当复杂的查询。当然我可只输入简单的字符串进行匹配,这将匹配文档任何字段中指定的词。
1
2
3
4
5
6
7
|
{
"query"
: {
"query_string"
: {
"query"
:
"Apocalypse"
}
}
}
|
例如,上面的查询会返回下面的结果。结果中包含处理查询花费的时间、搜索的分片数、结果总数以及每个结果的详细信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
{
"took"
:
139
,
"timed_out"
:
false
,
"_shards"
: {
"total"
:
2
,
"successful"
:
2
,
"failed"
:
0
},
"hits"
: {
"total"
:
2
,
"max_score"
:
0.5291085
,
"hits"
: [{
"_index"
:
"movies"
,
"_type"
:
"movie"
,
"_id"
:
"AVSvEC1fG_1bjVtG66mm"
,
"_score"
:
0.5291085
,
"_source"
: {
"title"
:
"Apocalypse Now"
,
"director"
:
"Francis Ford Coppola"
,
"year"
:
1979
,
"genres"
: [
"Drama"
,
"War"
]
}
}
....
|
除了查询文本之外,你还可以指定一个字段或一些字段的估计值,从而将查询限制为搜索文档的一个子集。比如,下面的查询会返回与之前一样的结果,但是必须查看文档的一个子集,且更大的数据集会有更好的性能。这里还有很多其他操作。
1
2
3
4
5
6
7
8
|
{
"query"
: {
"query_string"
: {
"query"
:
"Apocalypse"
"fields"
: [
"title"
]
}
}
}
|
我们可以把查询字符串包裹在filtered对象中,这样会对查询的结果进行过滤。这允许我们对初始数据集保持任意格式的查询,但随后过滤出我们查找的特定数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
{
"query"
: {
"filtered"
: {
"query_string"
: {
"query"
:
"Apocalypse"
"fields"
: [
"title"
]
}
"filter"
: {
"term"
: {
"year"
:
1979
}
}
}
}
}
|
最后,聚合可能是你会运行的另外一种形式的查询,它对于计算有关数据的统计信息很有用。下面展示了这些类型的聚合的两个例子。第一个将返回每个导演指挥的电影的数量,第二个将返回我们的数据集中所有电影的平均评分。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
{
"aggs"
: {
"group_by_director"
: {
"terms"
: {
"field"
:
"director"
}
}
}
}
{
"aggs"
: {
"avg_rating"
: {
"avg"
: {
"field"
:
"rating"
} }
}
}
|
Elasticsearch是在大型非结构化数据集上运行分析的最佳方法之一,在从日志聚合、机器学习到商业智能等许多领域中皆被广泛使用。本文中,我们看到了使用Catalog在Rancher上设置一个功能齐全的Elasticsearch集群是多么简单。此外,我们还快速了解了Elasticsearch使用REST API的强大功能。只要你有Elasticsearch可用并且运行了起来,你就可以使用它作为许多不同的用例与许多可用的可视化和聚合框架的主机,比如实时可视化的Kibana或业务分析的Pentaho框架。
本文转自 RancherLabs 51CTO博客,原文链接:http://blog.51cto.com/12462495/1924924