Java

时间:2017-01-20 09:31:16

标签: java hadoop hbase

我想将一个Hbase表复制到另一个性能良好的位置。

我想重用Hbase-server github page

中CopyTable.java的代码

我一直在寻找hbase的文件,但它对我帮助不大http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/CopyTable.html

查看stackoverflow的这篇帖子后:Can a main() method of class be invoked in another class in java

我想我可以使用它的主类直接调用它。

问题:您是否认为更好地完成此副本而不是使用来自hbase-server的CopyTable?你觉得使用这个CopyTable有什么不便吗?

1 个答案:

答案 0 :(得分:2)

  

问题:你认为最好更好地完成这个副本而不是   从hbase-server使用CopyTable?你看到使用带来的任何不便吗?   这个CopyTable?

First thing is snapshot is better way than CopyTable.

  • HBase Snapshots允许您拍摄表的快照,而不会对Region Servers产生太大影响。快照,克隆和恢复操作不涉及数据复制。此外,将快照导出到另一个群集不会对区域服务器产生影响。

在版本0.94.6之前,备份或克隆表的唯一方法是使用CopyTable / ExportTable,或者在禁用表后复制HDFS中的所有hfiles。这些方法的缺点是您可以降低区域服务器性能(复制/导出表),或者您需要禁用表,这意味着没有读取或写入;这通常是不可接受的。

另请参阅Snapshots+and+Repeatable+reads+for+HBase+Tables

Snapshot Internals

另一个地图减少的方式比CopyTable

您可以在代码中实现类似下面的内容,这适用于独立程序,其中您编写mapreduce作业以将多个put记录作为批处理插入(可能是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)将强制客户端为put()的每次调用调用flush方法。