首页 > 其他分享 >将json数据导入到ES集群——解决方案对比&填坑日记

将json数据导入到ES集群——解决方案对比&填坑日记

时间:2023-12-06 10:05:23浏览次数:35  
标签:导入到 20 dump json logstash 填坑 id ES


需求

将写好的json数据。导入到es集群

数据说明

文件JSON数据,一行一个JSON。

{"id":"d2716ae8fba4e026c4bd9445c3f49e2c","lang":"zh","title":"吉美旅馆","content":"吉美..."}
{"id":"d2716ae8fba4e026c4bd9445c3f49e2d","lang":"zh","title":"大话西游","content":"大话西游..."}

背景说明

ES 版本 8.X,开启了密码认证

使用elasticsearchDump 工具把json数据导入到ES集群中。

遇到的坑与解决方法

方案1:dump工具




工具:https://github.com/elasticsearch-dump/elasticsearch-dump



坑1:由于ES密码中有特殊符号。在使用dump工具的时候。命令如下

elasticdump \
  --input=/u01/isi/data/baike_result/1/baike_info_html_9.jsonl_step2 \
  --output="http://elastic:abcd%12%34@localhost:9200/self_index"

报错如下:URI malformed

Mon, 06 Nov 2023 11:59:20 GMT | starting dump
Mon, 06 Nov 2023 11:59:20 GMT | got 100 objects from source file (offset: 0)
Mon, 06 Nov 2023 11:59:20 GMT | Error Emitted => URI malformed
Mon, 06 Nov 2023 11:59:20 GMT | Error Emitted => URI malformed
Mon, 06 Nov 2023 11:59:20 GMT | Total Writes: 0
Mon, 06 Nov 2023 11:59:20 GMT | dump ended with error (get phase) => URIError: URI malformed

导致此问题的原因:因为密码中有特殊符号。

解决方案看这里:elasticsearch - How to solve malformed URI while using elasticdump? - Stack Overflow

方案里边说:需要把密码转ascll码。但是我测了没用,可能是因为百分号导致的。

我的最终解决方案是,在ES中新加了一个用户,不添加特殊符号。这种靠谱一些。但是操作起来,如果不熟悉ES的鉴权,也是很麻烦的。

Security APIs | Elasticsearch Guide [8.10] | Elastic这里是ES的添加用户的文档。

注意先添加权限,再配置角色,在添加用户。权限赋给角色,角色赋给用户。一通操作下来,还是遇到了问题,最终没能执行下去。

报错如下

status: 500,
  error: {
    type: 'not_x_content_exception',
    reason: 'not_x_content_exception: Compressor detection can only be called on some xcontent bytes or compressed xcontent bytes'
  }

问题原因。这里其实是最根本的原因。可以再看看上边的JSON数据。看起来没有问题,但是这种数据无法被dump工具识别。

我把数据改造了一下,如下所示

{"_index":"my_index","_id":"1","_source":{"id":"d2716ae8fba4e026c4bd9445c3f49e2c","lang":"zh","title":"吉美旅馆","content":"吉美..."}}

上边改造后的数据是可以写入的。但是需要做数据改造。也挺麻烦。

elasticdump \
  --input=/u01/isi/data/baike_result/1/temp.json \
  --output=http://elasticinsert:angus123321@localhost:9200/baike_info_test \
  --type=data

方案2:logstash工具

转弯掉头。因为改造数据也挺麻烦。特别是在大批量数据下。我决定使用logstash,第一不用决绝用户密码问题。第二不用处理数据

操作步骤如下:

第一步:下载logstash。下载地址:Logstash 8.8.0 | Elastic

第二步:上传服务器,并解压。

第三步:在解压后的conf目录下。添加一个logstash的配置 logstash-self.conf

input {
  file {
  #  path => "/u01/isi/data/result/1/baike_info_html_8.jsonl_step2"
    # 这里,我是获取指定目录下,全部的文件
    path => ["/u01/isi/data/result/2/*"]
    start_position => "beginning"
    sincedb_path => "/dev/null"
    codec => "json"
  }
}

filter {
  # 这里可以定义其他过滤规则。这里我只要json中的这几个字段。
  prune {
    whitelist_names => ["id", "url", "content", "title", "lang"]
  }
}

output {
  elasticsearch {
    hosts => "http://localhost:9200"
    index => "self_index"
    user => "elastic"
    password => "abcd%12%34"
    document_id => "%{id}"
  }
  # 这里是调试用的。可以看看json数据是否正确。
  # stdout {
  #  codec => rubydebug
  #}
}

第四步:启动开始做数据导入

到解压后的目录中,可以看到bin目录和conf目录。以后台的方式启动任务。日志会打印到当前目录中的 out.log 文件中。
 nohup bin/logstash -f  ./conf/logstash-self.conf   >> out.log &
 
 如果想结束任务。则使用 ps -ef |grep logstash 即可看到任务进程,使用kill -9 任务id即可结束任务。

标签:导入到,20,dump,json,logstash,填坑,id,ES
From: https://blog.51cto.com/u_15812686/8699742

相关文章

  • Http 获取JSON
    packagecom.ls.utils;importjakarta.servlet.http.HttpServletRequest;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.nio.charset.StandardCharsets;/***@authorLartimes*@version1.0*@des......
  • JSON utils 工具类核心方法parseObject , toString实现
    1packagecom.ls.utils;23importjava.lang.reflect.Array;4importjava.lang.reflect.Field;5importjava.util.Arrays;67/**8*@authorLartimes9*@version1.010*@description:JSON工具类11*toJSONString12*parseObject13......
  • c++ json的解析和QT中json的操作
    1.下载jsoncpp源码2.首先建议jsoncpp源码编译成动态库https://www.bilibili.com/video/BV1pb4y1W7ZZhttps://www.bilibili.com/video/BV1Ra4y1e7gL (1)用QT的Cmake工具 (2)用Visualstudio a.工具打开jsoncpp源码,在CMakeLists.txt右键->jsoncpp的CMak......
  • 【虹科干货】关于JSON数据库,你了解多少?
    如何理解JSON数据库?作为NoSQL数据库的一种类型,JSON数据库有哪些优势呢?JSON数据库如何运作,它为应用程序开发者带来了哪些价值呢?文章速览:什么是JSON什么是JSON数据库JSON数据库的显著优势关于JSON数据库的Q&A 一、什么是JSON?首先,我们得明确“JSON”的含义。开发人员在创......
  • 实例讲解Python 解析JSON实现主机管理
    本文分享自华为云社区《Python解析JSON实现主机管理》,作者:LyShark。JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它以易于阅读和编写的文本形式表示数据。JSON是一种独立于编程语言的数据格式,因此在不同的编程语言中都有对应的解析器和生成器。JSON格式的设计......
  • Python 解析JSON实现主机管理
    JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它以易于阅读和编写的文本形式表示数据。JSON是一种独立于编程语言的数据格式,因此在不同的编程语言中都有对应的解析器和生成器。JSON格式的设计目标是易于理解、支持复杂数据结构和具有良好的可扩展性。JSON数据是......
  • daemon.json完整配置
    2023-12-04ubuntu安装好docker后,Docker配置文件默认在/etc/docker/daemon.json修改配置文件/etc/docker/daemon.json,进入/etc/docker目录。查看是否有daemon.json文件,没有则执行如下命令创建。touchdaemon.json刚开始文件是空的,添加文件内容配置如下:{"registry-mirrors......
  • SpringBoot+MybatisPlus 存json读json
    基础环境springboot2.5.3mysql8.0.22fastjson22.0.38主要配置1.返回VO字段添加注解@ApiModelProperty("字段内容")@TableField(typeHandler=JacksonTypeHandler.class)privateList<JSONObject>columnContent;2.返回Mapper中的resultMap中字段添加......
  • JSON
    JSON.stringify和JSON.parseJSON.stringify():作用:用于将JavaScript对象或值转换为JSON字符串语法:JSON.stringify(value[,replacer[,space]])value:要转换为JSON字符串的值replacer(可选):用于控制转换过程的函数或数组space(可选):控制结果字......
  • 后端 Java 对象转 json(不用第三方依赖的拼接方式)
    需求:编写工具类要尽可能不用任意一个jar包依赖,或者尽可能精简原有数据:ArpsParams{actualProduction=[{mouth=2022-07,oilProdDaily=366088.33},{mouth=2022-08,oilProdDaily=380806.78}],predictionSegment=[{mouth=2022-07,oilProdDaily=367832.31},{mouth=2022-0......