zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Elasticsearch 批量导入数据3

2023-03-31 10:28:48 时间

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

[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

原文地址