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(),

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