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


    需求

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

    数据说明

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

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

    背景说明

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

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

    遇到的坑与解决方法

    方案1:dump工具

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

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

    报错如下URI malformed

    1. Mon, 06 Nov 2023 11:59:20 GMT | starting dump
    2. Mon, 06 Nov 2023 11:59:20 GMT | got 100 objects from source file (offset: 0)
    3. Mon, 06 Nov 2023 11:59:20 GMT | Error Emitted => URI malformed
    4. Mon, 06 Nov 2023 11:59:20 GMT | Error Emitted => URI malformed
    5. Mon, 06 Nov 2023 11:59:20 GMT | Total Writes: 0
    6. 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的添加用户的文档。

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

    报错如下

    1. status: 500,
    2. error: {
    3. type: 'not_x_content_exception',
    4. reason: 'not_x_content_exception: Compressor detection can only be called on some xcontent bytes or compressed xcontent bytes'
    5. }

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

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

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

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

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

    方案2:logstash工具

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

    操作步骤如下:

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

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

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

    1. input {
    2. file {
    3. # path => "/u01/isi/data/result/1/baike_info_html_8.jsonl_step2"
    4. # 这里,我是获取指定目录下,全部的文件
    5. path => ["/u01/isi/data/result/2/*"]
    6. start_position => "beginning"
    7. sincedb_path => "/dev/null"
    8. codec => "json"
    9. }
    10. }
    11. filter {
    12. # 这里可以定义其他过滤规则。这里我只要json中的这几个字段。
    13. prune {
    14. whitelist_names => ["id", "url", "content", "title", "lang"]
    15. }
    16. }
    17. output {
    18. elasticsearch {
    19. hosts => "http://localhost:9200"
    20. index => "self_index"
    21. user => "elastic"
    22. password => "abcd%12%34"
    23. document_id => "%{id}"
    24. }
    25. # 这里是调试用的。可以看看json数据是否正确。
    26. # stdout {
    27. # codec => rubydebug
    28. #}
    29. }

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

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

  • 相关阅读:
    python Sqlalchemy
    springcloud
    node写接口之文章的查询接口
    python __init__(构造函数)方法的使用
    力扣 36. 有效的数独 C语言实现
    Docker 仓库与注册表: 构建可靠的容器镜像生态系统
    用Nodejs 实现一个简单的 Redis客户端
    服务器配置Java开发环境(三)之安装mysql
    【muduo源码剖析】Poller/EPollPoller设计分析
    B_QuRT_User_Guide(28)
  • 原文地址:https://blog.csdn.net/star1210644725/article/details/134254334