Apache Ignite вставляет очень медленно - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь загрузить большую матрицу в главный узел Apache Ignite, работающий в AWS.Экземпляр EC2 имеет 128 ГБ памяти и 512 ГБ дискового пространства.

Матрица представляет собой 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 может взять эти вставки за считанные секунды.В чем проблема?

Я также попробовал команду COPY из CSV - похоже, она не работает быстрее.

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Начиная с Ignite 2.7, тонкий клиент Python, как и другие тонкие клиенты, использует один из узлов сервера в качестве прокси-сервера - обычно тот, который вы задали в строке подключения.Прокси-сервер получает все запросы от клиента и при необходимости направляет их на остальные серверы.Также прокси отправляет наборы результатов обратно клиенту.Таким образом, прокси может быть узким местом в ваших случаях, а также общей пропускной способности сети.Убедитесь, что прокси-сервер не перегружает ЦП и не имеет проблем , связанных со сборкой мусора или использованием памяти .Прокси больше не понадобится в Ignite 2.8.

В любом случае, самый быстрый способ предварительной загрузки данных в Ignite - это использование API-интерфейсов IgniteStreaming.Они еще не доступны для Python, но Java-приложение довольно просто.Вы можете использовать этот пример в качестве справочного материала, поместив свои записи в стример с API-интерфейсами со значениями ключа.

Если вы хотите продолжить использовать SQL INSERTS, используйте драйвер JDBC или ODBCвместе с командой SET STREAMING .

0 голосов
/ 27 июня 2019

Я только что попробовал это с Java, и я вижу около 25 вставок в секунду из JDBC. Это не ужасно большое число, но это намного лучше, чем 30 минут, которые вы показываете. Может быть, это клиент Python.

...