Fork me on GitHub

CentOS7安装Maven

1.下载Maven安装包

Maven下载地址

2.解压
1
tar -zxvf apache-maven-3.6.3-bin.tar.gz -C /opt/module/

解压

3.改名
1
mv apache-maven-3.6.3/ maven

4.配置环境变量
1
vi /etc/profile

修改内容

1
2
export M2_HOME=/opt/module/maven
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin

使环境变量生效

1
source /etc/profile
5.验证
1
mvn -v

验证

ffmpeg音视频加速

1.变速视频原理

修改视频的pts,dts

2.修改视频速率

视频变为2倍速

1
ffmpeg -i input.mp4 -an -filter:v "setpts=0.5*PTS" output.mp4

注意:

  • 调整速度倍率范围[0.25, 4]
  • 如果只调整视频的话最好把音频禁掉
  • 对视频进行加速时,如果不想丢帧,可以用-r 参数指定输出视频FPS
1
ffmpeg -i input.mp4 -an -r 60 -filter:v "setpts=2.0*PTS" output.mp4

3.变速音频原理

简单的方法是调整音频采样率,但是这种方法会改变音色,一般采用通过对原音进行冲采样,差值等方法

4.修改音频速率

1
ffmpeg -i input.mp4 -filter:a "atempo=2.0" -vn output.mp4

注意:

  • 倍率调整范围为[0.5, 2.0]
  • 如果需要调整4倍可采用以下方法:
1
ffmpeg -i input.mp4 -filter:a "atempo=2.0,atempo=2.0" -vn output.mp4

5.音频视频同时变速

1
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4

ElasticSearch实战-使用java连接elasticsearch集群并操作

1.需求:

使用java连接elasticsearch集群,并进行相关操作

2.代码:

(1)pom.xml
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
28
29
30
31
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.1</version>
</dependency>

<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.1</version>
</dependency>

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.0</version>
</dependency>

</dependencies>
(2)ES_test.java
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.Requests;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Before;
import org.junit.Test;

public class ES_test {

private TransportClient client;

@SuppressWarnings("unchecked")
@Before
public void getClient() throws UnknownHostException {

// 1 设置连接的集群名称
Settings settings = Settings.builder().put("cluster.name", "my-application").build();

// 2 连接集群
client = new PreBuiltTransportClient(settings);
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.1.121"), 9300));

// 3 打印集群名称
//System.out.println(client.toString());
}

@Test
public void createIndex_blog() {
// 创建索引

client.admin().indices().prepareCreate("blog").get();

client.close();
}

@Test
public void deleteIndex() {
// 删除索引
client.admin().indices().prepareDelete("blog").get();

client.close();
}

@Test
public void insertByJson() {
// 使用json常见document

// 1、文档数据准备
String json = "{" + "\"id\":\"1\"," + "\"title\":\"基于Lucene的搜索服务器\","
+ "\"content\":\"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口\"" + "}";

// 2 在es中创建文档
IndexResponse indexResponse = client.prepareIndex("blog", "article", "1").setSource(json).execute().actionGet();

// 3 打印返回结果
System.out.println("index: " + indexResponse.getIndex());
System.out.println("type: " + indexResponse.getType());
System.out.println("id: " + indexResponse.getId());
System.out.println("result: " + indexResponse.getResult());

client.close();
}

@Test
public void insertByMap() {
// 使用Map创建document
// 1、文档数据准备
Map<String, Object> json = new HashMap<String, Object>();
json.put("id", "2");
json.put("title", "基于Lucene的搜索服务器");
json.put("content", "它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口");

// 2 创建文档
IndexResponse indexResponse = client.prepareIndex("blog", "article", "2").setSource(json).execute().actionGet();

// 3 打印返回结果
System.out.println("index: " + indexResponse.getIndex());
System.out.println("type: " + indexResponse.getType());
System.out.println("id: " + indexResponse.getId());
System.out.println("result: " + indexResponse.getResult());

client.close();
}

@Test
public void insertByXContent() throws Throwable {
// 使用XContentBuilder创建document

// 1 通过es自带的帮助类,构建json数据
XContentBuilder builder = XContentFactory.jsonBuilder().startObject().field("id", 5)
.field("title", "基于Lucene的搜索服务器").field("content", "sdfs它sdfsdfsdf提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。")
.endObject();

// 2 创建文档
IndexResponse indexResponse = client.prepareIndex("blog", "article", "3").setSource(builder).get();

// 3 打印返回结果
System.out.println("index: " + indexResponse.getIndex());
System.out.println("type: " + indexResponse.getType());
System.out.println("id: " + indexResponse.getId());
System.out.println("result: " + indexResponse.getResult());

client.close();

}

@Test
public void getData() {
// 查询文档
GetResponse response = client.prepareGet("blog", "article", "1").get();

System.out.println(response.getSourceAsString());

client.close();

}

@Test
public void getMultiData() {
// 查询多个文档

MultiGetResponse response = client.prepareMultiGet()
.add("blog", "article", "1")
.add("blog", "article", "2", "3")
.add("blog", "article", "2").get();

//遍历返回结果
for (MultiGetItemResponse multiGetItemResponse : response) {
GetResponse getResponse = multiGetItemResponse.getResponse();

//获取查询结果
if (getResponse.isExists()) {
String sourceAsString = getResponse.getSourceAsString();
System.out.println(sourceAsString);

}
}

client.close();
}
@Test
public void updateData() throws Throwable {

// 1 创建更新数据的请求对象
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index("blog");
updateRequest.type("article");
updateRequest.id("3");

updateRequest.doc(XContentFactory.jsonBuilder().startObject()
// 对没有的字段添加, 对已有的字段替换
.field("title", "基于Lucene的搜索服务器")
.field("content", "它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。大数据前景无限")
.field("createDate", "2017-8-22")
.endObject());

// 2 获取更新后的值
UpdateResponse indexResponse = client.update(updateRequest).get();

// 3 打印返回的结果
System.out.println("index:" + indexResponse.getIndex());
System.out.println("type:" + indexResponse.getType());
System.out.println("id:" + indexResponse.getId());
System.out.println("version:" + indexResponse.getVersion());
System.out.println("create:" + indexResponse.getResult());// NOOP = NO
// OPeration
// ;
// result=updated
// 表示更新成功

// 4 关闭连接
client.close();
}

@Test
public void testUpsert() throws Exception {

// 设置查询条件, 查找不到则添加
IndexRequest indexRequest = new IndexRequest("blog", "article", "5")
.source(XContentFactory.jsonBuilder().startObject().field("title", "搜索服务器")
.field("content",
"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。")
.endObject());

// 设置更新, 查找到更新下面的设置
UpdateRequest upsert = new UpdateRequest("blog", "article", "5")
.doc(XContentFactory.jsonBuilder().startObject().field("user", "李四").endObject()).upsert(indexRequest);

client.update(upsert).get();
client.close();
}

@Test
public void deleteData() {

// 1 删除文档数据
DeleteResponse indexResponse = client.prepareDelete("blog", "article", "5").get();

// 2 打印返回的结果
System.out.println("index:" + indexResponse.getIndex());
System.out.println("type:" + indexResponse.getType());
System.out.println("id:" + indexResponse.getId());
System.out.println("version:" + indexResponse.getVersion());
System.out.println("found:" + indexResponse.getResult());

// 3 关闭连接
client.close();
}

@Test
public void matchAllQuery() {

// 查询所有
// 1 执行查询
SearchResponse searchResponse = client.prepareSearch("blog").setTypes("article")
.setQuery(QueryBuilders.matchAllQuery()).get();

// 2 打印查询结果
SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
System.out.println("查询结果有:" + hits.getTotalHits() + "条");

for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());// 打印出每条结果
}

// 3 关闭连接
client.close();
}

@Test
public void query() {

// 1 条件查询
SearchResponse searchResponse = client.prepareSearch("blog").setTypes("article")
.setQuery(QueryBuilders.queryStringQuery("大数据")).get();

// 2 打印查询结果
SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
System.out.println("查询结果有:" + hits.getTotalHits() + "条");

for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());// 打印出每条结果
}

// 3 关闭连接
client.close();
}

@Test
public void wildcardQuery() {

// 1 通配符查询
SearchResponse searchResponse = client.prepareSearch("blog").setTypes("article")
.setQuery(QueryBuilders.wildcardQuery("content", "*全*")).get();

// 2 打印查询结果
SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
System.out.println("查询结果有:" + hits.getTotalHits() + "条");

for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());// 打印出每条结果
}

// 3 关闭连接
client.close();
}

@Test
public void termQuery() {

// 类似于 mysql 中 =

// 1 第一field查询
SearchResponse searchResponse = client.prepareSearch("blog").setTypes("article")
.setQuery(QueryBuilders.termQuery("content", "全文")).get();

// 2 打印查询结果
SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
System.out.println("查询结果有:" + hits.getTotalHits() + "条");

for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());// 打印出每条结果
}

// 3 关闭连接
client.close();
}

@Test
public void fuzzy() {

// 1 模糊查询
SearchResponse searchResponse = client.prepareSearch("blog").setTypes("article")
.setQuery(QueryBuilders.fuzzyQuery("title", "lucene")).get();

// 2 打印查询结果
SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
System.out.println("查询结果有:" + hits.getTotalHits() + "条");

Iterator<SearchHit> iterator = hits.iterator();

while (iterator.hasNext()) {
SearchHit searchHit = iterator.next(); // 每个查询对象

System.out.println(searchHit.getSourceAsString()); // 获取字符串格式打印
}

// 3 关闭连接
client.close();
}

@Test
public void createMapping() throws Exception {

// 1设置mapping
XContentBuilder builder = XContentFactory.jsonBuilder().startObject().startObject("article")
.startObject("properties")
.startObject("id1")
.field("type", "text")
.field("store", "true").endObject()
.startObject("title2")
.field("type", "text").field("store", "false").endObject()
.startObject("content")
.field("type", "text").field("store", "true").endObject()
.endObject().endObject().endObject();

// 2 添加mapping
PutMappingRequest mapping = Requests.putMappingRequest("blog4").type("article").source(builder);

client.admin().indices().putMapping(mapping).get();

// 3 关闭资源
client.close();
}

// 创建使用ik分词器的mapping
@Test
public void createMapping_ik() throws Exception {

// 1设置mapping
XContentBuilder builder = XContentFactory.jsonBuilder().startObject().startObject("article")
.startObject("properties")
.startObject("id1")
.field("type", "text").field("store", "true")
.field("analyzer", "ik_smart")
.endObject()
.startObject("title2").field("type", "text")
.field("store", "false").field("analyzer", "ik_smart").
endObject().startObject("content")
.field("type", "text").field("store", "true")
.field("analyzer", "ik_smart").endObject().endObject()
.endObject().endObject();

// 2 添加mapping
PutMappingRequest mapping = Requests.putMappingRequest("blog4").type("article").source(builder);
client.admin().indices().putMapping(mapping).get();

// 3 关闭资源
client.close();
}

// 创建文档,以map形式
@Test
public void createDocumentByMap_forik() {

HashMap<String, String> map = new HashMap<String, String>();
map.put("id1", "2");
map.put("title2", "Lucene");
map.put("content", "它提供了一个分布式的web接口");

IndexResponse response = client.prepareIndex("blog4", "article", "3").setSource(map).execute().actionGet();

// 打印返回的结果
System.out.println("结果:" + response.getResult());
System.out.println("id:" + response.getId());
System.out.println("index:" + response.getIndex());
System.out.println("type:" + response.getType());
System.out.println("版本:" + response.getVersion());

// 关闭资源
client.close();
}

// 词条查询
@Test
public void queryTerm_forik() {

// 分析结果:因为是默认被standard analyzer分词器分词,大写字母全部转为了小写字母,并存入了倒排索引以供搜索。term是确切查询, 必须要匹配到大写的Name。
SearchResponse response = client.prepareSearch("blog4")
.setTypes("article")
.setQuery(QueryBuilders.termQuery("content", "web"))
.get();

// 获取查询命中结果
SearchHits hits = response.getHits();

System.out.println("结果条数:" + hits.getTotalHits());

for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}

}


3.结果:

Elasticsearch head插件安装

1.下载插件:

2.下载nodejs:

3.安装nodejs:

(1)解压
(2)配置环境变量
1
2
3
export NODE_HOME=/usr/local/node-v6.9.2-linux-x64

export PATH=$PATH:$NODE_HOME/bin
(3)查看node和npm版本:
1
2
3
node -v

npm -v

4.解压head插件到/opt/module目录下:

1
unzip elasticsearch-head-master.zip

5.查看当前head插件目录下有无node_modules/grunt目录:

  • 如果没有,执行命令创建:
1
npm install grunt --save --registry=https://registry.npm.taobao.org

6.安装head插件:

1
npm install -g cnpm --registry=https://registry.npm.taobao.org

7.安装grunt

1
npm install -g grunt-cli --registry=https://registry.npm.taobao.org

8.编辑Gruntfile.js

1
vim Gruntfile.js

文件93行添加:

1
hostname:'0.0.0.0'

9.检查head根目录下是否存在base文件夹

  • 没有:将 _site下的base文件夹及其内容复制到head根目录下
1
2
3
mkdir base

cp base/* ../base/

10.启动grunt server:

1
grunt server -d

11.如果提示grunt的模块没有安装:

1
2
3
4
5
6
7
8
9
10
11
Local Npm module “grunt-contrib-clean” not found. Is it installed? 

Local Npm module “grunt-contrib-concat” not found. Is it installed?

Local Npm module “grunt-contrib-watch” not found. Is it installed?

Local Npm module “grunt-contrib-connect” not found. Is it installed?

Local Npm module “grunt-contrib-copy” not found. Is it installed?

Local Npm module “grunt-contrib-jasmine” not found. Is it installed?

执行命令:

1
2
3
4
5
6
7
8
9
10
11
npm install grunt-contrib-clean -registry=https://registry.npm.taobao.org

npm install grunt-contrib-concat -registry=https://registry.npm.taobao.org

npm install grunt-contrib-watch -registry=https://registry.npm.taobao.org

npm install grunt-contrib-connect -registry=https://registry.npm.taobao.org

npm install grunt-contrib-copy -registry=https://registry.npm.taobao.org

npm install grunt-contrib-jasmine -registry=https://registry.npm.taobao.org
  • 最后一个模块可能安装不成功,但是不影响使用。

12.浏览器访问head插件:http://192.168.109.133:9100

Elasticsearch集群安装部署

1.前提:安装好jdk

2.下载安装包:

3.上传到linux

4.解压

5.新建data,logs文件夹

1
2
3
4
5
cd /opt/module/elasticsearch-5.6.2

mkdir data

mkdir logs

新建目录

6.修改配置文件(root用户)三台机器都需要改

(1).修改elasticsearch.yml文件
1
2
vi /opt/module/elasticsearch-5.6.2/conf/elasticsearch.yml

修改内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# ---------------------------------- Cluster -------------------------------------
cluster.name: my-application
# ------------------------------------ Node --------------------------------------
node.name: JBS1
# ----------------------------------- Paths ---------------------------------------
path.data: /opt/module/elasticsearch-5.6.2/data
path.logs: /opt/module/elasticsearch-5.6.2/logs
# ----------------------------------- Memory -----------------------------------
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
# ---------------------------------- Network ------------------------------------
network.host: 192.168.127.121
# --------------------------------- Discovery ------------------------------------
discovery.zen.ping.unicast.hosts: ["bigdata121"]

http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true

说明:

  • cluster.name :如果要配置集群需要两个节点上的 elasticsearch 配置的 cluster.name 相同,都启动可以自动组成集群,这里如果不改 cluster.name 则默认是 cluster.name=my-application。
  • nodename 随意取但是集群内的各节点不能相同
  • node.master:设置为主节点
  • node.data:

elasticsearch.yml

elasticsearch.yml

(2).修改limits.conf文件
1
2
3
4
5
6
7
8
vi /etc/security/limits.conf

//在文件末尾添加如下内容

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

limits.conf

(3).修改limits.d文件
1
2
3
4
5
6
vi /etc/security/limits.d/20-nproc.conf

//修改内容如下
//* soft nproc 1024
//改为
* soft nproc 4096

20-nproc.conf

(4).修改配置sysctl.conf
1
2
3
4
vi /etc/sysctl.conf

//添加内容
vm.max_map_count=655360

sysctl.conf

5.新建linux用户:es不能以root用户启动

1
2
3
4
5
6
7
8
9
10
11
useradd kai

passwd kai
输入密码


cd /opt/module/elasticsearch-5.6.2 //进入的elasticsearch目录

chown -R kai:users * //修改权限

su kai //切换到kai用户,启动es

新建用户

6.将elasticsearch发送到bigdata122,bigdata123

1
2
3
4
cd /opt/module
scp -r elasticsearch-5.6.2/ bigdata122:/opt/module

scp -r elasticsearch-5.6.2/ bigdata123:/opt/module

7.再在bigdata122,bigdata123中修改elasticsearch.yml

1
2
3
4
5
6
7
# ------------------------------------ Node --------------------------------------
node.name: JBS2
# ---------------------------------- Network ------------------------------------
network.host: 192.168.127.122 //bigdata123改为:192.168.127.123

node.master: false
node.data: true

其实和单节点安装差不多,只是elasticsearch.yml文件有细微不同

image.png

image.png

8.再在bigdata122,bigdata123中修改linux配置文件,和bigdata121一样,以及新建用户

9.重启bigdata121,bigdata122,bigdata123,因为修改linux配置文件后需要重启后才生效

10.启动ES集群:

(1)切换用户:
1
su kai
(2)先启动bigdata121,再启动bigdata122,bigdata123

bigdata121

1
2
3
cd /opt/module/elasticsearch-6.1.1/

bin/elasticsearch

bigdata122

1
2
3
cd /opt/module/elasticsearch-6.1.1/

bin/elasticsearch

bigdata123

1
2
3
cd /opt/module/elasticsearch-6.1.1/

bin/elasticsearch

11.集群安装参照:

【链接】手把手教你搭建一个Elasticsearch集群
https://cloud.tencent.com/developer/article/1189282

Elasticsearch单节点安装部署

一.安装

1.先前条件:

  • 安装java8
  • 下载es安装包

2.上传到linux:/opt/software

3.解压

1
2
3
cd /opt/software

tar -zxvf elasticsearch-5.6.2.tar.gz -C /opt/module

4.新建data,logs文件夹

1
2
3
4
5
cd /opt/module/elasticsearch-5.6.2

mkdir data

mkdir logs

image.png

5.修改配置文件(root用户)

(1).修改elasticsearch.yml文件
1
vi /opt/module/elasticsearch-5.6.2/conf/elasticsearch.yml

修改内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ---------------------------------- Cluster -------------------------------------
cluster.name: my-application
# ------------------------------------ Node --------------------------------------
node.name: JBS
# ----------------------------------- Paths ---------------------------------------
path.data: /opt/module/elasticsearch-5.6.1/data
path.logs: /opt/module/elasticsearch-5.6.1/logs
# ----------------------------------- Memory -----------------------------------
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
# ---------------------------------- Network ------------------------------------
network.host: 192.168.127.121
# --------------------------------- Discovery ------------------------------------
discovery.zen.ping.unicast.hosts: ["bigdata121"]

elasticsearch.yml

说明:

  • cluster.name :如果要配置集群需要两个节点上的 elasticsearch 配置的 cluster.name 相同,都启动可以自动组成集群,这里如果不改 cluster.name 则默认是 cluster.name=my-application。
  • nodename 随意取但是集群内的各节点不能相同
(2).修改limits.conf文件
1
2
3
4
5
6
7
8
vi /etc/security/limits.conf

//在文件末尾添加如下内容

* soft nofile 655360
* hard nofile 131072
* soft nproc 4096
* hard nproc 4096

image.png

(3).修改limits.d文件
1
2
3
4
5
6
vi /etc/security/limits.d/20-nproc.conf

//修改内容如下
* soft nproc 1024
//改为
* soft nproc 4096

image.png

(4).修改配置sysctl.conf
1
2
3
4
vi /etc/sysctl.conf

//添加内容
vm.max_map_count=655360

sysctl.conf

5.新建linux用户:es不能以root用户启动

1
2
3
4
5
6
7
8
9
10
useradd kai

passwd kai
输入密码

cd /opt/module/elasticsearch-5.6.2 //进入的elasticsearch目录

chown -R kai:users * //修改权限

su kai //切换到kai用户,启动es

新建用户

6.重启linux,因为修改linux配置文件后需要重启后才生效

二.启动:

1
2
3
4
su kai      //切换到kai用户
cd /opt/module/elasticsearch-5.6.2

bin/elasticsearch //启动

image.png

注意:can not run elasticsearch as root

三.验证:

1
2
3
curl 'http://192.168.127.121:9200'

curl -XGET '192.168.127.121:9200/_cat/health?v&pretty'

验证

当看到status是green时,证明启动成功

  • Green - 一切运行正常(集群功能齐全)
  • Yellow - 所有数据是可以获取的,但是一些复制品还没有被分配(集群功能齐全)
  • Red - 一些数据因为一些原因获取不到(集群部分功能不可用)

四.当启动es,报错:

1
2
3
4
5
6
7
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

[2]: max number of threads [1024] for user [hduser] is too low, increase to at least [4096]

[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

[4]: system call filters failed to install; check the logs and fix your configuration or disable system

1.配置linux系统环境:

2.切换到 root 用户,编辑 limits.conf 添加类似如下内容

1
vi /etc/security/limits.conf

新增内容如下:

1
2
3
4
* soft nofile 65536
* hard nofile 131072
* soft nproc 4096
* hard nproc 4096

3.进入 limits.d 目录下修改配置文件。

1
vi /etc/security/limits.d/90-nproc.conf

把 * soft nproc 1024 改成4096

5.修改配置 sysctl.conf

1
vi /etc/sysctl.conf 

添加内容如下:

1
vm.max_map_count=655360

执行命令:

1
sysctl -p

6.重新登录kai用户,重新启动es,如果还有报错,则需重启虚拟机

  • 查看集群状态命令:
1
curl -XGET 'http://192.168.127.121:9200/_cat/health?v&pretty'
  • 查看所有数据命令:
1
2
3
4
5
6
7
curl -XGET 'ip地址:9200/index名称/_search?pretty' -H 'Content-Type: application/json' -d'

{

"query": { "match_all": {} }

}'

Elasticsearch核心概念

1.近实时

近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级。

2 Cluster(集群)

集群包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常。

3 Node(节点)

集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群。

4 Index(索引-数据库)

索引包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。

5 Type(类型-表)

每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。

商品index,里面存放了所有的商品数据,商品document

但是商品分很多种类,每个种类的document的field可能不太一样,比如说电器商品,可能还包含一些诸如售后时间范围这样的特殊field;生鲜商品,还包含一些诸如生鲜保质期之类的特殊field

1
2
3
4
5
6
7
type,日化商品type,电器商品type,生鲜商品type

日化商品type:product_id,product_name,product_desc,category_id,category_name

电器商品type:product_id,product_name,product_desc,category_id,category_name,service_period

生鲜商品type:product_id,product_name,product_desc,category_id,category_name,eat_period

每一个type里面,都会包含一堆document

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
28
29
30
31
{

"product_id": "1",

"product_name": "长虹电视机",

"product_desc": "4k高清",

"category_id": "3",

"category_name": "电器",

"service_period": "1年"

}

{

"product_id": "2",

"product_name": "基围虾",

"product_desc": "纯天然,冰岛产",

"category_id": "4",

"category_name": "生鲜",

"eat_period": "7天"

}

6 Document(文档-行)

文档是es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。

7 Field(字段-列)

Field是Elasticsearch的最小单位。一个document里面有多个field,每个field就是一个数据字段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
product document

{

"product_id": "1",

"product_name": "高露洁牙膏",

"product_desc": "高效美白",

"category_id": "2",

"category_name": "日化用品"

}

8 mapping(映射-约束)

数据如何存放到索引对象上,需要有一个映射配置,包括:数据类型、是否存储、是否分词等。

这样就创建了一个名为blog的Index。Type不用单独创建,在创建Mapping 时指定就可以。Mapping用来定义Document中每个字段的类型,即所使用的 analyzer、是否索引等属性,非常关键等。创建Mapping 的代码示例如下:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
client.indices.putMapping({

index : 'blog',

type : 'article',

body : {

article: {

properties: {

id: {

type: 'string',

analyzer: 'ik',

store: 'yes',

},

title: {

type: 'string',

analyzer: 'ik',

store: 'no',

},

content: {

type: 'string',

analyzer: 'ik',

store: 'yes',

}

}

}

}

});

9.elasticsearch与数据库的类比

关系型数据库(比如Mysql) 非关系型数据库(Elasticsearch)
数据库Database 索引Index
表Table 类型Type
数据行Row 文档Document
数据列Column 字段Field
约束 Schema 映射Mapping

10.ES存入数据和搜索数据机制

(1)索引对象(index):

存储数据的表结构 ,任何搜索数据,存放在索引对象上

(2)映射(mapping):

数据如何存放到索引对象上,需要有一个映射配置, 包括:数据类型、是否存储、是否分词等

(3)文档(document):

一条数据记录,存在索引对象上

(4)文档类型(type):

一个索引对象,存放多种类型数据,数据用文档类型进行标识

Elasticsearch概览

1.什么是Elasticsearch

(1)Elasticsearch,基于lucene,隐藏复杂性,提供简单易用的restful api接口、java api接口(还有其他语言的api接口)。

(2)Elasticsearch是一个实时分布式搜索和分析引擎。它用于全文搜索、结构化搜索、分析。

(3)全文检索:将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。

2.Elasticsearch适用场景

(1)维基百科,类似百度百科,全文检索,高亮,搜索推荐。
(2)The Guardian(国外新闻网站),用户行为日志(点击,浏览,收藏,评论)+ 社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)。
(3)Stack Overflow,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案。
(4)GitHub(开源代码管理),搜索上千亿行代码。

(5)国内:站内搜索(电商,招聘,门户,等等),IT系统搜索(OA,CRM,ERP,等等),数据分析(ES热门的一个使用场景)。

3.Elasticsearch特点

(1)可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司;树莓派

(2)Elasticsearch不是什么新技术,主要是将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的ES;lucene(全文检索),商用的数据分析软件(也是有的),分布式数据库(mycat);

(3)对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂;

(4)数据库的功能面对很多领域是不够用的(事务,还有各种联机事务型的操作);特殊的功能,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;Elasticsearch作为传统数据库的一个补充,提供了数据库所不能提供的很多功能。

CentOS7(单节点)安装elasticsearch

1.下载安装包

2.上传到linux

3.解压:

1
2
3
cd /usr/local/tars

tar -zxvf elasticsearch-5.6.2.tar.gz -C /usr/local

4.新建目录

1
2
3
4
cd /usr/local/elasticsearch-5.6.2

mkdir data
mkdir logs

5.修改配置文件:

1
2
3
cd /usr/local/elasticsearch-5.6.2/config

vi elasticsearch.yml

修改内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cluster.name: my-application

node.name: hadoop1

path.data: /usr/local/elasticsearch-5.6.2/data

path.logs: /usr/local/elasticsearch-5.6.2/logs

bootstrap.memory_lock: false
bootstrap.system_call_filter: false

network.host: hadoop1

discovery.zen.ping.unicast.hosts: ["hadoop1"]

6.修改limits.conf 文件

1
2
3
4
5
6
7
8
vi /etc/security/limits.conf

//在文件末尾添加如下内容

* soft nofile 655360
* hard nofile 131072
* soft nproc 4096
* hard nproc 4096

7.修改limit.d下的文件

1
2
3
4
5
6
vi /etc/security/limits.d/20-nproc.conf

//修改内容如下
* soft nproc 1024
//改为
* soft nproc 4096

20-nproc.conf

8.修改sysctl.conf文件

1
2
3
4
5
vi /etc/sysctl.conf

//添加内容
vm.max_map_count=655360

sysct;.conf

9.新建用户,elasticsearch不能以root用户启动

1
2
3
4
5
6
useradd hduser

cd /user/local

chown -R hduser ./elasticsearch-5.6.2/
chgrp -R hduser ./elasticsearch-5.6.2/

10.切换到hduser用户,启动elasticsearch

1
2
3
4
5
su hduser

cd /usr/local/elasticsearch-5.6.2

./bin/elasticsearch -d //后台启动
  • Copyrights © 2015-2021 Movle
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信