数据方案:
  • 在Elasticsearch中通过code及time字段查询对应doc的mongo_id字段获得mongodb中的主键_id
  • 通过获得id再进入mongodb进行查询
 
1,数据情况:
  • 全部为股票及指数的分钟K线数据(股票代码区分度较高)
  • Elasticsearch及mongodb都未分片且未优化参数配置,mongo表中只有主键_id索引
  • mongodb数据量:

    

  • Elasticsearch数据量:

    

2,将数据从mongo源库导入Elasticsearch

import time
from pymongo import MongoClient
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
es = Elasticsearch() conn = MongoClient('127.0.0.1', 27017)
db = conn.kline_db
my_set = db.min_kline
x = 1
tmp = [] #此处有个坑mongo查询时由于数据量比较大时间较长需要设置游标不过期:no_cursor_timeout=True
for i in my_set.find(no_cursor_timeout=True):
x+=1
#每次插入100000条
if x%100000 == 99999:
#es批量插入
success, _ = bulk(es, tmp, index='test_2', raise_on_error=True)
print('Performed %d actions' % success)
tmp = []
if i['market'] == 'sz':
market = 0
else:
market = 1
#此处有个秒数时间类型及时区转换
tmp.append({"_index":'test_2',"_type": 'kline','_source':{'code':i['code'],'market':market,\
'time':time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(i['kline_time']/1000 - 8*60*60))\
,'mongo_id':str(i['_id'])}}) #将最后剩余在tmp中的数据插入
if len(tmp)>0:
success, _ = bulk(es, tmp, index='test_2', raise_on_error=True)
print('Performed %d actions' % success)

3,Elasticsearch+mongo查询时间统计

import time
from pymongo import MongoClient
from elasticsearch import Elasticsearch
from elasticsearch.helpers import scan
from bson.objectid import ObjectId #es连接
es = Elasticsearch() #mongo连接
conn = MongoClient('127.0.0.1', 27017)
db = conn.kline_db #连接kline_db数据库,没有则自动创建
my_set = db.min_kline tmp = [] #计算运行时间装饰器
def cal_run_time(func):
def wrapper(*args,**kwargs):
start_time = time.time()
res = func(*args,**kwargs)
end_time = time.time()
print(str(func) +'---run time--- %s' % str(end_time-start_time))
return res
return wrapper @cal_run_time
def query_in_mongo(tmp_list):
k_list = []
kline_data = my_set.find({'_id':{'$in':tmp_list}})
for k in kline_data:
k_list.append(k)
return k_list @cal_run_time
def query_in_es():
#bool多条件查询 must相当于and
body = {
"query": {
"bool": {
"must": [{
"range": {#范围查询
"time": {
"gte": '2017-01-10 00:00:00', # >=
"lte": '2017-04-12 00:00:00' # <=
}
}
},
{"terms": {# == 或 in:terms 精确查询
"code": ['','']
}
}
]
} }
} #根据body条件记性查询
scanResp = scan(es, body, scroll="10m", index="test_2",doc_type="kline", timeout="10m") #解析结果字典并放入tmp列表中
for resp in scanResp:
tmp.append(ObjectId(resp['_source']['mongo_id'])) print(len(tmp)) #--------------此处有个坑,直接使用search方法查询到的结果集中最多只有10条记录----------------
# zz = es.search(index="test_2", doc_type="kline", body=body)
# print(zz['hits']['total'])
# for resp in zz['hits']['hits']:
# tmp.append(ObjectId(resp['_source']['mongo_id'])) query_in_es() query_in_mongo(tmp)

运行结果如下:

第一行:查询的doc个数:28320

第二行:es查询所用时间:0.36s

第三行:mongo使用_id查询所用时间 :0.34s

从结果来看对于3亿多数据的查询Elasticsearch的速度还是相当不错的

※Elasticsearch主要的优势在于可以进行快速的分词模糊查询,所以股票K线这个场景并没有充分发挥其优势,至于查询效率,其实mysql,mongo等只要分库分表合理一样能够达到。

※Elasticsearch+Mongo这个架构主要针对场景:使用mongo存储海量数据,且这张表读写都很频繁。

Elasticsearch+Mongo亿级别数据导入及查询实践的更多相关文章

  1. clickhouse安装数据导入及查询测试

    官网 https://clickhouse.tech/ quick start ubantu wget https://repo.yandex.ru/clickhouse/deb/lts/main/c ...

  2. JuiceFS 在 Elasticsearch/ClickHouse 温冷数据存储中的实践

    企业数据越存越多,存储容量与查询性能.以及存储成本之间的矛盾对于技术团队来说是个普遍难题.这个难题在 Elasticsearch 与 ClickHouse 这两个场景中尤为突出,为了应对不同热度数据对 ...

  3. Elasticsearch学习笔记——安装、数据导入和查询

    到elasticsearch网站下载最新版本的elasticsearch 6.2.1 ? 1 https://www.elastic.co/downloads/elasticsearch 中文文档请参 ...

  4. [原创]PostgreSQL Plus Advanced Server批量创建分区表写入亿级别数据实例

    当前情况:大表的数据量已接近2亿条我的解决思路:为它创建n*100个分区表,将各个分区表放在不同的tablespace上这样做的优点:1.首先是对这个级别的数据表的性能会有所提升2.数据管理更科学3. ...

  5. 百亿级别数据量,又需要秒级响应的案例,需要什么系统支持呢?下面介绍下大数据实时分析工具Yonghong Z-Suite

    Yonghong Z-Suite 除了提供优秀的前端BI工具之外,Yonghong Z-Suite让用户可以选购分布式数据集市来支持实时大数据分析. 对于这种百亿级的大数据案例,Yonghong Z- ...

  6. Elasticsearch的脚本化数据导入导出

    我用的ES的版本是2.4.1,由于没有相应的命令实现数据的导入和导出,就是像mysql的那种mysqldump类似的指令. 更苦逼的是,我们的生产和测试环境,还不能联网,连ES的第三方的插件都没有办法 ...

  7. 使用Mongo dump 将数据导入到hive

    概述:使用dump 方式将mongo数据导出,上传到hdfs,然后在hive中建立外部表. 1.     使用mongodump 将集合导出 mongodump --host=localhost:27 ...

  8. Mongo实战之数据空洞的最佳实践

    问题背景: 某天,开发部的同事跑过来反映: mongodb数据文件太大,快把磁盘撑爆了!其中某个db占用最大(运营环境这个db的数据量其实很小) 分析: 开发环境有大量测试的增/删/改操作,而由于Mo ...

  9. 转载:MongoDB 在 58 同城百亿量级数据下的应用实践

    为什么要使用 MongoDB? MongoDB 这个来源英文单词“humongous”,homongous 这个单词的意思是“巨大的”.“奇大无比的”,从 MongoDB 单词本身可以看出它的目标是提 ...

随机推荐

  1. 自定义Win10右键“发送到”菜单

    打开Win10文件资源管理器窗口(打开“这台电脑”或任一文件夹即可),然后在资源管理器窗口的地址栏中输入 shell:sendto ,回车或点击地址栏右侧的“转到”箭头即可打开“SendTo(发送到) ...

  2. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'multipartResolver': Failed to introspect bean class [org.springframework.web.multipart.commons.CommonsMultipartR

    在用spring mvc 做文件上传的时候出现了这个问题(能看到这篇文章就说明你已经有了那两个包了) 错误:org.springframework.beans.factory.BeanCreation ...

  3. python爬虫,爬取一系列新闻

    这个作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2941. 由于存在多次请求,所以稍微将请求封装如下 def tr ...

  4. 什么是DevOps

    历史回顾 为了能够更好的理解什么是DevOps,我们很有必要对当时还只有程序员(此前还没有派生出开发者,前台工程师,后台工程师之类)这个称号存在的历史进行一下回顾. 如编程之道中所言: 老一辈的程序员 ...

  5. 最短路径 SPFA P3371 【模板】单源最短路径(弱化版)

    P3371 [模板]单源最短路径(弱化版) SPFA算法: SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA 最坏情况下复 ...

  6. Qt文档阅读笔记-QGraphicsItem::paint中QStyleOptionGraphicsItem *option的进一步认识

    官方解析 painter : 此参数用于绘图;option : 提供了item的风格,比如item的状态,曝光度以及详细的信息:widget : 想画到哪个widget上,如果要画在缓存区上,这个参数 ...

  7. 解决Postman User-Agent 设置失效

    问题: 设置header中的UserAgent选项,抓包以后依然还是默认头信息 test Domain www.baidu.com Iphone6 UserAgent访问效果 User-Agent: ...

  8. WebSocket 的理解

    WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术.依靠这种技术可以实现客户端和服务器端的长连接,双向实时通信. 它的最大特点就是,服务器可以主动向客户端推送信息,客 ...

  9. 自制操作系统Antz(13) 显示图片

    显示图片只是在多媒体课上看着bmp格式图片的突发奇想,然后就实现在了我自己的操作系统 Antz系统更新地址 Linux内核源码分析地址 Github项目地址 效果图: 显示图片的原理 在之前显卡操作时 ...

  10. style1

    <!doctype html> 我的简历 基本信息 姓名 张三 性别 男 应聘职位 WEb前端工程师 联系方式 手机 12312341234 Email joinefe@baidu.com ...