Apache Ignite插入非常慢



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

矩阵是一个CSV,具有50,000列和15,000行。

加载非常慢 - 前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的复制命令 - 似乎无法更快地工作。

从IGNITE 2.7开始,Python Thin Client以及其他薄客户端,将服务器节点之一用作代理 - 通常是您在连接字符串中设置的一个。代理接收客户端的所有请求,并在需要时将其引导到其余服务器。此外,代理将结果集发送回客户端。因此,代理在您的情况下可能是瓶颈以及整体网络吞吐量。检查代理服务器是否不会过度利用CPU,并且没有与垃圾收集或内存利用率有关的任何问题。Ignite 2.8不再需要代理。

无论如何,预定数据的最快方法是使用Ingitestreaming API。这些都不适合Python,但是Java应用程序非常简单。您可以通过将记录放入键值API中来使用此示例作为参考。

如果您想继续使用SQL插入物,则将JDBC或ODBC驱动程序与SET Streaming命令一起使用。

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

最新更新