HBase:get(...)vs扫描和内存表

卡利优格拮抗剂

我正在通过HBase执行MR。

Reducer中的业务逻辑大量访问两个表,例如T1(40k行)和T2(90k行)。目前,我正在执行以下步骤:

1.在reducer类的构造函数中,执行以下操作:

HBaseCRUD hbaseCRUD = new HBaseCRUD();

HTableInterface t1= hbaseCRUD.getTable("T1",
                            "CF1", null, "C1", "C2");
HTableInterface t2= hbaseCRUD.getTable("T2",
                            "CF1", null, "C1", "C2");

在reduce(...)

 String lowercase = ....;

/* Start : HBase code */
/*
 * TRY using get(...) on the table rather than a
 * Scan!
 */
Scan scan = new Scan();
scan.setStartRow(lowercase.getBytes());
scan.setStopRow(lowercase.getBytes());

/*scan will return a single row*/
ResultScanner resultScanner = t1.getScanner(scan);

for (Result result : resultScanner) {
 /*business logic*/
}

尽管不确定上面的代码是否首先有意义,但我有一个问题-与扫描相比,get(...)是否会提供任何性能优势?

Get get = new Get(lowercase.getBytes());
Result getResult = t1.get(get);

由于T1和T2将是只读的(大多数情况下),因此我认为如果保留在内存中,性能将会提高。根据HBase文档,我将不得不重新创建表T1和T2。请验证我理解的正确性:

public void createTables(String tableName, boolean readOnly,
            boolean blockCacheEnabled, boolean inMemory,
            String... columnFamilyNames) throws IOException {
        // TODO Auto-generated method stub

        HTableDescriptor tableDesc = new HTableDescriptor(tableName);
        /* not sure !!! */
        tableDesc.setReadOnly(readOnly);

        HColumnDescriptor columnFamily = null;

        if (!(columnFamilyNames == null || columnFamilyNames.length == 0)) {

            for (String columnFamilyName : columnFamilyNames) {

                columnFamily = new HColumnDescriptor(columnFamilyName);
                /*
                 * Start : Do these steps ensure that the column
                 * family(actually, the column data) is in-memory???
                 */
                columnFamily.setBlockCacheEnabled(blockCacheEnabled);
                columnFamily.setInMemory(inMemory);
                /*
                 * End : Do these steps ensure that the column family(actually,
                 * the column data) is in-memory???
                 */

                tableDesc.addFamily(columnFamily);
            }
        }

        hbaseAdmin.createTable(tableDesc);
        hbaseAdmin.close();
    }

完成后:

  1. 如何验证列是否在内存中(当然,describe语句和浏览器会反映出来)并从那里访问,而不是从磁盘访问?
  2. 从内存或从磁盘读取对客户端是透明的吗?简单来说,是否需要在我的reducer类中更改HTable访问代码?如果是,会有哪些变化?
塔里克

get(...)会比扫描提供任何性能优势吗?

Get直接对由作为参数传递给Get实例的rowkey标识的特定行进行操作。扫描对所有行进行操作时,如果尚未通过向扫描实例提供开始和结束行键来使用范围查询。显然,如果您事先知道要在哪一行上进行操作,效率会更高。您可以直接去那里进行所需的操作。

如何验证列是否在内存中(当然,describe语句和浏览器会反映出来)并从那里访问,而不是从磁盘访问?

可以使用isInMemory()由设置方法HColumnDescriptor以验证是否一个特定的CF为在内存中或没有。但是,您无法确定整个表都在内存中,以及是从磁盘还是从内存中获取数据。尽管内存块的优先级最高,但是并不能100%始终确保所有内容都在内存中。此处重要的一件事是即使在内存CF中,数据也可以持久保存到磁盘。

从内存或从磁盘读取对客户端是透明的吗?简单来说,是否需要在我的reducer类中更改HTable访问代码?如果是,会有哪些变化?

是。它是完全透明的。您无需执行任何其他操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

mapreduce、hbase 和扫描

来自分类Dev

hbase shell命令-扫描和过滤

来自分类Dev

HBase扫描很慢

来自分类Dev

Java的HBase扫描API

来自分类Dev

无法使用Java Client API在Hbase中扫描表

来自分类Dev

无法使用Java Client API在Hbase中扫描表

来自分类Dev

在Cassandra(Hbase)的内存表(memstore)中对数据进行排序

来自分类Dev

Hbase连接问题和无法创建表

来自分类Dev

将Hbase与Hive集成:注册Hbase表

来自分类Dev

HBase表拆分

来自分类Dev

HBase表拆分

来自分类Dev

HBase表检索数据

来自分类Dev

HBase 表模型

来自分类Dev

Hbase Shell-对扫描结果调用hbase命令

来自分类Dev

HBase的addColumn和setFilter

来自分类Dev

在HBase中使用多个行键过滤器扫描表

来自分类Dev

如何仅基于列值而不考虑列族来扫描HBASE表?

来自分类Dev

HBase-删除表和删除表之间的区别?

来自分类Dev

HBase外壳程序“ OutOfOrderScannerNextException”在扫描器和计数调用上出错

来自分类Dev

HBase扫描的java.lang.NoClassDefFoundError

来自分类Dev

HBase中基于时间戳的扫描?

来自分类Dev

如何在Hbase扫描中跳过行?

来自分类Dev

Hbase扫描与Mapreduce进行即时计算

来自分类Dev

索引扫描,索引查找和表扫描

来自分类Dev

本机mapreduce VS hbase mapreduce

来自分类Dev

本机mapreduce VS hbase mapreduce

来自分类Dev

从HBase中的HDFS导入表

来自分类Dev

在Hive中注册Hbase表

来自分类Dev

如何从Hbase访问Phoenix表