0、业务场景

将ES中某个index的某个字段的所有数据,导出到文件中

1、ES数据导出方法简述

ES数据导出方法,我主要找到了以下几个方面,欢迎大家补充:

  • ES官方API:snapshot and restore module

The snapshot and restore module allows to create snapshots of individual indices or an entire cluster into a remote repository like shared file system, S3, or HDFS. These snapshots are great for backups because they can be restored relatively quickly but they are not archival because they can only be restored to versions of Elasticsearch that can read the index.

   简而言之,是个对ES集群的镜像化以及快速回复的工具。不满足本次需求的针对某个字段输出的要求,所以不再继续看。感兴趣的同学可以查看 Elasticsearch Reference [5.0]» Modules» Snapshot And Restore

  • ES的Java API:

   虽说Java大法是我用的最多的编程语言,但是linux上运行Java脚本实在麻烦。抛出一个Java ES导出文件的链接,感兴趣的同学请自便:elasticsearch使用Java API批量数据导入和导出

  • ES的Python API:

   回归正题,Google搜“elasticsearch导出数据”的第一匹配结果,是一个Python脚本写的,链接是:lein-wang/elasticsearch_migrate

  1. #!/usr/bin/python
  2. #coding:utf-8
  3. '''
  4. Export and Import ElasticSearch Data.
  5. Simple Example At __main__
  6. @author: wgzh159@163.com
  7. @modifier: lzkhit@163.com
  8. @note: uncheck consistency of data, please do it by self
  9. '''
  10.  
  11. import json
  12. import os
  13. import sys
  14. import time
  15. import urllib2
  16.  
  17. reload(sys)
  18. sys.setdefaultencoding('utf-8')
  19.  
  20. class exportEsData():
  21. size = 10000
  22. def __init__(self, url,index,type,target_index):
  23. self.url = url+"/"+index+"/"+type+"/_search"
  24. self.index = index
  25. self.type = type
  26. self.target_index = target_index #替换原有的index
  27. self.file_name = self.target_index+"_"+self.type+".json"
  28. def exportData(self):
  29. print("export data begin...\n")
  30. begin = time.time()
  31. try:
  32. os.remove(self.file_name)
  33. except:
  34. os.mknod(self.file_name)
  35. msg = urllib2.urlopen(self.url).read()
  36. #print(msg)
  37. obj = json.loads(msg)
  38. num = obj["hits"]["total"]
  39. start = 0
  40. end = num/self.size+1 # read size data one bulk
  41. while(start<end):
  42. try:
  43. msg = urllib2.urlopen(self.url+"?from="+str(start*self.size)+"&size="+str(self.size)).read()
  44. self.writeFile(msg)
  45. start=start+1
  46. except urllib2.HTTPError, e:
  47. print 'There was an error with the request'
  48. print e
  49. break
  50. print(start)
  51. print("export data end!!!\n total consuming time:"+str(time.time()-begin)+"s")
  52. def writeFile(self,msg):
  53. obj = json.loads(msg)
  54. vals = obj["hits"]["hits"]
  55. try:
  56. cnt = 0
  57. f = open(self.file_name,"a")
  58. for val in vals:
  59. val_json = val["_source"]["content"]
  60. f.write(str(val_json)+"\n")
  61. cnt += 1
  62. finally:
  63. print(cnt)
  64. f.flush()
  65. f.close()
  66.  
  67. class importEsData():
  68. def __init__(self,url,index,type):
  69. self.url = url
  70. self.index = index
  71. self.type = type
  72. self.file_name = self.index+"_"+self.type+".json"
  73. def importData(self):
  74. print("import data begin...\n")
  75. begin = time.time()
  76. try:
  77. s = os.path.getsize(self.file_name)
  78. f = open(self.file_name,"r")
  79. data = f.read(s)
  80. #此处有坑: 注意bulk操作需要的格式(以\n换行)
  81. self.post(data)
  82. finally:
  83. f.close()
  84. print("import data end!!!\n total consuming time:"+str(time.time()-begin)+"s")
  85. def post(self,data):
  86. print data
  87. print self.url
  88. req = urllib2.Request(self.url,data)
  89. r = urllib2.urlopen(req)
  90. response = r.read()
  91. print response
  92. r.close()
  93.  
  94. if __name__ == '__main__':
  95. '''
  96. Export Data
  97. e.g.
  98. URL index type
  99. exportEsData("http://10.100.142.60:9200","watchdog","mexception").exportData()
  100.  
  101. export file name: watchdog_mexception.json
  102. '''
  103. exportEsData("http://88.88.88.88:9200","mtnews","articles","corpus").exportData()
  104.  
  105. '''
  106. Import Data
  107.  
  108. *import file name:watchdog_test.json (important)
  109. "_" front part represents the elasticsearch index
  110. "_" after part represents the elasticsearch type
  111. e.g.
  112. URL index type
  113. mportEsData("http://10.100.142.60:9200","watchdog","test").importData()
  114. '''
  115. #importEsData("http://10.100.142.60:9200","watchdog","test").importData()
  116. #importEsData("http://127.0.0.1:9200/_bulk","chat","CHAT").importData()
  117. #importEsData("http://127.0.0.1:9200/_bulk","chat","TOPIC").importData()

3、遇到的问题

万事俱备,python run代码后,出现了问题:

  1. "urllib2.HTTPError: HTTP Error 500: Internal Server Error"

而且根据程序中的doc count计数信息,发现不论bulk size如何变(尝试了10/50/100/500/1000/5000/10000),总是卡在了第10000篇文档,然后urllib就抛异常。

同事黄大哥分析原因,可能是以下几个方面:

  • 没有平衡bulk的速率,生产多,超过了消费能力,超过了es服务端的TPS (这里黄大哥按照人生经验建议一个bulk在5~15MB最合适)
  • 系统端问题,需查看日志

首先,通过在while循环里面增加sleep语句并减少bulk size,降低ES的TPS,但是仍然在10000篇文档导出的时候出现了 HTTP STATUS 500 的错误,此法不通。

第二种原因,这时候需登录ES宿主机查看log。

发现log中有如下信息,

  1. Caused by: QueryPhaseExecutionException[Result window is too large, from + size must be less than or equal to: [10000] but was [11000].
    See the scroll api for a more efficient way to request lar ge data sets. This limit can be set by changing the [index.max_result_window]
    index level parameter.]

正如 urllib2中HTTP状态码含义 一文中的

“5XX 回应代码以“5”开头的状态码表示服务器端发现自己出现错误,不能继续执行请求”

确实是服务器端的问题。

4、解决的方法

言归正传,这个问题既然定位了,那么解决方法肯定是有的,参考ES报错Result window is too large问题处理

需要对对应index在配置上,做如下定义:

  1. curl -XPUT http://88.88.88.88:9200/mtnews/_settings -d '{ "index" : { "max_result_window" : 10000000}}'

对log中提示的 index.max_result_window 字段进行修改(默认的为10000)

5、ES学习的经验

  • 发现问题要及时看日志,这样可以节约时间 23333

python urllib2导出elasticsearch数据时 返回 "urllib2.HTTPError: HTTP Error 500: Internal Server Error"的更多相关文章

  1. 在使用pydelicious时出现HTTP Error 500: Internal Server Error的错误的解决方法:

    问题:在学习<集体智慧编程>的过程中,第二章中如果你遇到了pydelicious.PyDeliciousException: HTTP Error 500: Internal Server ...

  2. http 500 Internal Server Error的错误 ajax请求SpringMVC后台中返回500 Internal Server Error

    使用httprequester接口测试能返回数据,但是用ajax返回json格式的时候返回报500Internal Server Error. The server encountered an in ...

  3. 关于python导入数据库excel数据时出现102, b"Incorrect syntax near '.15562'.DB-Lib error message 20018, severity 1的问题总结

    1.对于在使用python导入sqlsever时,出现102, b"Incorrect syntax near '.15562'.DB-Lib error message 20018, se ...

  4. SpringMVC3中返回json字符串时500 Internal Server Error的处理方案

    搭建 Spring3+MyBatis+Rest+BootStrap+JBPM项目环境后,测试发现了一个操蛋的问题.使用Spring MVC的自动类型转换为JSON时,后台数据List/Map获取完全正 ...

  5. SpringCloud项目,接口调用返回http 500 - Internal Server Error的错误

    今天上班的时候,自己正在参与的Spring Cloud项目出现了问题,原本上周五还正常的项目突然所有接口调用都是返回http 500的错误. 项目的状态是在Eureka上可以看到对应微服务是在线状态, ...

  6. spring cloud 调用接口间歇性返回http 500 - Internal Server Error的错误

    查找了各种资料都没找到解决办法,token失效,网络问题,接口服务问题,基础服务问题,都考虑过,但是没能解决,偶尔发现服务器网络配置中存在一个virbr0虚拟网卡,问了下了网管,删除这个对服务并没有影 ...

  7. zuul网管配置其他服务时 HTTP Status 500 – Internal Server Error

    1.这个错误是由三个原因导致的 (1).我在给类的接口命名的时候前面少加了一个/ (2)给zuul配置路由的时候多加了个服务名,serviceId名称就是spring的name,而不是eureka注入 ...

  8. 使用SQLServer2005插入一条数据时返回当前插入数据的ID

    使用SQLServer2005插入一条数据时返回当前插入数据的ID 在执行完插入后 再执行 select @@identity from users 就OK 就是刚才插入的那行的 ID了 补充: @@ ...

  9. 用注解的方式实现Mybatis插入数据时返回自增的主键Id

    一.背景 我们在数据库表设计的时候,一般都会在表中设计一个自增的id作为表的主键.这个id也会关联到其它表的外键. 这就要求往表中插入数据时能返回表的自增id,用这个ID去给关联表的字段赋值.下面讲一 ...

随机推荐

  1. OpenJudge.poj CR2(Enclosure-ceil向上取整)

    0:Enclosure 查看 提交 统计 提问 总时间限制:  1000ms  内存限制:  131072kB 描述 为了防止爆零而加入了一道热身题.大家轻虐- Picks在参加NOI(网上同步赛)时 ...

  2. UITableView Scroll to top 手动设置tableview 滚动到 顶部

    UITableView Scroll to top 手动设置tableview 滚动到 顶部 [mainTableView scrollRectToVisible:CGRectMake(0,0,1,1 ...

  3. Java之架构(0) - 架构之路

    软件架构作为一个概念,体现在技术和业务两个方面. 从技术角度来说:软件架构随着技术的革新不断地更新其内容,软件架构建立于当前技术和一些基本原则的基础之上. 先说一些基本原则: 分层原则:分层是为了降低 ...

  4. Oracle怎么导出存储过程

    Oracle怎么导出存储过程 http://www.myexception.cn/database/1564245.html 导出: 1, 2,点击输出文件,选择要导出文件,选择要导出的目录以及设置导 ...

  5. (一)Solr——简介和安装配置

    1. solr简介 1.1 Solr是什么 Solr是apache的顶级开源项目,它是使用java开发 ,基于lucene的全文检索服务器. Solr和lucene的版本是同步更新的,最新的版本是7. ...

  6. 通过设置标签class值控制标签的显示与隐藏

    需求背景如下: 原项目居民.单位.计量三模块共用一个jsp文件,显示的页面也顺理成章的统一了,幸亏没有调用同一个js,在此基础上要求居民和单位计量的分离,即居民的显示居民的相关信息,单位和计量的显示相 ...

  7. Linux-进程、进程组、作业、会话、控制终端详解

    一.进程 传统上,Unix操作系统下运行的应用程序. 服务器以及其他程序都被称为进程,而Linux也继承了来自unix进程的概念.必须要理解下,程序是指的存储在存储设备上(如磁盘)包含了可执行机器指 ...

  8. C#调用 oracle存储过程

    C#调用oracle 存储过程与调用Sql server存储过程类似,比较简单:直接给出示例: /// <summary> /// 判断物料类型是不是总部管控 /// </summa ...

  9. Node.js搭建本地web服务(转)

    http://www.cnblogs.com/wangfupeng1988/p/4143996.html https://github.com/finderL/webserver

  10. unity, GetComponent<Renderer>().bounds.size vs GetComponent<MeshFilter>().sharedMesh.bounds.size

    GetComponent<MeshFilter>().sharedMesh.bounds.size获得的是未经缩放的大小. GetComponent<Renderer>().b ...