Hbase CopyTable внутри Java
Я хочу скопировать одну таблицу Hbase в другое место с хорошей производительностью.
Я хотел бы повторно использовать код из CopyTable.java со страницы GitHub Hbase-сервера
Я искал документацию от hbase, но она мне не сильно помогла http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/CopyTable.html
Посмотрев в этом посте stackru: Можно ли вызвать метод main() класса в другом классе в Java
Я думаю, что я могу напрямую назвать его, используя его основной класс.
Вопрос: Как вы думаете, лучше ли сделать эту копию, чем использовать CopyTable с hbase-server? Видите ли вы какие-либо неудобства с использованием этого CopyTable?
1 ответ
Вопрос: Как вы думаете, лучше ли сделать эту копию, чем использовать CopyTable с hbase-server? Видите ли вы какие-либо неудобства с использованием этого CopyTable?
Во-первых, снимок лучше, чем CopyTable
,
- Снимки HBase позволяют сделать снимок таблицы без особого влияния на серверы региона. Операции создания снимков, клонирования и восстановления не включают копирование данных. Кроме того, экспорт снимка в другой кластер не влияет на серверы региона.
До версии 0.94.6 единственным способом резервного копирования или клонирования таблицы является использование CopyTable/ExportTable или копирование всех h-файлов в HDFS после отключения таблицы. Недостатки этих методов заключаются в том, что вы можете снизить производительность сервера региона (копировать / экспортировать таблицу) или отключить таблицу, что означает отсутствие чтения или записи; и это обычно недопустимо.
- Снимок - это не просто переименование, между несколькими операциями, если вы хотите восстановить в одной конкретной точке, тогда это правильный случай для использования: Снимок - это набор метаданных, которые позволяют администратору вернуться к предыдущему состоянию таблицы. Снимок не является копией таблицы; это просто список имен файлов и не копирует данные. Полное восстановление снимка означает, что вы возвращаетесь к предыдущей "схеме таблицы" и возвращаете свои предыдущие данные, теряя все изменения, сделанные с момента создания снимка.
Также см. Снимки + и + Повторяемые + чтения + для + HBase + Таблицы
Другая карта уменьшит путь, чем CopyTable
:
Вы можете реализовать что-то вроде ниже в своем коде, это для автономной программы, где у вас есть задание на запись mapreduce для вставки нескольких записей пут в виде пакета (может быть 100000).
Эта повышенная производительность для автономных вставок в клиент hbase, вы можете попробовать это в mapreduce
public void addMultipleRecordsAtaShot(final ArrayList<Put> puts, final String tableName) throws Exception {
try {
final HTable table = new HTable(HBaseConnection.getHBaseConfiguration(), getTable(tableName));
table.put(puts);
LOG.info("INSERT record[s] " + puts.size() + " to table " + tableName + " OK.");
} catch (final Throwable e) {
e.printStackTrace();
} finally {
LOG.info("Processed ---> " + puts.size());
if (puts != null) {
puts.clear();
}
}
}
наряду с этим вы также можете рассмотреть ниже...
Включить буфер записи с большим значением, чем по умолчанию
1) table.setAutoFlush(false)
2) Установите размер буфера
<property>
<name>hbase.client.write.buffer</name>
<value>20971520</value> // you can double this for better performance 2 x 20971520 = 41943040
</property>
OR
void setWriteBufferSize(long writeBufferSize) throws IOException
Буфер очищается только два раза:
Явный флеш
Использовать flushCommits()
позвоните, чтобы отправить данные на серверы для постоянного хранения.
Неявный флеш
Это срабатывает, когда вы звоните put()
или же setWriteBufferSize()
, Оба вызова сравнивают текущий используемый размер буфера с настроенным лимитом и при необходимости вызывают flushCommits()
метод.
В случае, если весь буфер отключен, настройка setAutoFlush(true)
заставит клиента вызывать метод flush для каждого вызова put()
,