1,ElasticSearch准实时索引实现
Es在保存数据的时候时分区/分片存储的,每一个分区/分片都对应着一个Lucene实例
- 每一个分区/分片对应多个文件,一个文件就是一个Segment(段)
- Segment
- 就是可以被检索的最小单元,每一个Segment都对应着一个倒排索引
Refresh到内存Segment:
- 从内存中的缓冲区 (buffer) 到内存中的segment (建立了内存中的倒排索引)
- refresh默认1秒一次,也可以根据JVM堆内存进行refresh,10%的堆内存进行refresh。
Flush到磁盘:
- 当保存在内存中的segment触发了阈值, 就会把内存中的segment写入到磁盘
- ES默认每隔30分钟/512m把内存中的segment数据写入到磁盘中
Translog 溢写日志:
- 在数据写入内存的同时, 还会写一份相同的数据到磁盘, 这份数据会写入到Translog中, 如果在refresh期间出现了异常导致程序挂掉, 当程序再次启动的时候, 可以从translog中恢复回来
- 当走了Flush刷新之后, 说明translog中对应的数据,已经建好了倒排索引, 并且保存到了磁盘上的segment , 数据丢失的概率很小了, translog会被清空
在大批量数据写入ES的时候,应该先关闭自动refresh,数据写入之后再打开自动refresh
ES准实时索引完整流程
buffer(缓冲区)->segment(数据段)->refresh(刷新 内存buffer->内存sgment)->flush(刷新 内存segment->磁盘segment ->translog(溢写日志))
2,Python代码操作ES
创建一个实体类,用来表示一条招聘信息
class JobDetail():
def __init__(self, id, area, cmp, edu, exp, title, job_type, pv, jd, salary):
self.id = id
self.area = area
self.cmp = cmp
self.edu = edu
self.exp = exp
self.title = title
self.job_type = job_type
self.pv = pv
self.jd = jd
self.salary = salary
# 返回为字典数据, 用于后续方便使用, 此处也可以尝试使用JSON方式转换
def get_document(self):
return {
'id': self.id, 'area': self.area, 'cmp': self.cmp, 'edu': self.edu, 'exp': self.exp,
'title'

本文介绍了ElasticSearch的准实时索引实现,包括内存Segment、Refresh和Flush过程。接着展示了如何使用Python进行ES数据的增删查改操作,并提到了在大批量写入时的优化策略。最后,文章讲述了通过sqoop将Hive数据导入到ES的步骤,包括创建Hive表、设置ES导入参数。
1557

被折叠的 条评论
为什么被折叠?



