[Filebeats] filebeats input filestream 에서 id 설정의 중요성

Elastic/Beats 2022. 8. 12. 18:20

filebeats input filesstream 에서 id 설정을 하고 사용 하시길 권장 합니다.

 

코드를 한번 보실 분들은 아래 파일 열어 보시면 됩니다.

filebeat/input/filestream/
  ㄴ filestream.go
  ㄴ input.go

filebeat input 에서는 inode marker 를 이용해서 file offset 에 대한 처리 정보를 기록 합니다.
이를 통해서 데이터를 처리 하게 되는데 여러개의 filestream 을 등록 하게 되면 같은 파일에 대해서 데이터를 중복으로 처리 하거나 우선순위에 따라 먼저 선점한 filestream 이와 다른 filestream 에서 처리가 안되는 경우가 발생 할 수 있습니다.
이를 해결 하기 위해서는 사전에 등록된 file 의 inode marker 를 리셋 하거나 filestream 설정에서 id 지정을 통해서 해결 할 수 있습니다.

 

참고문서)
https://www.elastic.co/guide/en/beats/filebeat/8.3/filebeat-input-filestream.html
https://www.elastic.co/guide/en/beats/filebeat/8.3/filebeat-input-filestream.html#filestream-input-id

 

Each filestream input must have a unique ID. Omitting or changing the filestream ID may cause data duplication. Without a unique ID, filestream is unable to correctly track the state of files.

Changing input ID may cause data duplication becauin the state of the files will be lost and they will be read from the beginning again.

id 값은 유니크 해야 하고 변경 시 데이터가 중복 발생 할 수 있다는 내용입니다.
실제 설정에서 id 설정을 하지 않더라도 실행에는 문제가 되지 않습니다.

:

[Elastic] Checksum 활용 하기.

Elastic 2022. 7. 20. 18:06

아마 사용하고 계시는 분들이 있을지 모르겠지만 간혹 Elastic Stack tarball 다운로드 받고 나서 파일이 깨지는 현상을 경험 하실 수 있는데요.

 

이럴 경우 다운로드 받은 tarball 이 유효 한지 확인 하는 방법을 소개 하려고 합니다. (이미 다 아실 만한 내용입니다.)

Elasticsearch 기준으로 설명 하겠습니다.

 

다운로드 페이지)

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

 

여기서 tar.gz 과 tar.gz.sha512 두 개의 파일을 다운로드 받습니다.

이제 checksum 검증을 하시면 됩니다. (아래는 mac 기준입니다.)

$ cat elasticsearch-8.3.2-darwin-x86_64.tar.gz.sha512
a8661896ba48365b6339d809c16f6c01a271ed76bbba4be10de08ade382ae6740968f9eb1f22ec1c30
fcca6aaf33d645530c3afb528ac20f3b638445c646d768  elasticsearch-8.3.2-darwin-x86_64.tar.gz

$ shasum -a 512 elasticsearch-8.3.2-darwin-x86_64.tar.gz
a8661896ba48365b6339d809c16f6c01a271ed76bbba4be10de08ade382ae6740968f9eb1f22ec1c30
fcca6aaf33d645530c3afb528ac20f3b638445c646d768  elasticsearch-8.3.2-darwin-x86_64.tar.gz

보시는 것 처럼 hash code 값이 같다면 다운로드 받은 tarball 이 유효 하다는 의미 입니다.

이와 같이 Elastic Stack 의 tarball 에 대한 검증 이후 사용 하시면 간혹 segment fault 오류에 대한 해결책이 될 수 있습니다.

 

:

[Elasticsearch] Arirang Plugin on Elasticsearch 8.3.2

Elastic/Elasticsearch 2022. 7. 20. 13:47

Elasticsearch 8.3.2 + Lucene 9.2.0 에서 변경된 내용을 정리해 봅니다.

 

Lucene 8.11 to 9.2)

pom.xml 내 수정

# lucene-analyzers-common 은 9.x 에서는 더 이상 지원 하지 않음
<dependency>
  <groupId>org.apache.lucene</groupId>
  <artifactId>lucene-analyzers-common</artifactId>
  <version>${lucene.version}</version>
</dependency>
to
<dependency>
  <groupId>org.apache.lucene</groupId>
  <artifactId>lucene-analysis-common</artifactId>
  <version>${lucene.version}</version>
</dependency>

package 변경

org.apache.lucene.analysis.util.TokenFilterFactory
to
org.apache.lucene.analysis.TokenFilterFactory

org.apache.lucene.analysis.standard.ClassicFilter
to
org.apache.lucene.analysis.classic.ClassicFilter

org.apache.lucene.analysis.util.TokenizerFactory
to
org.apache.lucene.analysis.TokenizerFactory

org.apache.lucene.analysis.util.TokenFilterFactory
to
org.apache.lucene.analysis.TokenFilterFactory

org.apache.lucene.analysis.util.TokenFilterFactory
to
org.apache.lucene.analysis.TokenFilterFactory

 

elasticsearch analyzer plugin)

# AbstractIndexAnalyzerProvider 에서 IndexSettings 제거됨

org.elasticsearch.client.node.NodeClient
to
org.elasticsearch.client.internal.node.NodeClient

JDK 수정

build 시 jdk 17 사용
$jenv local 17

<java.version>17</java.version> 수정

❖ lucene 에서는 analyzer 패키지 변경이 있었으며, elasticsearch 에서는 NodeClient 에 대한 패키지 변경이 있었습니다.

:

[Elasticsearch] Filter Aggregation 사용하기.

Elastic/Elasticsearch 2022. 7. 18. 18:50

보통 Query 절에서 문서를 필터링 하고 Aggs 에서 집합/분석 질의를 하게 됩니다.

이 경우 성능적 잇점을 가져 가기 위해서는 보통 아래 두 가지 설정만 잘 사용 하면 됩니다.

 

1. Query 절은 Non-Scoring 질의를 사용하고

2. Size 파라미터 값을 0 으로 사용하고

 

그 이외는 기본적으로 Elasticsearch 에서  Cache 기능이 잘 동작 하기 때문에 크게 고민을 하지 않으셔도 어느 정도의 성능은 나온다고 보시면 됩니다.

 

Bucket Aggregation 중 Query 절에서 Filtering 하는 것과 같은 기능이 있어서 문서 링크와 주의 사항(?) 올려 봅니다.

 

아래 두 질의는 같은 결과를 리턴 합니다.

 

Case 1)

POST /sales/_search?size=0&filter_path=aggregations
{
  "query": { "term": { "type": "t-shirt" } },
  "aggs": {
    "avg_price": { "avg": { "field": "price" } }
  }
}

 

Case 2)

POST /sales/_search?size=0&filter_path=aggregations
{
  "aggs": {
    "t_shirts": {
      "filter": { "term": { "type": "t-shirt" } },
      "aggs": {
        "avg_price": { "avg": { "field": "price" } }
      }
    }
  }
}

여기서 C1, C2 중 어떤게 좀 더 성능적으로 우세 할까요?

공홈 문서에 따르면 Sub Aggregation. 을 가지는 Filter Aggregation 보다는 Top Level Query 를 사용하는게 더 빠르다고 합니다.

그리고 다수의 Filter Aggregation 을 사용 하는 것 보다는 Filters Aggregation 을 사용 하는게 더 빠르다고 하니 참고 해서 사용 하시기 바랍니다.

 

제가 사용 한다고 하면 Top Level Query 에 Filter Query 나 Non-Scoring Query 를 이용해서 사용 할 것 같습니다.

 

 

 

:

[Elasticsearch] Common Options 활용

Elastic/Elasticsearch 2022. 7. 18. 12:37

공식 문서)

https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html

 

Response Filtering)

https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#common-options-response-filtering

 

_search REST API 사용 시 유용하게 활용이 가능 합니다.

잘 응용해서 사용하세요.

 

결과 내 JSON Result 에서 filter_path 를 통해서 필요한 결과를 parsing 할 수 있습니다.

: