首先,python 多线程不能充分利用多核CPU的计算资源(只能共用一个CPU),所以得用多进程。笔者从3.7亿数据的索引,取200多万的数据,从取数据到构造pandas dataframe总共大概用时14秒左右。每个分片用一个进程查询数据,最后拼接出完整的结果。

由于返回的json数据量较大,每次100多万到200多万,如何快速根据json构造pandas 的dataframe是个问题 — 笔者测试过read_json()、json_normalize()、DataFrame(eval(pandas_json))及DataFrame.from_dict(),from_dict()速度最快

转载请注明出处:https://www.cnblogs.com/NaughtyCat/p/how-to-get-all-results-from-es-by-scroll-python-version.html

  • Elasticsearch scroll取数据— python版

源码如下:

def es_scroll(index, min_timestamp, max_timestamp, slice_no):
es = Elasticsearch('http://localhost:9200', timeout = 30, max_retries=10, retry_on_timeout=True)
page = es.search(
index = index,
doc_type = "tls_book",
scroll = '1m',
body={
"slice": {
"id": slice_no,
"max": SLICES
},
"_source": [
"SrcIP"
],
"sort": [
"_doc"
],
"query": {
"range" : {
"@timestamp" : {
"gte" : min_timestamp,
"lte" : max_timestamp,
"boost" : 2.0
}
}
}
},
version = False,
size = 10000)
sid = page['_scroll_id']
scroll_size = page['hits']['total'] # Start scrolling
df = pd.DataFrame()
appended_data = [] while (scroll_size > 0):
frame = pd.DataFrame.from_dict([document['_source'] for document in page["hits"]["hits"]])
appended_data.append(frame)
page = es.scroll(scroll_id = sid, scroll = '1m', request_timeout = 30)
# Update the scroll ID
sid = page['_scroll_id']
# Get the number of results that we returned in the last scroll
scroll_size = len(page['hits']['hits'])
if len(appended_data) > 0:
df = pd.concat(appended_data, ignore_index=True, sort = False)
del appended_data
gc.collect()
es.clear_scroll(body={'scroll_id': sid})
return df

 注:

(1)通过 "_source" 关键字,指定要取的字段,可减少不必要的字段,提高查询速度

(2)官方文档指出,通过 "sort": [ "_doc"] —按照_doc排序,可提高查询效率

(3)根据自己的环境,测试合理的 size ,效率会有数倍的差距。笔者环境(128G, 32核)一次取10000性能最好,网上大多测试,size取2000或者1000似乎较佳

(4)clear_scroll及时清理用完的scroll_id

(5)如果数据量较大,设置超时和重试次数(默认是10秒,否则超时会取不到数据),具体如下

 timeout = 30, max_retries=10, retry_on_timeout=True

(6)Sliced scroll

如果返回的数据量特别大,可通过slice让多个分片独自来处理请求,如下(id从0开始):

            "slice": {
"id": slice_no,
"max": SLICES
},
参考: https://www.elastic.co/guide/en/elasticsearch/reference/5.1/search-request-scroll.html#sliced-scroll
  • python 多进程如何个函数传多个参数

python多进程或者多线程要向调用的函数传递多个参数,需要构造参数元组集合,代码如下(本示例每个进程不同的只有es的slice_id):

def build_parameters(index, min_timestamp, max_timestamp):
parmeters =[]
for num in range(0, SLICES):
tuple_paremeter = (index, min_timestamp, max_timestamp, num)
parmeters.append(tuple_paremeter)
return parmeters
  • python多进程实例

示例使用进程池,及starmap  传递调用的函数及参数 (with相当于try, excepion, finallly的集合,会自动做资源的释放或关闭等)

            with multiprocessing.Pool(processes = SLICES) as pool:
result = pool.starmap(es_scroll, parameters)

然后,拼接返回的dataframe 集合即可构造一个完整的dataframe,如下:

frame = pd.concat(result, ignore_index=True, sort = False)

*******************************************************************************************

精力有限,想法太多,专注做好一件事就行

  • 我只是一个程序猿。5年内把代码写好,技术博客字字推敲,坚持零拷贝和原创
  • 写博客的意义在于打磨文笔,训练逻辑条理性,加深对知识的系统性理解;如果恰好又对别人有点帮助,那真是一件令人开心的事

*******************************************************************************************

												

如何通过Elasticsearch Scroll快速取出数据,构造pandas dataframe — Python多进程实现的更多相关文章

  1. Elasticsearch写入数据的过程是什么样的?以及是如何快速更新索引数据的?

    前言 最近面试过程中遇到问Elasticsearch的问题不少,这次总结一下,然后顺便也了解一下Elasticsearch内部是一个什么样的结构,毕竟总不能就只了解个倒排索引吧.本文标题就是我遇到过的 ...

  2. 使用logstash+elasticsearch+kibana快速搭建日志平台

    日志的分析和监控在系统开发中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有: * 根据关键字查询日志详情 * 监控系统的运行状况 * 统计分析,比如接口的调用次数.执行时间.成功 ...

  3. 转:SQL SERVER数据库中实现快速的数据提取和数据分页

    探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...

  4. logstash+elasticsearch+kibana快速搭建日志平台

    使用logstash+elasticsearch+kibana快速搭建日志平台   日志的分析和监控在系统开发中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有: 根据关键字查询日 ...

  5. Elasticsearch【快速入门】

    前言:毕设项目还要求加了这个做大数据搜索,正好自己也比较感兴趣,就一起来学习学习吧! Elasticsearch 简介 Elasticsearch 是一个分布式.RESTful 风格的搜索和数据分析引 ...

  6. 第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中

    第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中 前面我们讲到的elasticsearch( ...

  7. 四十六 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中

    前面我们讲到的elasticsearch(搜索引擎)操作,如:增.删.改.查等操作都是用的elasticsearch的语言命令,就像sql命令一样,当然elasticsearch官方也提供了一个pyt ...

  8. 【转载】使用logstash+elasticsearch+kibana快速搭建日志平台

    原文链接:http://www.cnblogs.com/buzzlight/p/logstash_elasticsearch_kibana_log.html 日志的分析和监控在系统开发中占非常重要的地 ...

  9. 实际使用Elasticdump工具对Elasticsearch集群进行数据备份和数据还原

    文/朱季谦 目录 一.Elasticdump工具介绍 二.Elasticdump工具安装 三.Elasticdump工具使用 最近在开发当中做了一些涉及到Elasticsearch映射结构及数据导出导 ...

随机推荐

  1. MethodHandle(方法句柄)系列之一:MethodHandle和MethodType

        阅读此文章的作者建议先了解java反射和动态代理.       java7中为间接调用方法引入了新的api,其中最关键的是java.lang.invoke包,即方法句柄.我们可以看成是java ...

  2. Java实现 LeetCode 796 旋转字符串 (水题)

    796. 旋转字符串 给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转 ...

  3. Java实现 LeetCode 583 两个字符串的删除操作(求最长公共子序列问题)

    583. 两个字符串的删除操作 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符. 示例: 输入: " ...

  4. Java实现 LeetCode 557 反转字符串中的单词 III(StringBuilder的翻转和分割)

    557. 反转字符串中的单词 III 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode c ...

  5. Java实现最长回文串

    1 问题描述 给定一个字符串,求它的最长回文子串的长度. 2 解决方案 2.1 中心扩展法 此处,首先枚举出回文串的中心位置,然后,再在该位置上分别向左和向右扩展,记录并更新得到的最长回文串的长度. ...

  6. inotify监听文件

    inotify监听文件并通知 static int inotify_dbfile(const char *spFromRule, const char *spDevFile) { int inotif ...

  7. el-upload配合vue-cropper实现上传图片前裁剪

    需求背景 上传一个封面图,在上传之前需要对图片进行裁剪,上传裁剪之后的图片,类似微信的上传头像. 技术方案 上传肯定是用element的 el-upload 组件实现上传,非常方便,各种钩子函数. 裁 ...

  8. mysql基础-数据类型和sql模式-学习之(三)

    0x01 mysql的两种方向: 开发DBA:数据库设计(E-R关系图).sql开发.内置函数.存储历程(存储过程和存储函数).触发器.时间调度器(event scheduler) 运维----> ...

  9. Linux内核配置编译及基本调试方法

    一.Linux内核配置编译 1. 交叉编译设置:make ARCH=arm CROSS_COMPILE=arm-linux- 注:也可以直接修改顶层Makefile ARCH ?= arm CROSS ...

  10. 一篇文章教会你用Python抓取抖音app热点数据

    今天给大家分享一篇简单的安卓app数据分析及抓取方法.以抖音为例,我们想要抓取抖音的热点榜数据. 要知道,这个数据是没有网页版的,只能从手机端下手. 首先我们要安装charles抓包APP数据,它是一 ...