如何追踪弹性搜索批量导入失败的原因?

时间:2015-10-22 00:48:20

标签: javascript node.js elasticsearch

我目前正在尝试将超过600,000个文档导入我的弹性搜索服务器。

我可以使用javascript客户端导入10,000个产品而没有任何问题,但是对于所有这些产品,我遇到了这个问题。

ELASTIC_HOST="hostname:9200" node import.js --trace_debug_json=true
buffer.js:382
    throw new Error('toString failed');
    ^

Error: toString failed
    at Buffer.toString (buffer.js:382:11)
    at Object.fs.readFileSync (fs.js:461:33)
    at Object.Module._extensions..js (module.js:441:20)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:311:12)
    at Function.Module.runMain (module.js:467:10)
    at startup (node.js:134:18)
    at node.js:961:3

import.js是这样组成的。截断,因为它总共1281687行。

if (!process.env.ELASTIC_HOST) throw new Error('set ELASTIC_HOST (example: "127.0.0.1:9200")');
var elasticsearch = require('elasticsearch');
var client = new elasticsearch.Client({host: process.env.ELASTIC_HOST ,log:'trace'});
client.bulk({body: [
  { index: { _index: 'products', _type: 'product', _id: 12800223350 } },
  { slug: '12800223350', mfrCatNum: "945R4", name: "Heavy Duty Battery", fulltechDesc: "1 Cell; 6 V; Connection Type Screw Terminal; Used For Lantern; Heavy Duty", invoiceDescription: "6V HD Lantern Battery" , twokDesc: "1 Cell; 6 V; Connection Type Screw Terminal; Used For Lantern; Heavy Duty" },

  /* more documents here */

  { index: { _index: 'products', _type: 'product', _id: 754473940287 } },
  { slug: '754473940287', mfrCatNum: "B30-R10000-KB-16", name: "Heavy-Duty Print Ribbon", fulltechDesc: "Print Ribn", mfrDescription: "B30 Series Heavy-Duty Print Ribbon - Black/Blue", invoiceDescription: "Print Ribn" },
]}, function(err, resp) {
  console.log(err);
});

如何跟踪错误的来源,以便我可以上传所有文档,以便我可以根据当前需求实际评估elasticsearch?

1 个答案:

答案 0 :(得分:2)

您正在尝试一个错误,告诉您您正在尝试将过多的数据存储到缓冲区中(间接通过您的大量批量调用,当然,因为JS客户端会将批量数组连接到一个巨大的字符串缓冲区。如果内存服务,最大缓冲区大小为256MB,所以如果你有600K文件,你可能超过了这个限制。

我建议将您的通话分成几个电话......浏览您的数据,您可以在两个电话中执行此操作,可能是三个。试一试,让我们知道它是怎么回事。