Apache Hbase очень медленно выбирает случайные строки - PullRequest
0 голосов
/ 28 июня 2019

Я использую Apache Hbase на AWS EMR.У меня есть мастер-экземпляр с 32 ядрами и 244 ГБ памяти, а также 3 подчиненных экземпляра с 16 ядрами и 122 ГБ памяти.Я храню большую матрицу целых чисел с 15 000 строк и 50 000 столбцов.Количество рядов скоро достигнет 2 миллионов.

Мой вариант использования - возможность выбрать 500 строк и 30 столбцов случайным образом менее чем за 1 секунду.Поскольку Hbase рекламируется как производительный в «миллионах столбцов» и «миллиардах строк», я подумал, что это будет хорошим вариантом использования.

Нет шаблона доступа к моим строкам и столбцам, любые 500 строк и любые другие30 столбцов могут быть доступны в любое время, и каждый запрос должен возвращаться менее чем за секунду.Сейчас мои запросы возвращаются примерно через 5 секунд, что слишком медленно.

Я включил BLOOM_FILTER = ROWCOL и также уменьшил размер блока до 8 КБ, что дало мне небольшоеповышение производительности, но не очень.

Мой код для создания таблицы здесь:

import happybase
import pandas as pd

print('reading csv...')
df = pd.read_csv('exon.csv')
print('connecting to hbase...')
connection = happybase.Connection(host='localhost', port=9090)

familes = {
    's': dict(in_memory=True)
}

print('deleting table...')
connection.delete_table('exon', disable=True)
print('creating table...')
connection.create_table('exon', familes)

table = connection.table('exon')

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

with table.batch(batch_size=100) as b:
    for index, row in df.iterrows():
        to_put = {}
        for col_name in col:
            to_put[('s:'+ col_name).encode('utf-8')] = str(row[col_name]).encode('utf-8')
        print('putting: ' + str(row[0]))
        b.put(row[0].encode('utf-8'), to_put)

А мой код для извлечения данных с 500 случайными строками и 30 случайными столбцами здесь:

import happybase
import time
import random
import pandas as pd

print('reading csv...')
col_df = pd.read_csv('exon.csv', nrows=1)
row_df = pd.read_csv('exon.csv', nrows=1500, usecols=[0])
print('connecting to hbase...')
connection = happybase.Connection(host='localhost', port=9090)

rows = row_df.iloc[:,0].tolist()
rows_to_get = [i.encode('utf-8') for i in random.sample(rows, 500)]

table = connection.table('exon')

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

cols_to_get = ['s:{0}'.format(i).encode('utf-8') for i in random.sample(col, 30)]

start = time.time()
row = table.rows(rows_to_get, columns=cols_to_get)
elapsed = time.time() - start
print(row)
print('Elapsed: ' + str(elapsed))

Мне интересно, может ли это быть проблема с дисковым пространством при том, как AWS предоставляет тома:

Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        121G   88K  121G   1% /dev
tmpfs           121G     0  121G   0% /dev/shm
/dev/xvda1      9.8G  7.3G  2.4G  76% /
/dev/xvdb1      5.0G   68M  5.0G   2% /emr
/dev/xvdb2      123G  1.2G  122G   1% /mnt
/dev/xvdc       128G  168M  128G   1% /mnt1
/dev/xvdd       128G  168M  128G   1% /mnt2
/dev/xvde       128G  168M  128G   1% /mnt3

Мои ключи строк - это длинные строки, которые выглядят так: 'F1S4_160721_097_D01'.Имена моих столбцов - целые числа до 9 цифр.

Все мои столбцы принадлежат к одному семейству столбцов.

Может ли сокращение имени ключа строки потенциально ускорить доступ к данным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...