HBase CRUD Scan

Submitted by Lizhe on Mon, 05/01/2017 - 17:51

scan操作每次使用next()方法获得一行数据都会发送一个RPC请求而不是一次性拿回全部数据

最后要像jdbc一样调用close释放资源

hbase-site.xml 中的 hbase.regionserver.lease.period 属性可以帮助设置超时多久后hbase会释放一个失联的scanner

package hbase.sample;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;

public class TestScan {
    
    static Configuration conf = HBaseConfiguration.create();
    static {
        conf.set("hbase.zookeeper.quorum", "lzvm");
        conf.set("hbase.rootdir","hdfs://lzvm:9000/hbase" );
        conf.set("hbase.zookeeper.quorum", "lzvm");
    }

    public static void main(String[] args) throws IOException {
        
        HTable table = new HTable(conf, "test");
        table.setScannerCaching(10);
    
        Scan scan = new Scan();
        scan.setCaching(10);
        
        ResultScanner scanner = null;
        try {
            scanner = table.getScanner(scan);
            for(Result result : scanner){
                System.out.println(result);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            scanner.close();
            table.close();
        }
        
        
    }

}
 

  

keyvalues={row1/cf:column1/1493569173421/Put/vlen=7/seqid=0}
keyvalues={row2/cf:column2/1493124770456/Put/vlen=5/seqid=0}
keyvalues={row3/cf:column3/1493124770470/Put/vlen=5/seqid=0}
keyvalues={row4/cf:column4/1493124770474/Put/vlen=5/seqid=0}
keyvalues={row5/cf:column5/1493124770479/Put/vlen=5/seqid=0}

如果不想要每次调用next()方法都会生成一个单独的RPC请求必需要使用缓存,即使可以

使用next(int nbRows)方法来获取多条数据实际上不过是在重复的循环调用next()方法

扫描缓存可以在表的层级上打开,只对这个HTable对象生效,也可以只对单独的一个扫描对象打开,这样只对这个scanner对象生效

table.setScannerCaching(10);

scan.setCaching(10);

无论是对scanner对象还是table对象通过代码设置缓存大小,都会覆盖掉通过配置文件设置的默认缓存大小

hbase-site.xml

hbase.client.scanner.caching