我想将一个Hbase表复制到另一个性能良好的位置。
中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有什么不便吗?
答案 0 :(得分:2)
问题:你认为最好更好地完成这个副本而不是 从hbase-server使用CopyTable?你看到使用带来的任何不便吗? 这个CopyTable?
First thing is snapshot is better way than CopyTable
.
在版本0.94.6之前,备份或克隆表的唯一方法是使用CopyTable / ExportTable,或者在禁用表后复制HDFS中的所有hfiles。这些方法的缺点是您可以降低区域服务器性能(复制/导出表),或者您需要禁用表,这意味着没有读取或写入;这通常是不可接受的。
另请参阅Snapshots+and+Repeatable+reads+for+HBase+Tables
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方法。