Elasticsearch 批量导入数据

这篇具有很好参考价值的文章主要介绍了Elasticsearch 批量导入数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

**Elasticsearch**是一款非常高效的全文检索引擎。

**Elasticsearch**可以非常方便地进行数据的多维分析,所以大数据分析领域也经常会见到它的身影,生产环境中绝大部分新产生的数据可以通过应用直接导入,但是历史或初始数据可能会需要单独处理,这种情况下可能遇到需要导入大量数据的情况

这里简单分享一下批量导入数据的操作方法与相关基础,还有可能会碰到的问题,详细内容可以参考**官方文档**

Tip:当前的最新版本为Elasticsearch 2.2.0


概要


bulk API

ES提供了一个叫bulkAPI来进行批量操作

它用来在一个API调用中进行大量的索引更新或删除操作,这极大的提升了操作效率


形式

API

API 可以是**/_bulk, /{index}/_bulk, 或 {index}/{type}/_bulk**这三种形式,当索引或类型已经指定后,数据文件中如不明确指定或申明的内容,就会默认使用API中的值

API 以是**/_bulk结尾的,并且跟上如下形式的JSON**数据

数据内容格式

action_and_meta_data

optional_source

action_and_meta_data

optional_source

....
action_and_meta_data

optional_source

**Note:**最后的一行也必须以 结尾

可用方法

可用的操作有**index, create, delete 和 update**:

  • indexcreate得在操作与元数据(action_and_meta_data)之后另起一行然后接上内容(必须遵循这样的格式 ,后面会演示不这么做导致操作失败的示例)
  • delete只用接上元数据就可以了,不必接上内容(原因自不用说,定位到文档就OK了)
  • update得接上要变更的局部数据,也得另起一行

文本指定

由于是批量操作,所以不太会直接使用命令行的方式手动指定,更多的是使用文件,如果使用文本文件,则得遵循如下格式

curl -s -XPOST localhost:9200/_bulk --data-binary "@requests"

Tip:requests是文件名 ,**-s是静默模式,不产生输出,也可以使用> /dev/null**替代


导入数据

尝试不按要求索引数据

[root@es-bulk tmp]# curl localhost:9200/stuff_orders/order_list/903713?pretty
{
  "_index" : "stuff_orders",
  "_type" : "order_list",
  "_id" : "903713",
  "found" : false
}
[root@es-bulk tmp]# cat test.json 
{"index":{"_index":"stuff_orders","_type":"order_list","_id":903713}}{"real_name":"刘备","user_id":48430,"address_province":"上海","address_city":"浦东新区","address_district":null,"address_street":"上海市浦东新区广兰路1弄2号345室","price":30.0,"carriage":6.0,"state":"canceled","created_at":"2013-10-24T09:09:28.000Z","payed_at":null,"goods":["营养早餐:火腿麦满分"],"position":[121.53,31.22],"weight":70.0,"height":172.0,"sex_type":"female","birthday":"1988-01-01"}
[root@es-bulk tmp]# curl -XPOST 'localhost:9200/stuff_orders/_bulk?pretty' --data-binary @test.json
{
  "error" : {
    "root_cause" : [ {
      "type" : "action_request_validation_exception",
      "reason" : "Validation Failed: 1: no requests added;"
    } ],
    "type" : "action_request_validation_exception",
    "reason" : "Validation Failed: 1: no requests added;"
  },
  "status" : 400
}
[root@es-bulk tmp]# curl localhost:9200/stuff_orders/order_list/903713?pretty
{
  "_index" : "stuff_orders",
  "_type" : "order_list",
  "_id" : "903713",
  "found" : false
}
[root@es-bulk tmp]#

产生了报错,并且数据也的确没有加成功,原因是在校验操作请求(action_and_meta_data)时,由于不符合规范,所以报异常

正确导入方法

解决办法是将格式纠正过来,加上换行

[root@es-bulk tmp]# vim test.json 
[root@es-bulk tmp]# cat test.json 
{"index":{"_index":"stuff_orders","_type":"order_list","_id":903713}}
{"real_name":"刘备","user_id":48430,"address_province":"上海","address_city":"浦东新区","address_district":null,"address_street":"上海市浦东新区广兰路1弄2号345室","price":30.0,"carriage":6.0,"state":"canceled","created_at":"2013-10-24T09:09:28.000Z","payed_at":null,"goods":["营养早餐:火腿麦满分"],"position":[121.53,31.22],"weight":70.0,"height":172.0,"sex_type":"female","birthday":"1988-01-01"}
[root@es-bulk tmp]# curl -XPOST 'localhost:9200/stuff_orders/_bulk?pretty' --data-binary @test.json
{
  "took" : 36,
  "errors" : false,
  "items" : [ {
    "index" : {
      "_index" : "stuff_orders",
      "_type" : "order_list",
      "_id" : "903713",
      "_version" : 1,
      "_shards" : {
        "total" : 2,
        "successful" : 1,
        "failed" : 0
      },
      "status" : 201
    }
  } ]
}
[root@es-bulk tmp]# curl localhost:9200/stuff_orders/order_list/903713?pretty
{
  "_index" : "stuff_orders",
  "_type" : "order_list",
  "_id" : "903713",
  "_version" : 1,
  "found" : true,
  "_source":{"real_name":"刘备","user_id":48430,"address_province":"上海","address_city":"浦东新区","address_district":null,"address_street":"上海市浦东新区广兰路1弄2号345室","price":30.0,"carriage":6.0,"state":"canceled","created_at":"2013-10-24T09:09:28.000Z","payed_at":null,"goods":["营养早餐:火腿麦满分"],"position":[121.53,31.22],"weight":70.0,"height":172.0,"sex_type":"female","birthday":"1988-01-01"}
}
[root@es-bulk tmp]# 

**Tip:**当数据量极大时,这样一个个改肯定不方便,这时可以使用sed脚本,能很方便的进行批量修改

[root@es-bulk summary]# sed -ir  's/[}][}][{]/}}
{/' jjjj.json 
[root@es-bulk summary]# less jjjj.json

其实就是匹配到合适的地方加上一个换行


内存不足

基本上只要遵循前面的操作方式,理想情况下都会很顺利地将数据导入ES,但是实现环境中,总会有各种意外,我就遇到了其中一种:内存不足

[root@es-bulk tmp]# time curl -XPOST 'localhost:9200/stuff_orders/_bulk?pretty' --data-binary @es_data.json > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 38  265M    0     0   38  102M      0  43.8M  0:00:06  0:00:02  0:00:04 43.9M
curl: (56) Failure when receiving data from the peer

real	0m5.351s
user	0m0.161s
sys	0m0.919s
[root@es-bulk tmp]#

当时百思不得其解,已经反复确认了数据格式无误,并且随机选取其中一些进行导入测试也没发现问题,但只要整体一导就出问题,而且每次都一样

[root@es-bulk tmp]# free -m 
             total       used       free     shared    buffers     cached
Mem:          3949       3548        400          0          1        196
-/+ buffers/cache:       3349        599
Swap:         3951        237       3714
[root@es-bulk tmp]#

系统内存明明还有多余,但是再看到JAVA内存时,就隐约感觉到了原因

[root@es-bulk tmp]# ps faux | grep elas
root     14479  0.0  0.0 103252   816 pts/1    S+   16:05   0:00          _ grep elas
495      19045  0.2 25.6 3646816 1036220 ?     Sl   Mar07  25:45 /usr/bin/java -Xms256m -Xmx1g -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -Dfile.encoding=UTF-8 -Djna.nosys=true -Des.path.home=/usr/share/elasticsearch -cp /usr/share/elasticsearch/lib/elasticsearch-2.1.1.jar:/usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch start -p /var/run/elasticsearch/elasticsearch.pid -d -Des.default.path.home=/usr/share/elasticsearch -Des.default.path.logs=/var/log/elasticsearch -Des.default.path.data=/var/lib/elasticsearch -Des.default.path.conf=/etc/elasticsearch
[root@es-bulk tmp]#

ES和lucene是使用的JAVA,JAVA的内存分配大小决定了它们的发挥空间,这里的初始内存为256M,这也是大多数情况下的默认配置,但是应对当前的实际数据大小265M时就不够了,虽然官方说会尽量减小使用buffer,但实测下来,系统应该会是首先尽量使用内存,通过导入内存的方式来起到显著加速的效果,但是内存不够时,就直接报错退出了

解决内存不足有两种思路:

  • 1.调整XmsXmx参数,使其适应业务需求,然后重启服务使之生效
  • 2.将原来的数据切小,分批导入

第一种方式,要求停应用和业务,在某些情况下是不具备条件的(得统一协调时间窗口),那么就尝试使用第二种方式,好在text文档的切分也可以使用sed快速完成

[root@es-bulk tmp]# sed  -rn '1,250000p' es_data.json  > es_data1.json
[root@es-bulk tmp]# sed  -rn '250001,500000p' es_data.json  > es_data2.json
[root@es-bulk tmp]# sed  -rn '500001,750000p' es_data.json  > es_data3.json
[root@es-bulk tmp]# sed  -rn '750001,943210p' es_data.json  > es_data4.json
[root@es-bulk tmp]# 
[root@es-bulk tmp]# du -sh es_data*.json
71M	es_data1.json
68M	es_data2.json
71M	es_data3.json
58M	es_data4.json
266M	es_data.json
[root@es-bulk tmp]#
[root@es-bulk tmp]# tail es_data1.json
...
...
[root@es-bulk tmp]# tail es_data2.json
...
...

再依次进行导入,就发现没问题了

[root@es-bulk tmp]# time curl -XPOST 'localhost:9200/stuff_orders/_bulk?pretty' --data-binary @es_data1.json > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  101M  100 30.6M  100 70.3M   981k  2253k  0:00:31  0:00:31 --:--:--     0

real	0m33.308s
user	0m0.100s
sys	0m0.390s
[root@es-bulk tmp]#

命令汇总

  • curl -XPOST 'localhost:9200/stuff_orders/_bulk?pretty' --data-binary @test.json
  • curl localhost:9200/stuff_orders/order_list/903713?pretty
  • sed -ir 's/[}][}][{]/}} {/' jjjj.json
  • less jjjj.json
  • time curl -XPOST 'localhost:9200/stuff_orders/_bulk?pretty' --data-binary @es_data.json > /dev/null
  • free -m
  • ps faux | grep elas
  • sed -rn '1,250000p' es_data.json > es_data1.json
  • sed -rn '250001,500000p' es_data.json > es_data2.json
  • sed -rn '500001,750000p' es_data.json > es_data3.json
  • sed -rn '750001,943210p' es_data.json > es_data4.json
  • du -sh es_data*.json
  • tail es_data1.json
  • time curl -XPOST 'localhost:9200/stuff_orders/_bulk?pretty' --data-binary @es_data1.json > /dev/null

原文地址http://soft.dog/2016/03/15/elasticsearch-bulk/文章来源地址https://www.toymoban.com/news/detail-410356.html

到了这里,关于Elasticsearch 批量导入数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • EasyExcel 批量导入并校验数据

    EasyExcel 批量导入并校验数据 日期形式的字段因为校验需要,提供了String类型的字段,再转换赋值给真正的数据库字段对象,如果不考虑校验问题可直接转换 @ExcelProperty(value = \\\"处罚信息公示日期\\\", index = 5, converter = LocalDateConverter.class) 读取数据后Validation校验,校验通过直接保

    2024年02月08日
    浏览(37)
  • 尚融宝10-Excel数据批量导入

    目录 一、数据字典 (一)、什么是数据字典 (二)、数据字典的设计 二、Excel数据批量导入 (一)后端接口 1、添加依赖 2、创建Excel实体类 3、创建监听器 4、Mapper层批量插入 5、Service层创建监听器实例 6、controller层接受客户端请求 7、添加mapper发布配置 8、Swagger接口测试

    2023年04月10日
    浏览(41)
  • 【前端】批量导入和导出Excel数据

    excel导入功能需要使用npm包 xlsx ,所以需要安装 xlsx 插件,读取和写入都依赖她 vue-element-admin模板提供了一个导入excel数据的文件,我们只需用即可 代码地址: https://github.com/PanJiaChen/vue-element-admin/blob/master/src/components/UploadExcel/index.vue 将vue-element-admin提供的导入功能新建一个组件

    2024年02月09日
    浏览(48)
  • hive使用文件方式批量导入数据

    1. 创建表,确定分隔符,换行符: 2. 编写数据文件: 3. 查看此表所在路径:describe extended 表名; 4. 将本地生成好的数据上传至服务器 5. 将生成的txt文件put进HDFS集群 /hive/warehouse/mdp_uat.db/test : 集群路径,第三部查询到的表路径(提前使用 hadoop fs -ls 查看下路径,确认路径正确

    2024年02月13日
    浏览(41)
  • Excel拼接sql语句,批量导入数据

    如下示例图: 参考链接:excel拼接sql

    2024年02月12日
    浏览(41)
  • MySQL批量导入Excel数据【超详细】

    查看此文章前强烈建议先看这篇文章:Java江湖路 | 专栏目录 今天遇到一个需求,批量更新数据库中全国各地的物流价格,产品经理很贴心的为我做好了数据表格,说是上一个技术也是这么做的,好,压力给到我这边。话不多说,直接上步骤。 1、准备好我们需要导入的excel表

    2024年02月05日
    浏览(53)
  • R语言13-R语言中的数据导入导出和批量导入

    CSV 文件: 使用 read.csv() 函数导入逗号分隔的文本文件。 Excel 文件: 使用 readxl 包中的函数 read_excel() 导入 Excel 文件。 文本文件: 使用 readLines() 函数读取文本文件的内容。 CSV 文件: 使用 write.csv() 函数将数据写入逗号分隔的文件。 Excel 文件: 使用 openxlsx 包中的函数 writ

    2024年02月11日
    浏览(33)
  • postman中级:导入文件数据,批量化参数

    建议阅读对象:已掌握postman的基本使用(参见:postman入门-主界面认识,模拟请求) 本地安装的版本:Postman for Windows Version 10.14.9 文件数据格式: 第一行写下参数名,第二行开始逐行写下各参数值; 若有多个参数,参数间用英文逗号隔开即可; 编码格式设置为UTF-8,否则中

    2024年02月12日
    浏览(48)
  • 微信小程序 -- 数据库数据excel文件批量导入

    一、excel文件批量导入数据到数据库 1.创建node.js函数upload,点击upload右键外部终端中安装类库 2.云函数代码 js代码

    2024年02月12日
    浏览(67)
  • 批量数据导入Neo4j的方式

    Linux版本: Ubuntu Kylin 16.04 Neo4j版本: Neo4j-3.2.7 最常见的数据格式之一是平面文件上的 行和列 。这种电子表格格式被用于各种关系型数据库的导入和导出,所以用这种方式检索现有数据是很容易的。很明显,CSV格式就是这种类型。 Cypher中的 LOAD CSV 命令允许我们指定一个文件

    2023年04月12日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包