엘라스틱서치 필드값으로 집계하기 ElasticSearch Aggregation Query (group by)

ElasticSearch는 RDMS가 아닙니다. DB가 아닙니다.

넓은 의미로는 데이터베이스라고 할 수는 있습니다. 데이터를 넣고 분석하고 삭제하는 등의 관리를 할 수 있으니까요. 하지만 RDBMS가 가진 많은 기능을 제공하지는 않고 그 중에 어낼리틱스 기능또한 제공되지 않는 것 중 하나입니다.

하지만 DB처럼 사용하려는 사용자 요구가 많고 엘라스틱서치 측에서도 계속해서 그런 어낼리틱스 기능을 지원하려고 하고 있습니다.

집계 쿼리(Aggregation Query)는 DB의 “group by”같은 것을 말합니다.

집계 쿼리를 사용할 때 주의할 것

  • 엘라스틱서치의 집계 쿼리는 부하가 심합니다.
  • 집계하려는 필드가 색인에 들어있지 않은 경우는 더 심합니다.

쓰고 싶으믄 크지 않은 인덱스에 대해서 하고 가능하면 대상 필드에 색인을 걸어 두는 것이 좋습니다.

쿼리 예제

aggregation 쿼리의 예제입니다. “createDate”라는 날짜 포맷의 컬럼을 기준으로 몇개의 문서가 있는지 집계하는 쿼리입니다. range는 날짜 구간입니다. 아래와 같은 형식으로 쿼리를 작성해서 응용해서 쓰면 됩니다.

{
    "query": {
      "range": {
        "createdDate": {
          "gt": "20220423",
          "lte": "20220523"
        }
      }
    },
    "aggs": {
        "group_by_state": {
          "terms": {
            "field": "createdDate"
          }
        }
    }
}

위와 같이 하면 집계 결과와 검색결과가 같이 나오는데 검색결과에 모든 필드가 포함됩니다. 필요 없는 것을 빼고 비교적 간략하게 받으려면 _source를 지정해주면 조금 더 낫습니다.

{
    "query": {
      "range": {
        "createdDate": {
          "gt": "20220423",
          "lte": "20220523"
        }
      }
    },
    "aggs": {
        "group_by_state": {
          "terms": {
            "field": "createdDate"
          }
        }
    },
    "_source": [
      "createdDate",
      "doc_id"
    ]
}

아예 hits에 결과를 안넣고 받으려면 size를 0으로 해주면 됩니다.

{
  "size": 0,
  "query": {
    "range": {
      "createdDate": {
        "gt": "20220423",
        "lte": "20220523"
      }
    }
  },
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "createdDate"
      }
    }
  }
}

tcpdump로 UDP 데이터가 어느 호스트에서 오는지 확인하는 법

제목 그대로입니다.

UDP는 TCP와 달리 커넥션(connection)을 맞는 방식이 아니기 때문에 바로 지금 데이터를 보내는 호스트들이 어떤 것인지 확인하기가 힘듭니다.

역시 tcpdump로 확인할 수 있습니다. 예를 들면 8125포트로 UDP데이터를 보내고 있는 호스트를 알아내려면 다음과 같은 코맨드를 실행하고 잠시 지켜보면 됩니다.

참고로 8125는 statsd가 데이터를 수신하는 포트이고 statsd는 시스템이나 애플리케이션의 상태를 모니터링하기 위해서 시그널 데이터를 받는 조그만 시스템입니다.

sudo tcpdump -i eth0 udp port 8125 -vv -X

Failure –
java.io.IOException: Downloaded file /var/lib/jenkins/plugins/workflow-support.jpi.tmp does not match expected SHA-1

젠킨스 플러그인 업데이트 도중에 다음과 같이 에러가 발생할 때 해결하는 방법이다.

Failure -
java.io.IOException: Downloaded file /var/lib/jenkins/plugins/workflow-support.jpi.tmp does not match expected SHA-1

플러그인 업데이트 주소를 아래와 같이 지정해준다.

https://updates.jenkins.io/update-center.json

The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY xxxxxxxxxxxxxxxx

우분투에서 apt로 레파지토리를 등록하고 설치를 할 때 이런 에러가 발생할 때가 있다.

특히 Jenkins

The following signatures couldn't be verified because the public key is not available: NO_PUBKEY FCEF32E745F2C3D5

키 등록을 못한 것이라서 아래의 명령으로 된다. 아래의 키는 예시이므로 키는 자신의 것의로 바꾼다.

sudo apt-key adv --keyserver-options http-proxy=http://proxy.cns.widerlab.io:8080 --keyserver keyserver.ubuntu.com --recv-keys FCEF32E745F2C3D5

만약 서버가 외부 네트워크로 나갈 때 proxy를 사용해야만 한다면 위의 명령으로는 키가 등록되지 않는다. 다음과 같이 proxy를 지정해준다.

sudo apt-key adv --keyserver-options http-proxy=http://proxy.cns.yourproxy.com:8080 --keyserver keyserver.ubuntu.com --recv-keys FCEF32E745F2C3D5

이제 설치하려던 패키지를 설치하면 된다.