ElasticSearch(十二)——无文档ID的Json文件批量导入(Java/Python)

现在有这么一个需求:
近1T的JSON文件,每份文件的字段不一定完全相同。
【大约5亿条数据,测试了下,在设置为
"number_of_shards": 5,
"number_of_replicas": 2
】时,140万条数据耗时9分40秒,太差劲了。TODO:优化
对于一个索引来说,number_of_shards只能设置一次,而number_of_replicas可以使用索引更新设置API在任何时候被增加或者减少。

1.最初的思路是:
- 先直接使用_bulk API导入ES,
- 借鉴自动导入的mapping,修改mapping
- 再次导入

2.结果使用_bulk API导入ES时报错:
curl -H 'Content-Type: application/x-ndjson' -XPOST '172.21.******:9200/mapper_/automatic_/_bulk?pretty' --data-binary @mag_papers_0.json

 "type" : "illegal_argument_exception",
    "reason" : "Malformed action/metadata line [1], expected START_OBJECT or END                                                                                                                _OBJECT but found [VALUE_STRING]"
  },
  "status" : 400

错误原因:
_bulk API导入ES的JSON文件需要满足一定的格式,每条记录之前,需要有文档ID且每一行\n结束
这里写图片描述
这里有相同问题的讨论
大致讨论结果,两条思路:

  • 使用logstash
  • 老实加上ID

暂时采用老实加ID方法:

先导部分数据,查看使用自动生成mapping

public class JsonToES {
    private static final Logger LOGGER = LoggerFactory.getLogger(OpenClose.class);

    public void jsonToES(File[] files) {
        Map<String, Object> hashMap = EsPropertiesUtils.getConf();
        TransportClient client = OpenClose.getInstance(hashMap);
        int idNum = 0;
        for (File f : files) {
            // 一、绝对路径读取文件
            System.out.println(f.getAbsolutePath());
     
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值