Apache Ignite 插入速度极慢

Apache Ignite inserts extremely slow

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

矩阵是一个包含 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 命令 - 它似乎并没有更快地工作。

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

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

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

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