리눅스에 kibana 4.1.2 설치하기






elasticsearch도 설치했으니 이제 키바나 4.1.2을 설치하려고 한다. 

키바나 4.1 버전은 elasticsearch 1.4.4 를 포함한 이 후 버전에서만 사용할 수 있으니 참고하자. 



키바나 다운로드 사이트 바로가기 





운영체제에 맞게 LINUX 64-BIT 나 32-BIT를 클릭한다. 

연결된 다운로드 사이트에서 나오는 url을 wget으로 받은후 압축을 푼다.



# wget https://download.elastic.co/kibana/kibana/kibana-4.1.2-linux-x64.tar.gz

--2015-10-15 18:10:30--  https://download.elastic.co/kibana/kibana/kibana-4.1.2-linux-x64.tar.gz

Resolving download.elastic.co... 23.21.139.229, 50.16.192.199, 184.73.241.51, ...

Connecting to download.elastic.co|23.21.139.229|:443... connected.

HTTP request sent, awaiting response... 200 OK

Length: 11787239 (11M) [application/octet-stream]

Saving to: `kibana-4.1.2-linux-x64.tar.gz'


100%[==========================================================================>] 11,787,239  2.38M/s   in 5.6s


#tar zxfv kibana-4.1.2-linux-x64.tar.gz






./conf/kibana.yml을 열어 필요하면 설정을 수정한다. 

elasticsearch의 hostname과 port 및 키바나의 port 번호를 여기서 설정할 수 있다. 



# Kibana is served by a back end server. This controls which port to use.

port: 5601


# The host to bind the server to.

host: "0.0.0.0"


# The Elasticsearch instance to use for all your queries.

elasticsearch_url: "http://localhost:9200"





bin/kibana를 실행한다. 



# ./kibana

{"name":"Kibana","hostname":"q..","pid":17380,"level":30,"msg":"No existing kibana index found","time":"2015-10-15T10:24:46.640Z","v":0}

{"name":"Kibana","hostname":"q..","pid":17380,"level":30,"msg":"Listening on 0.0.0.0:5601","time":"2015-10-15T10:24:46.645Z","v":0}




이렇게 실행할 경우 터미널 창이 종료되면 kibana실행도 종료가 된다. 

ssh 세션이 끝나도 남아있도록 하려면 아래와 같이 실행하도록 한다. 



sh kibana-4.1.2-linux-x64/bin/kibana >> /var/log/kibana.log(or /dev/null) &




마지막으로 웹브라우저에서 http://yourhost:5601(또는 입력한 키바나 포트번호)를 입력하여 

아래와 같은 설정화면이 뜨는지 확인해본다.  




다음 포스팅에서는 키바나 설정을 해보겠다. 







elasticsearch 시작하기 - bulk index 로 색인하기

 

 

기본 사용법

 

D:\es\elasticsearch-1.4.2>curl -s -XPOST "http://localhost:9200/_bulk" --data-binary @bulkdata.json

 

--data-binary 옵션뒤에 색인할 bulk file을 지정한다.

bulk 색인중에는 bulk file이 다 메모리에 로드되기 때문에

적은 사이즈 (20~30 M)로 나눠서 색인을 하도록 색인 스크립트를 작성하였다.

 

 

Linux -command 


D:\es\elasticsearch-1.4.2>curl -s -XPOST "http://localhost:9200/_bulk" --data-binary @bulkdata.json


 

 

리눅스에서는 주소에 ' 나 "를 붙여도 잘 되지만 윈도우에서는 에러가 나거나 작동 안함


윈도우 - command line


D:\es\elasticsearch-1.6.0\bin>curl -s -XPOST "localhost:9200/_bulk" --data-binary @bulkdata.json

{"error":"ElasticsearchParseException[Failed to derive xcontent from org.elastic

search.common.bytes.BytesArray@1]","status":400}


D:\es\elasticsearch-1.6.0\bin>curl -s -XPOST 'localhost:9200/_bulk' --data-binary @bulkdata.json

작동안함


D:\es\elasticsearch-1.6.0\bin>curl -s -XPOST localhost:9200/_bulk --data-binary@bulkdata.json

제대로 동작


 

 

bulk file (예시)

{"index":{"_index":"indexname","_type":"typename","_id":"1"}}
{"id":"981146","날짜":"2014-01-01",... ,"총주식수":null}

 

- doc이후의 마지막 라인에 빈 라인이 있지 않으면 no_requests added 에러가 나니 조심할 것. (참고:

http://stackoverflow.com/questions/22996337/elasticsearch-no-requests-added-bulk-api-error)

 

{ "error": "ActionRequestValidationException[Validation Failed: 1: no requests added;]", "status": 500 }

 

 

리눅스 전체 bulk index 스크립트

 

 

#!/bin/sh


today=`date '+%Y%m%d'`
jsondir=/home/json/$today
bulkdir=/home/bulk/$today
mkdir ${jsondir}
mkdir ${bulkdir}

// table에서 bulk file을 생성하는 스크립트
php extract_bulk_from_table.php > ${jsondir}/bulkdata.json
split_bulk.sh 200000 ${jsondir}/bulkdata.json
curl -XDELETE localhost:9200/indexname

// mapping 설정
curl -s -XPOST 'http://localhost:9200/indexname' --data-binary @mapping_unit.json

for entry in $bulkdir/*
do
        echo "$entry"
        curl -s -XPOST 'http://localhost:9200/_bulk' --data-binary @${entry}
done


 

extract_bulk_from_table.php

 

<?php

ini_set('memory_limit', '-1');
header("Content-Type: text/html; charset=UTF-8");
$conn = mysqli_connect('localhost', 'id', 'passwd','dbname');
if (mysqli_connect_errno($conn))
{
        echo "데이터베이스 연결 실패: " . mysqli_connect_error();
}
 

  $check_query = "select * from tablename";

  $result = $conn->query($check_query);

  $total_line = "";
  while($row = mysqli_fetch_assoc($result)) {

                   $type = $row['종목코드'];
                   $total_line = "{\"index\":{\"_index\":\"indexname\",\"_type\":\"".$type."\",\"_id\":\"".$id++."\"}}\n";
                   $total_line .= json_encode($row, JSON_UNESCAPED_UNICODE );
                   $total_line .= "\n";
                   echo $total_line;
                }


 

?>

 

 

mapping_unit.json

 

{
    "settings" : {
      "analysis": {
          "filter": {
            "my_shingle_filter": {
               "type": "shingle",
               "output_unigrams": false
            }
          },
          "analyzer" : {
            "my_shingle_analyzer": {
               "type": "custom",
               "tokenizer" : "standard",
               "filter": [
                  "my_shingle_filter"
               ]
            }
          }
      }
    },
    "mappings" : {
      "_default_" : {
        "properties" : {
          "4일종가합" : {
            "type" : "string"
          },

          "종목" : {
            "type" : "string",
            "index" : "not_analyzed"
          },
          ....  
          "현재가" : {
            "type" : "string"
          }
        }
      }
}
}

 

 


elasticsearch - mapping 확인하기






엘라스틱 검색에서 현재 mapping을 확인하고 변경하는 방법을 정리해보았다. 


현재 mapping 확인하기


- web browser에서 확인하기 


http://(localhost or ip):(port)/indexname/_mapping/typename/


예시 ) 


http://localhost:9200/test/_mapping/companyname1/


- linux 에서 확인하기 


curl -XGET 'http://(localhost or ip):(port)/indexname/_mapping/typename?pretty'


예시) 

curl -XGET 'http://125.456.789.01:9200/test/_mapping?pretty'


- 리눅스에서 현재 mapping을 json 파일로 저장하기 

curl -XGET 'http://125.456.789.01:9200/test/_mapping/companyname1?pretty' > current_mapping.json


예시) mapping 저장 결과 


{

  "test" : {

    "mappings" : {

      "companyname1" : {

        "properties" : {

          " 분기경상이익" : {

            "type" : "string"

          }, 

        ...

        "news_line" : {

            "type" : "string"

          },

    }
}





참고: 


https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-cjk-bigram-tokenfilter.html


https://www.elastic.co/guide/en/elasticsearch/guide/current/mapping-intro.html



엘라스틱검색 에러 - java.lang.OutOfMemoryError: Java heap space



참고: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/heap-sizing.html

 



엘라스틱서치를 사용하면서 가장 많이 보는 에러중에 하나가 Java heap space 에러이다.

아래는 로그 파일에서 확인할 수 있는 Java heap space 에러 메세지이다. 


 

[Eel] Caught exception while handling client http traffic, closing connection 
  2 java.lang.OutOfMemoryError: Java heap space
  3     at org.elasticsearch.common.netty.buffer.HeapChannelBuffer.<init>(HeapChannelBuffer.java:42)
  4     at org.elasticsearch.common.netty.buffer.BigEndianHeapChannelBuffer.<init>(BigEndianHeapChannelBuffer.java:34)
  5     at org.elasticsearch.common.netty.buffer.ChannelBuffers.buffer(ChannelBuffers.java:134)
  6     at org.elasticsearch.common.netty.buffer.HeapChannelBufferFactory.getBuffer(HeapChannelBufferFactory.java:68)
  7     at org.elasticsearch.common.netty.buffer.CompositeChannelBuffer.copy(CompositeChannelBuffer.java:568)
  8     at org.elasticsearch.common.netty.buffer.AbstractChannelBuffer.copy(AbstractChannelBuffer.java:523)
  9     at org.elasticsearch.common.netty.handler.codec.http.HttpChunkAggregator.appendToCumulation(HttpChunkAggregator.java:208)
 10     at org.elasticsearch.common.netty.handler.codec.http.HttpChunkAggregator.messageReceived(HttpChunkAggregator.java:175)
 11     at org.elasticsearch.common.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
 12     at org.elasticsearch.common.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
 13     at org.elasticsearch.common.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
 14    

 


위와같은 에러가 발생하면 엘라스틱검색이 사용하고 있는 메모리 사이즈를 확인한다. 

 

 

# ps afx | grep elastic
18177 pts/0    S+     0:00                      \_ grep elastic
19926 ?        Sl    90:40 /usr/lib/jvm/jdk1.7.0_45/bin/java -Xms256m -Xmx1g -Xss256k -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly XX:+HeapDumpOnOutOfMemoryError -Delasticsearch




기본 설정이었던 최대 메모리가 1기가로 설정되어 있어 

메모리가 작아 에러가 생긴 것이다. 


  top을 쳐서 가용 메모리를 확인한다.


 

top - 17:51:15 up 129 days,  8:41,  1 user,  load average: 0.18, 0.07, 0.02
Tasks: 186 total,   1 running, 185 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.1%sy,  0.0%ni, 97.1%id,  0.1%wa,  0.0%hi,  2.4%si,  0.0%st
Mem:   2058540k total,  1931404k used,   127136k free,   126036k buffers
Swap:  1048568k total,   262252k used,   786316k free,   569492k cached

 


보통 가용 메모리의 반을 엘라스틱검색에 설정하는데 

지금 사용하는 리눅스 가상서버의 전체 가용 메모리가 2기가밖에 되지 않아 

더이상 메모리를 늘려도 조금 더 사용하면 또 메모리 에러날 것 같다. 


그냥 윈도우 서버에 다시 깔아서 해야할 듯 ㅠㅠ



 참고로  메모리 설정 방법 변경 방법은 간단하다. 

아래와 같이 시작 스트립트를 하나 만들어서 ES_HEAP_SIZE 환경 변수를 설정하고 

엘라스틱서치를 시작하면 된다.  

 

 

 

#!/bin/bash

export ES_HEAP_SIZE=4g
./elasticsearch -Des.max-open-files=true -d

 







 


 

[elasticsearch] open / close /delete index

 

 

 

자주 사용하는 API라 그냥 본인 참고용으로 정리.

 

elasticsearch는 특정 인덱스를 지정하여 열고 닫는것이 가능한데

더이상 사용하지 않는 인덱스가 있으면 검색서버 성능을 고려해서 닫거나 삭제해 주는 것이 좋다.

이렇게 닫혀진 인덱스는 클러스터에 overhead를 주지 않으며 이렇게 닫혀진 인덱스 내용을 읽고 쓰는 것은 불가능하다.

다시 인덱스를 읽고 싶으면 언제든지 다시 인덱스를 열어줄 수 있다.

 

 

- 특정 인덱스를 열거나 닫을 떄


curl -XPOST 'localhost:9200/my_index/_close'

curl -XPOST 'localhost:9200/my_index/_open'

 

- 전체 인덱스 열고 닫기

전체 인덱스를 닫거나 열 때는 인덱스 이름으로 _all 이나 * 를 사용한다.

 

curl -XPOST 'localhost:9200/*/_close'
curl -XPOST 'localhost:9200/_all/_close'

 

 

- 특정 인덱스 삭제

curl -XDELETE 'localhost:9200/my_index/'

 

 

- 전체 인덱스 삭제

전체 인덱스를 닫을 때와 동일하게 인덱스 이름으로 _all 이나 * 를 사용한다.

  리눅스 -  curl -XDELETE 'http://localhost:9200/_all/'

  윈도우 -   curl -XDELETE localhost:9200/_all

 

한번 삭제된 인덱스는 복구가 불가능하니 삭제 작업을 하기 전에 충분히 생각하고 진행하자.

 

 

그 외 자주 쓰는 명령어 



-  전체 node shutdown


curl -XPOST 'http://localhost:9200/_shutdown'


 

 

참고:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-open-close.html

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-delete-index.html