如果可以,请使用批量加载工具。参见批量加载。否则,请注意以下内容。
默认情况下,HBase 中的表最初是使用一个区域创建的。对于批量导入,这意味着所有客户端都将写入同一区域,直到它足够大,可以拆分并在集群中分布。加速批量导入过程的有用模式是预先创建空白区域。在这方面要保守一些,因为太多的地区实际上会降低性能。
使用 HBase API 预创建拆分有两种不同的方法。第一种方法是依赖默认的Admin
策略(在Bytes.split
中实现)...
byte[] startKey = ...; // your lowest key
byte[] endKey = ...; // your highest key
int numberOfRegions = ...; // # of regions to create
admin.createTable(table, startKey, endKey, numberOfRegions);
另一种使用 HBase API 的方法是自己定义分割...
byte[][] splits = ...; // create your own splits
admin.createTable(table, splits);
使用 HBase Shell 可以通过指定拆分选项来创建表,从而实现类似的效果。
# create table with specific split points
hbase>create 't1','f1',SPLITS => ['\x10\x00', '\x20\x00', '\x30\x00', '\x40\x00']
# create table with four regions based on random bytes keys
hbase>create 't2','f1', { NUMREGIONS => 4 , SPLITALGO => 'UniformSplit' }
# create table with five regions based on hex keys
create 't3','f1', { NUMREGIONS => 5, SPLITALGO => 'HexStringSplit' }
有关理解键空间和预创建区域的相关问题,请参阅 RowKeys 和 Region Splits 之间的关系。有关手动预分割区域的讨论,请参见手动区域分割决策。有关使用 HBase Shell 预分割表的更多详细信息,请参见使用 HBase Shell 预分割表。
使用预写日志(WAL)的 Puts 的默认行为是将立即写入WAL
编辑。如果使用延迟日志刷新,则 WAL 编辑将保留在内存中直到刷新周期。好处是聚合和异步WAL
- 写入,但潜在的缺点是如果 RegionServer 发生故障,则尚未刷新的编辑将丢失。然而,这比使用 Puts 完全不使用 WAL 更安全。
可以通过 HTableDescriptor 在表上配置延迟日志刷新。 hbase.regionserver.optionallogflushinterval
的默认值为 1000ms。
经常请求禁用 WAL 以提高 Puts 的性能。这仅适用于批量加载,因为它会在区域服务器崩溃时通过删除 WAL 的保护来使您的数据处于危险之中。在发生崩溃时可以重新运行批量加载,几乎没有数据丢失的风险。
如果禁用 WAL 而不是批量加载,则数据存在风险。
通常,最好使用 WAL for Puts,而使用批量加载技术时,加载吞吐量是一个问题。对于正常的 Puts,您不太可能看到性能改善超过风险。要禁用 WAL,请参阅禁用 WAL 。
除了使用 writeBuffer 之外,通过 RegionServer 对Put
进行分组可以减少每个 writeBuffer flush 的客户端 RPC 调用次数。当前在 MASTER 上有一个实用程序HTableUtil
可以执行此操作,但您可以复制该实用程序,也可以为仍在 0.90.x 或更早版本的版本实现自己的版本。
当从 MR 作业向 HBase 表写入大量数据时(例如,使用 TableOutputFormat ),特别是从 Mapper 发出 Puts 的地方,跳过 Reducer 步骤。当使用 Reducer 步骤时,来自 Mapper 的所有输出(Puts)将被假脱机到磁盘,然后排序/改组到其他很可能是非节点的 Reducers。直接写入 HBase 效率更高。
对于将 HBase 用作源和接收器的摘要作业,写入将来自 Reducer 步骤(例如,汇总值然后写出结果)。这是与上述情况不同的处理问题。
如果所有数据一次写入一个区域,则重新阅读有关处理时间序列数据的部分。
此外,如果您正在预分割区域并且所有数据仍然是 _ 仍然 _ 在单个区域中清理,即使您的密钥没有单调增加,请确认您的密钥空间实际上与分离策略一起使用。区域可能出现“分裂”的原因有多种,但不适用于您的数据。由于 HBase 客户端直接与 RegionServers 通信,因此可以通过 RegionLocator.getRegionLocation 获得。