将json数据导入到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即可结束任务。`
`
相关推荐
YH行业报告分析1 小时前
2026电缆铺设设备市场:自动化敷设与电网升级驱动增长
运维·自动化
pengdott2 小时前
Jenkins最新版本2.585修改插件源的方法
jenkins·流水线
ajassi20002 小时前
AI语音智能体开发日记(十八)智能体服务器xiaozhi-esp32-server源码部署指南
运维·服务器·人工智能·ai·ai编程
小此方2 小时前
「插曲:Git」标签管理篇:理解Tag标签、为指定提交打标签、查看标签详情与附注标签
git
‎ദ്ദിᵔ.˛.ᵔ₎2 小时前
linux 进程信号(下)
linux·运维·服务器
Mikko73 小时前
Linux 磁盘满了但 du 找不到?LVM 扩容 df 不变?fstab 写错开不了机?三台真机实测磁盘排查
linux·运维·centos
蓝胖的四次元口袋3 小时前
Jenkins知识梳理(2)
运维·jenkins
yumgpkpm3 小时前
Acceldata ODP 3.3.6.4 vs CDP Private Cloud Base 7.3.2 对比
大数据·运维·服务器·hadoop·华为·zookeeper·hbase
Madison-No73 小时前
多语言聊天大模型--测试报告
linux·git·python·selenium·jmeter·自动化·postman
Liuqy-053 小时前
特殊进程——孤儿、僵尸、守护进程
linux·运维·服务器