java内部的hbase copytable

rsl1atfo  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(269)

我想将一个hbase表复制到另一个性能良好的位置。
我想从hbase服务器github页面重用copytable.java中的代码
我一直在看hbase的文件,但对我帮助不大http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/copytable.html
在看了stackoverflow的这篇文章之后:类的main()方法可以在java中的另一个类中调用吗
我想我可以直接用它的主类来调用它。
问题:您认为这样做比使用hbase服务器的copytable更好吗?你觉得使用这个复印台有什么不便吗?

ldfqzlk8

ldfqzlk81#

问题:您认为这样做比使用hbase服务器的copytable更好吗?你觉得使用这个复印台有什么不便吗?
首先,快照比 CopyTable .
hbase快照允许您对表进行快照,而不会对区域服务器造成太大影响。快照、克隆和恢复操作不涉及数据复制。另外,将快照导出到另一个集群不会对区域服务器产生影响。
在版本0.94.6之前,备份或克隆表的唯一方法是使用copytable/exporttable,或者在禁用表之后复制hdfs中的所有hfiles。这些方法的缺点是,您可能会降低区域服务器的性能(复制/导出表)或需要禁用该表,这意味着没有读或写;这通常是不可接受的。
快照不仅仅是重命名,在多个操作之间如果您想在一个特定点上还原,那么这就是正确的使用方法:快照是一组元数据信息,允许管理员返回到表的先前状态。快照不是表的副本;它只是一个文件名列表,并不复制数据。完整快照还原意味着您将返回到以前的“表架构”,并恢复以前的数据,从而丢失自快照创建以来所做的任何更改。
另外,请参见snapshots+和repeatable+reads+for+hbase+表
快照内部构件

另一种比copytable更简化Map的方法:

您可以在代码中实现如下内容这是一个独立的程序,当您编写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() .

相关问题