精华内容
下载资源
问答
  • 关于hbase中scan的一些总结

    万次阅读 2017-11-02 10:58:04
    首先,对于scan来说,哪些会全表扫描,哪些不会全表扫描。... 什么是scanscan是较为底层的也是用的最多的一种获取Hbase中数据的方式,在它的上面还封装了几种基于scan的获取方式的数据,例如snapshotScanMR,TableS

    首先,对于scan来说,哪些会全表扫描,哪些不会全表扫描。

    对于这点,笔者原来有些疑惑,以为只要是对于scan来说,都会全表扫描。最近阅读了一些源码以及和咨询一些大神,稍微总结了下。

                    什么是scan,scan是较为底层的也是用的最多的一种获取Hbase中数据的方式,在它的上面还封装了几种基于scan的获取方式的数据,例如snapshotScanMR,TableScanMR,scanMR。这几中方式都是基于scan,用MR的方式去获取数据,并且对于获取大批量的数据来说,效率都比scan好的多。下文再细说。

             回到最开始的问题。scan可以根据rowkey,cf,column,timestamp,filter来获取方式。在这里优先推荐根据rowkey的方式获取数据,即可以指定startrow和endrow,也可以指定具体的某个行键去获取数据。在源码中也指出了如果具体指定了rowkey,那么会只是扫描那一段的数据。众所周知,hbase底层存储数据是根据rowkey的字典顺序存储数据的,所以如果使用rowkey的方式去查找,scan就可以顺序查找,大大缩短了时间。

    		Rather than specifying a single row, an optional startRow
    	* and stopRow may be defined.  If rows are not specified, the Scanner will
    	* iterate over all rows.
    第二种就是根据timestamp去查找,对于这个时间戳,特别注意的是指的是存入hbase中的时间,在存入时,对应的cell中会记录下来。而不是客户端插入的数据的时间,这里肯定会有一定的使时间偏移,但相差不会很大。对于timestamp的方式来说,它也是只是去扫描对应范围或者对应某个时间戳去获取。

                其他的方式,就是通过全表扫描去查询的。这里就一一说了。

                在用scan查询的时候,有个next()方法,一次默认返回100条数据(或者不超过2m的数据),这不同scan中

    setBatch()方法,这里返回的是给hbase服务器的值而不是返回给客户端的值,怎么做是为了避免在全表扫描的时候
    一次返回太多数据,导致OOM。
         我们知道,对于scan来说,他不是并行执行的。它会先去cacheblock去找对于的数据块。如果没有数据,再去
    hfile和memstore。时间一般情况下都会损失在检索在hfile中。
         对于snapshotScanMR和TableScanMR来说,他通过MR,一个region对应一个mapper,也就是一个scan两者不同的是,
    snapshotScanMR是对于该表的snapshot去做查找,直接查询底层hdfs,而对于TableScanMR来说它对原表去做访问,
    所以它还是会去访问对应的regionServer。这样就清楚了他们的用途了,对于速度来说snapshotScanMR更快,他比较
    适合用于离线数据,而TableScanMR来说比较试用于实时的数据。这两种方式一般都用于要查询大量数据或者OLAP场景中。
     
    
    	






    展开全文
  • 三:利用scan查看同一个cell之前已经put的数据(scan时可以设置是否开启RAW模式,开启RAW模式会返回已添加删除标记但是未实际进行删除的数据) 说明:虽然已经put覆盖了之前同一个cell的数据,但是实际上数据并没有...

    一:查看当前所用表


    二:scan扫描全表数据

    说明:scan全表扫描出来的数据都是目前时间戳最新的数据。


    三:利用scan查看同一个cell之前已经put的数据(scan时可以设置是否开启RAW模式,开启RAW模式会返回已添加删除标记但是未实际进行删除的数据)

    说明:虽然已经put覆盖了之前同一个cell的数据,但是实际上数据并没有进行删除,只是标记删除了,利用RAW模式可以看到。红线的是添加删除标记,但是实际上没有删除的。


    四:get获取某个cell保留的(未添加删除标记)的所有version数据(在describe 表名,查看列族VERSIONS是多少,get就会多少数据(cell的数据大于等于VERSIONS的数量))

    在第三步的scan扫描包括添加删除标记在内的所有数据,可以看到rowkey为1001的b:name有4个,但是第四步观察到b列族的版本是3,因此实际上b:name=wangwu是已经添加删除标记的,所有get便不会出来,get只会出来保留的未添加删除标记的版本,总共有3个,所以会出来最新的3个数据,如图

    这边,VERSIONS最大值只能取得和describe中描述的VERSIONS数一样。

    展开全文
  • Scan scan=new Scan(); excuteScan(scan); } 可以设置setbatch @Test //测试性能 public void test() throws IOException { Scan scan=new Scan(); //Set the maximum number of values to return for

    Scan

    获取全部数据 @Test

    //测试性能
    public void test() throws IOException {
    Scan scan=new Scan();
    excuteScan(scan);
    }
    

    可以设置setbatch

    @Test
        //测试性能
        public void test() throws IOException {
        Scan scan=new Scan();
        //Set the maximum number of values to return for each call to next()
        scan.setBatch(4);
        excuteScan(scan);
        }
    

    源码
    控制的是每次next调用的数量,那继续看next

    /**
       * Set the maximum number of values to return for each call to next()
       * @param batch the maximum number of values
       */
      public Scan setBatch(int batch) {
        if (this.hasFilter() && this.filter.hasFilterRow()) {
          throw new IncompatibleFilterException(
            "Cannot set batch on a scan using a filter" +
            " that returns true for filter.hasFilterRow");
        }
        this.batch = batch;
        return this;
      }
    
    @Override
    public Result next() throws IOException {
      // If the scanner is closed and there's nothing left in the cache, next is a no-op.
      if (cache.size() == 0 && this.closed) {
        return null;
      }
    
      // 缓冲中没有就 RPC 调用读取数据进缓存
      if (cache.size() == 0) {   
            loadCache();
      }
     
      // 缓冲中有直接从缓存中取
      if (cache.size() > 0) {
        return cache.poll();
      }
     
      // if we exhausted this scanner before calling close, write out the scan metrics
      writeScanMetrics();
      return null;
    }
    
    

    每次从缓存 cache 中读,缓存为空则 loadCache , 实际上 cache 是通过一个链表来实现的.

    setBatch() 坑爹的命名,这个实际上是配置获取的列数,假如表有两个列簇 cf,info,每个列簇5个列。这样每行可能有10列了,setBatch() 可以控制每次获取的最大列数,进一步从列级别控制流量。配置建议:当列数很多,数据量大时考虑配置此参数,例如100列每次只获取50列。一般情况可以默认值(-1 不受限)。

    Get

    看几个例子就明白了

     /**
         * 单行获取每次RPC请求值发送一个Get对象中的数据,因为Get对象初始化时需要输入行键,因此可以理解为一个Get对象就代表一行。
         * 一行中可以包含多个列簇或者多个列等信息
         *
         * @throws IOException
         */
        @Test
        //利用get查询数据
        public void testget() throws IOException {
            Get get = new Get("rk000010".getBytes());
            get.setClosestRowBefore(true);
            System.out.println(get);
            //如何从geg对象中获取数据
            //Extracts certain cells from a given row.
            Result result = table.get(get);
            CellScanner cellScanner = result.cellScanner();
            while (cellScanner.advance()) {
    
                Cell cell = cellScanner.current();
                System.out.println(new String(CellUtil.cloneRow(cell)) + "\t" + new String(CellUtil.cloneValue(cell)));
            }
        }
    
    
        @Test
        //利用get查询数据
        public void testget1() throws IOException {
            Get get = new Get("rk000010".getBytes());
            //如何从geg对象中获取数据
            //Extracts certain cells from a given row.
            /**
             * (1)Result对象,在查询得到的结果,每一行数据会被作为一个Result对象,将数据存入到一个Result实例中。
             * 当我们需要获取一行数据时则需要获取该行数据所在的Result对象即可。该对象内部封装了一个KeyValue 对象数组。
             * 在0.98.4以前的本班。result类提供了 raw() 方法去获取整个result对象中的KeyValue数组。
             * 在0.98.4以后,则提供了一个新的节后: rowCells() 方法获取KeyValue对象,不过返回的是KeyValue 对象父类引用
             */
            Result result = table.get(get);
            System.out.println(get.getMaxVersions());
            //Return an cells of a Result as an array of KeyValues WARNING do not use, expensive.
            KeyValue[] kvs = result.raw();
            System.out.println(kvs.length);//4
            for (KeyValue kv : kvs) {
                System.out.println(Bytes.toString(kv.getRow()));
                System.out.println(Bytes.toString(kv.getValue()));
            }
        }
    
    展开全文
  • Hbase中scan类常用方法说明

    千次阅读 2018-07-17 19:54:07
    //Scan类常用方法说明 public static void main(String[] args) throws IOException {  //指定需要的family或column ,如果没有调用任何addFamily或Column,会返回所有的columns;  // scan.addFamily(); ...

     

    //Scan类常用方法说明
    public static void main(String[] args) throws IOException {
    
           //指定需要的family或column ,如果没有调用任何addFamily或Column,会返回所有的columns;
    
           // scan.addFamily();
    
           // scan.addColumn();
    
           // scan.setMaxVersions(); //指定最大的版本个数。如果不带任何参数调用setMaxVersions,表示取所有的版本。如果不掉用setMaxVersions,只会取到最新的版本.
    
           // scan.setTimeRange(); //指定最大的时间戳和最小的时间戳,只有在此范围内的cell才能被获取.
    
           // scan.setTimeStamp(); //指定时间戳
    
           // scan.setFilter(); //指定Filter来过滤掉不需要的信息
    
           // scan.setStartRow(); //指定开始的行。如果不调用,则从表头开始;
    
           // scan.setStopRow(); //指定结束的行(不含此行);
    
           // scan.setBatch(); //指定最多返回的Cell数目。用于防止一行中有过多的数据,导致OutofMemory错误。
    
            
    
           //过滤器
    
           //1、FilterList代表一个过滤器列表
    
           //FilterList.Operator.MUST_PASS_ALL -->and
    
           //FilterList.Operator.MUST_PASS_ONE -->or
    
           //eg、FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ONE);
    
           //2、SingleColumnValueFilter
    
           //3、ColumnPrefixFilter用于指定列名前缀值相等
    
           //4、MultipleColumnPrefixFilter和ColumnPrefixFilter行为差不多,但可以指定多个前缀。
    
           //5、QualifierFilter是基于列名的过滤器。
    
           //6、RowFilter
    
           //7、RegexStringComparator是支持正则表达式的比较器。
    
           //8、SubstringComparator用于检测一个子串是否存在于值中,大小写不敏感。
    
            
    
           HTable table=(HTable) getHTablePool().getTable("tb_stu");
    
           Scan scan=new Scan();
    
           scan.setMaxVersions();
    
           //指定最多返回的Cell数目。用于防止一行中有过多的数据,导致OutofMemory错误。
    
           scan.setBatch(1000);
    
    
    
           //scan.setTimeStamp(NumberUtils.toLong("1370336286283"));
    
           //scan.setTimeRange(NumberUtils.toLong("1370336286283"), NumberUtils.toLong("1370336337163"));
    
           //scan.setStartRow(Bytes.toBytes("quanzhou"));
    
           //scan.setStopRow(Bytes.toBytes("xiamen"));
    
           //scan.addFamily(Bytes.toBytes("info"));
    
           //scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("id"));
    
            
    
           //查询列镞为info,列id值为1的记录
    
           //方法一(单个查询)
    
           // Filter filter = new SingleColumnValueFilter(
    
             //  Bytes.toBytes("info"), Bytes.toBytes("id"), CompareOp.EQUAL, Bytes.toBytes("1"));
    
           // scan.setFilter(filter);
    
            
    
           //方法二(组合查询)
    
           //FilterList filterList=new FilterList();
    
           //Filter filter = new SingleColumnValueFilter(
    
           //    Bytes.toBytes("info"), Bytes.toBytes("id"), CompareOp.EQUAL, Bytes.toBytes("1"));
    
           //filterList.addFilter(filter);
    
           //scan.setFilter(filterList);
    
            
    
           ResultScanner rs = table.getScanner(scan);
    
            
    
           for (Result r : rs) {
    
               for (KeyValue kv : r.raw()) {
    
            System.out.println(String.format("row:%s, family:%s, qualifier:%s, qualifiervalue:%s, timestamp:%s.",
    
                 Bytes.toString(kv.getRow()),
    
                 Bytes.toString(kv.getFamily()),
    
                 Bytes.toString(kv.getQualifier()),
    
                 Bytes.toString(kv.getValue()),
    
                 kv.getTimestamp()));
    
               }
    
           }
    
            
    
           rs.close();
    
       }

     

    展开全文
  • 关于HBase 中Scan扫描的优化(重要)

    千次阅读 2019-01-09 20:04:07
    Hbase只能要么按照主键范围查询,要么全表检索。只能使用这两种查询 1、由于Scan是全表扫描,任何时候,在使用Scan一定要加上StartRowKey和StopRowKey,限定扫描的范围。 3333333_ Filterprefilter 3333333_...
  • HBase 的查询实现只提供两种方式: 1、按指定 RowKey 获取唯一一条记录,get 方法(org.apache.hadoop.hbase.client.Get) Get 的方法处理分两种 : ...2、按指定的条件获取一批记录, scan 方法(org.apache.Hadoop.hbas
  • hbase的java api ,默认在scan 过程中scan.next一次进行一次rpc请求,这导致scan的效率很低,设置scan的缓存优化很有必要   1.scan.setBatch(int 10),设置一次next 返回的列数的缓存,针对表的数据有多列的时候...
  • get: 按照RowKey获取唯一一条记录。get的方法处理分两种:设置了ClosestRowBefore和...scan: 按照指定的条件获取一批记录。 可以通过setCaching和setBatch方法提高速度; 可以通过setStartRow与setEndRow来限定范...
  • 初学耗时:0.5h ... R01 - 999、HBase、实时数据库  ギ 舒适区ゾ || ♂ 累觉无爱 ♀ 一、 独坐池塘如虎踞,绿荫树下养精神。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...
  • 初学耗时:0.5h ... R01 - 999、HBase、实时数据库  ギ 舒适区ゾ || ♂ 累觉无爱 ♀ 一、 彪悍的人生没有放假! - - - - - - - - - - - - - - - - - - - - - - - - - - - - ※ ...
  • HBase shell scan 模糊查询.pdf
  • Hbase查询Scan优化和Row设计策略Hbase查询Scan优化和Row设计策略前言分区号设计时间因素java查询代码总结 Hbase查询Scan优化和Row设计策略 ...startKey和stopKey,scan中我建议必须要设置,限制扫描的...
  • HBase table SCan Data 获取数据

    千次阅读 2016-06-27 14:21:48
    HBase table SCan Data 获取数据 Scan scan = new Scan(); // 设置缓存条数(不是获取的条数) scan.setCaching(100); scan.setFilter(listFilter);//不好用 scan.addFamily(Bytes.toBytes(column...
  • HbaseClient ScansetStartRow()和setStopRo()的使用 这两个函数就是设置scan的起始位置、终止位置(exclusive)。 假设test表存储着如下RowKey: 12Aabb 3aabb Aabb aabb 运行如下代码: Scan scan...
  • HBase shell scan命令filter的使用

    万次阅读 2016-06-29 17:48:35
    hbase shell使用scan命令时,可以使用filter来过滤记录。 这儿说明使用SingleColumnValueFilter来进行过滤的情况。
  • hbase并行scan

    2015-01-15 18:52:51
    hbase自带的scan是串行的,在一个region扫描完了以后,会通过nextScanner方法扫描下一个region. 有没有办法并行的扫描多个region呢?设想了一下,可以利用getRegionLocations得到一个HTable的region info的集合,这样就...
  • HBase-Scan扫描

    2019-01-10 14:33:34
    2 .Scan:类似数据库系统的游标 3.为什么要用Scan: 1.HBase中的存储文件是不可变的,因此不能直接删除。因此有墓碑标记,记录着已删除的信息 2.也不能直接更新,隔了一段时间新写入的数据会刷写到不同的存储文件...
  • hbasescan操作cache,batch属性

    千次阅读 2017-03-29 18:17:33
    使用java操作hbasescan操作代码级别的调用有这么一个api:   ResultScanner result = table.getScanner(scan); 这个 ResultScanner是迭代器,迭代器每一个元素是一个result类  看一下result类的实现,发现...
  • 使用Spark RDD实现HBase分布式scan

    千次阅读 2017-01-22 02:10:23
    使用Spark RDD实现hbase分布式Scan主要思路利用Spark RDD的分布式计算,将一个Scan任务按照自定义的范围切分为小的scan,使用这些RDD实现对scan的并行查询,提高查询效率。核心是手动实现RDD的compute方法与...
  • scala使用HBASEscan方法查询数据

    千次阅读 2019-03-05 16:09:12
    def scanFunc(uuid: String, table: Table): ListBuffer[String] = { var result = new ListBuffer[String] ... val scan = new Scan() val filter = new SingleColumnValueExcludeFilter(Bytes.t...
  • HBase-scan API 通过scan读取表数据

    千次阅读 2014-07-05 18:37:54
    直接贴代码啦 /** * * @param zkIp * @param zkPort * @param tablename * @param startRow 传null扫全表 * @param stopRow 已~结尾 ... public static void scanTable(String zkIp,Stri
  • HbaseClient ScansetStartRow()和setStopRo()的使用 这两个函数就是设置scan的起始位置、终止位置(exclusive)。 假设test表存储着如下RowKey: 12Aabb 3aabb Aabb aabb 运行如下代码: Scan scan = new ...
  • Hbase shell scan命令解析

    万次阅读 2019-01-22 11:06:22
    命名空间是与关系数据库系统的数据库类似的表的逻辑分组。这种抽象为即将出现的多租户相关功能奠定了基础: 配额管理(HBASE-8410) - 限制命名空间可以使用的资源量(即区域,表)。 命名空间安全管理(HBASE...
  • Hbasescan的批量处理setCaching

    千次阅读 2016-03-04 17:57:59
    hbase里面scan的每个next()调用都会为每行数据生成单独的RPC请求 很显然如果一次RPC请求可以获取多方数据,这样效率或者性能方面就更有意义 就有了scan的扫描缓存setCaching(int caching) 但是这个值和服务端的...
  • 0.进入hbase shell ./hbase shell  help  help “get” #查看单独的某个命令的帮助 1. 一般命令 status 查看状态 version 查看版本 2.DDL(数据定义语言Data Definition Language)命令 1. 创建表 create ‘表...
  • HBase Scan命令详解

    千次阅读 2020-09-16 14:24:38
    hbase中scan命令是我们经常使用到的,而filter的作用尤其强大。这里简要的介绍下scan下filter命令的使用. 插入scan命令需要的数据 这里模拟了部分微博评论的数据,然后使用代码插入数据到hbase,代码就不列出来了比较...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,428
精华内容 9,771
关键字:

hbase中的scan