我正在尝试使用Logstash从MySQL导入32m行到Elasticsearch,它可以正常工作,但在达到3,5m时会中断。检查过MySQL,Logstash工作正常,Elasticsearch中的问题请查看日志:

[2018-08-14T23:06:44,299][WARN ][o.e.x.s.a.s.m.NativeRoleMappingStore] [4OtmyM2] Failed to clear cache for realms [[]]
[2018-08-14T23:06:44,345][INFO ][o.e.l.LicenseService     ] [4OtmyM2] license [23fbbbff-0ba9-44f5-be52-7f5a6498dbd1] mode [basic] - valid
[2018-08-14T23:06:44,368][INFO ][o.e.g.GatewayService     ] [4OtmyM2] recovered [1] indices into cluster_state
[2018-08-14T23:06:46,120][INFO ][o.e.c.r.a.AllocationService] [4OtmyM2] Cluster health status changed from [RED] to [YELLOW] (reason: [shards started [[clustername][2]] ...]).
[2018-08-14T23:55:55,780][INFO ][o.e.m.j.JvmGcMonitorService] [4OtmyM2] [gc][2953] overhead, spent [378ms] collecting in the last [1s]

我已将堆大小增加到2GB,但仍然无法处理。用于迁移的配置文件如下:
input {
    jdbc {
        jdbc_connection_string => "jdbc:mysql://localhost:3306/clustername?useCursorFetch=true"
        jdbc_user => "USER"
        jdbc_password => "PSWD"
        jdbc_validate_connection => true
        jdbc_driver_library => "/usr/share/java/mysql-connector-java-5.1.42.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_paging_enabled => "true"
        #jdbc_fetch_size => "50000"
        jdbc_page_size => 100000
        statement => "SELECT * FROM `video` ORDER by `id` ASC LIMIT 100000 OFFSET 3552984"
    }
}

感谢您的任何建议。

最佳答案

您没有提供足够的数据来帮助诊断问题。要正确索引大量数据,您必须真正了解数据是什么,将要占用多少存储空间以及将要使用多少内存。

Elasticsearch不是魔术。如果您要超越简单的概念证明,就必须了解一些事情。当您看到诸如gc开销之类的事情花费大量时间时,您必须假定您没有正确调整Elasticsearch集群的大小。

您需要考虑的事情:

  • 我需要多少个碎片?
  • elasticsearch配置文件5中的默认#可能有效,或者可能太多
    或太少。
  • 分片过多会导致Elasticsearch内存不足。分片太少会导致性能下降。
  • 为了帮助群集恢复,您的碎片不应太大-2 GB至4GB范围内的某个部分应被视为“大”
  • Elasticsearch提供了API,以查看您正在使用的分片以及它们的大小
  • elasticsearch需要多少内存?
  • 对于数据节点,建议的使用量是系统RAM的50%
  • 50%的建议与允许操作系统将其他50%的磁盘缓存用于
  • 有关
  • 如果您正在节点上运行其他内容,则可能需要重新架构或调整性能是否允许
  • 如果您的数据是基于时间序列的,则您可能应该使用时间序列命名的索引(频率是每年/每月/每周/每天,这取决于每天生成的记录数量
  • 您需要多少个节点
  • 如果没有第二个节点,则不能有副本。
  • 如果没有副本,您最终将丢失数据
  • 您需要具有奇数个符合条件的主节点(否则,您可能会陷入集群已分区的裂脑情况)
  • 越多的节点越好-尤其是如果您需要大量碎片
  • 您的数据有多大
  • 您可以通过将字段配置为仅关键字字段来减小大小(即,如果您不需要搜索某些字段,或者只需要基于_all搜索)
  • 每个记录使用多少个字段-更多的字段=每行更多的ram

  • 您还需要考虑很多其他事情,但是作为一般规则,请尝试找出错误的根源所在,即通过生成一些看起来像真实数据的随机数据来从混合中删除SQL Server / logstash。您可以收集适当调整集群大小所需的指标。

    关于mysql - 从MySQL导入海量数据到Elasticsearch,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51854345/

    10-09 07:21
    查看更多