Пользовательский итератор Accumulo, применяемый во время сканирования и уплотнения

Я реализовал итератор (расширяющий WrappingIterator), который выполняет простую статистическую агрегацию и переписывание ключей и значений. По сути, я начинаю с ключей в этой форме:

key         qualifier:family             value
<id>        <val1>|<val2>:<time_info>    <statistic>

и я выполняю агрегацию по семейству столбцов и переписываю в следующий формат (агрегирование статистики по времени и получение новой статистики)

key         qualifier:family             value
<id>        <val1>:<val2>                <derived-statistics>

Этот пользовательский итератор применяется к таблице только во время сканирования и работает хорошо, но производительность начинает вызывать проблемы. Я думал о следующих подходах к повышению производительности:

1) Есть ли способ применить этот итератор во время уплотнения? Я думаю, что ответ "нет", потому что, если итератор находится в таблице для сканирования, тогда сканирование не будет знать, какой формат данных читается источником итератора (то есть исходные или переписанные строки). Если есть способ сделать это, было бы здорово.

2) Есть ли простой способ просто скопировать таблицу в новую таблицу (с примененным пользовательским итератором), чтобы новая таблица содержала агрегированные данные? Я действительно не хочу начинать работу по сокращению карт...

3) Есть ли другой способ сделать это, на что я должен смотреть?

Спасибо за любые предложения.

1 ответ

Решение

Короткий ответ - да, вы можете сделать это во время уплотнения. Тем не менее, есть некоторые оговорки к этому.

  1. Вероятно, вам следует делать это только при полном основном уплотнении, иначе ваша статистика может объединить данные, которые были удалены.
  2. Ваш итератор должен различать агрегированные и неагрегированные данные. Это можно сделать, изучив структуру ключа. Может быть, вы захотите поместить это в отдельную семью колонок.

Типичный способ сделать что-то подобное с новой таблицей - клонировать таблицу, добавить основной итератор сжатия, а затем запустить полное основное сжатие.

Другой способ сделать это - выполнить MapReduce для ввода из одной таблицы и вывода в другую.

Другие вопросы по тегам