【问题标题】:Apache Ignite inserts extremely slowApache Ignite 插入速度极慢
【发布时间】:2019-06-26 18:10:43
【问题描述】:

我正在尝试将一个大型矩阵加载到在 AWS 中运行的 Apache Ignite 主节点中。 EC2 实例有 128GB 内存和 512GB 磁盘空间。

矩阵是一个包含 50,000 列和 15,000 行的 CSV。

加载速度非常慢 - 前 150 个插入批次一起需要 30 多分钟才能工作。我正在使用 Python 瘦客户端

import pandas as pd
import pyignite
from pyignite import Client

client = Client()

client.connect('127.0.0.1', 10800)
print('deleting records...')
client.sql('DELETE FROM full_test_table')
df = pd.read_csv('exon.csv')

col = list(df)
col = col[1:]

names = ', '.join('"' + item + '"' for item in col)
names = 'name, ' + names
#print(names)

for index, row in df.iterrows():
    print('inserting for {0}'.format(str(row[0])))
    row[0] = '\"{0}\"'.format(row[0])

    row[0] = str(index)

    values = ', '.join(str(item) for item in row)
    sql = 'INSERT INTO full_test_table ({0}) VALUES({1})'.format(names, values)
    client.sql(sql)

我想使用 Python 来加载数据,因为我比 Java 更熟悉它。这对我来说似乎太慢了——即使是 PostgreSQL 也可以在几秒钟内完成这些插入。有什么问题?

我也尝试过 CSV 中的 COPY 命令 - 这似乎没有更快的工作。

【问题讨论】:

  • 您的 Ignite 配置是什么?你是如何创建缓存的,它是如何配置的?你在使用持久化吗?
  • 我刚刚使用了 50,000 列的 SQL CREATE TABLE。我正在使用持久性。

标签: python sql ignite in-memory-database key-value-store


【解决方案1】:

从 Ignite 2.7 开始,Python 瘦客户端以及其他瘦客户端使用其中一个服务器节点作为代理 - 通常是您在连接字符串中设置的那个。代理接收来自客户端的所有请求,并在需要时将它们定向到其余服务器。此外,代理将结果集发送回客户端。因此,代理可能是您的情况以及整体网络吞吐量的瓶颈。检查代理服务器没有过度使用 CPU 并且没有任何issues related to garbage collection or memory utilization。 Ignite 2.8 不再需要代理。

无论如何,在 Ignite 中预加载数据的最快方法是使用 IgniteStreaming API。这些还不适用于 Python,但 Java 应用程序非常简单。您可以使用 this example 作为参考,通过键值 API 将您的记录放入流媒体中。

如果您想继续使用 SQL INSERTS,请使用 JDBC 或 ODBC 驱动程序以及 SET STREAMING 命令。

【讨论】:

    【解决方案2】:

    我刚刚从 Java 中尝试过,我可以看到 JDBC 每秒大约 25 次插入。这不是一个非常高的数字,但比您展示的 30 分钟要好得多。也许这是一个 Python 客户端的东西。

    【讨论】:

    • 每秒 25 次插入,每次插入 50,000 个值?
    • 不,每秒 25 次插入。
    • 50,000 列。但是,正如我在其他答案中所解释的那样,这是没用的。
    猜你喜欢
    • 2015-02-07
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多