121.1。批量加载

如果可以,请使用批量加载工具。参见批量加载。否则,请注意以下内容。

121.2。表创建:预创建区域

默认情况下,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 预分割表。

121.3。表创建:延迟日志刷新

使用预写日志(WAL)的 Puts 的默认行为是将立即写入WAL编辑。如果使用延迟日志刷新,则 WAL 编辑将保留在内存中直到刷新周期。好处是聚合和异步WAL - 写入,但潜在的缺点是如果 RegionServer 发生故障,则尚未刷新的编辑将丢失。然而,这比使用 Puts 完全不使用 WAL 更安全。

可以通过 HTableDescriptor 在表上配置延迟日志刷新。 hbase.regionserver.optionallogflushinterval的默认值为 1000ms。

121.4。 HBase 客户端:在 Puts 上关闭 WAL

经常请求禁用 WAL 以提高 Puts 的性能。这仅适用于批量加载,因为它会在区域服务器崩溃时通过删除 WAL 的保护来使您的数据处于危险之中。在发生崩溃时可以重新运行批量加载,几乎没有数据丢失的风险。

如果禁用 WAL 而不是批量加载,则数据存在风险。

通常,最好使用 WAL for Puts,而使用批量加载技术时,加载吞吐量是一个问题。对于正常的 Puts,您不太可能看到性能改善超过风险。要禁用 WAL,请参阅禁用 WAL

121.5。 HBase 客户端:GroupServer 放置的组

除了使用 writeBuffer 之外,通过 RegionServer 对Put进行分组可以减少每个 writeBuffer flush 的客户端 RPC 调用次数。当前在 MASTER 上有一个实用程序HTableUtil可以执行此操作,但您可以复制该实用程序,也可以为仍在 0.90.x 或更早版本的版本实现自己的版本。

121.6。 MapReduce:跳过 Reducer

当从 MR 作业向 HBase 表写入大量数据时(例如,使用 TableOutputFormat ),特别是从 Mapper 发出 Puts 的地方,跳过 Reducer 步骤。当使用 Reducer 步骤时,来自 Mapper 的所有输出(Puts)将被假脱机到磁盘,然后排序/改组到其他很可能是非节点的 Reducers。直接写入 HBase 效率更高。

对于将 HBase 用作源和接收器的摘要作业,写入将来自 Reducer 步骤(例如,汇总值然后写出结果)。这是与上述情况不同的处理问题。

121.7。反模式:一个热点区域

如果所有数据一次写入一个区域,则重新阅读有关处理时间序列数据的部分。

此外,如果您正在预分割区域并且所有数据仍然是 _ 仍然 _ 在单个区域中清理,即使您的密钥没有单调增加,请确认您的密钥空间实际上与分离策略一起使用。区域可能出现“分裂”的原因有多种,但不适用于您的数据。由于 HBase 客户端直接与 RegionServers 通信,因此可以通过 RegionLocator.getRegionLocation 获得。

参见表创建:预创建区域,以及 HBase 配置