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