elasticsearch(以下简称ES),的3个基本问题。
1. ES 如何写入输入?
2. 如何从ES读取数据?
3. ES的性能优化
1. 如何写入数据到ES?
ES使用了2个端口9200和9300(默认),9200负责HTTP的请求,即REST apis。我们可以REST api将数据写入ES. 例如, 使用curl命令即可实现一个写入操作。curl -XPUT http://esnode:9200/index/type -d ‘{json_doc}’
9300是TCP监听,供ES nodes之间通信使用。
写数据到ES,所使用的clients分成2种,
第一是JAVA的,第二是其它。
先说其它的(python/go/...等),都是用的是http REST api的方式,即访问的是9200.
再说JAVA client,根据角色的不同, 用分成2种, 其一,节点client(node client)即,java client成为ES cluster中的一个节点,但不存储数据。其二,传输client(transport client),即java client不加入ES cluster, 只是传输数据给ES cluster中的节点。JAVA client使用的都是9300端口, 使用的是Elasticsearch的传输 协议(native Elasticsearch transport protocol)。
使用Elasticsearch的官方python cleint(https://github.com/elastic/elasticsearch-py) 进行写数据的操作的case
from elasticsearch import Elasticsearch
from elasticsearch import helpers
from logger import diylogger
from datetime import datetime
import pickle
class ESWriter(object):
'''
elasticsearch writer
'''
BULK_SIZE = 10000
TIME_OUT = 120
def __init__(self, es_hosts, index):
if isinstance(es_hosts, str):
self.hosts = [es_hosts]
elif isinstance(es_hosts, list):
self.hosts = es_hosts
else:
raise TypeError("wrong type of es_hosts")
self.client = Elasticsearch(self.hosts)
self.index = index
def bulk(self, file_path):
'''
bulk operation
'''
try:
messages = list()
with open(file_path, 'rb') as f:
messages = pickle.load(f)
actions = list()
for item in messages:
# message = json.loads(item)
item = item[0:-1] + ',"timestamp":"' + \
datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%f") + '"}'
action = dict()
action["_index"] = self.index
action["_type"] = "logs"
action["_source"] = item
actions.append(action)
if len(actions) == self.BULK_SIZE:
helpers.bulk(self.client,
actions,
chunk_size=self.BULK_SIZE,
request_timeout=self.TIME_OUT)
diylogger.info(
"bulk once to es {0}".format(self.BULK_SIZE))
actions = list()
if len(actions) > 0:
helpers.bulk(
self.client, actions, request_timeout=self.TIME_OUT)
diylogger.info("bulk done for {0} messages".format(len(messages)))
except Exception, e:
diylogger.error("error in bulk of ESWriter:{0}".format(str(e)))
finally:
del messages
del actions