Hbase中Scan数据时的缓存优化以scan 过滤器的使用

2023-05-16

1.缓存优化

在hbase的java api 中,默认在scan 过程中scan.next一次进行一次rpc请求,这导致scan的效率很低,设置scan的缓存优化很有必要

 

1.scan.setBatch(int 10),设置一次next 返回的列数的缓存,针对表中的数据有多列的时候应设置此项.

2.scan.setCaching(10);   十次next,一次rpc请求,通过此项的设置可以减少rpc的请求

2.scan过滤器

过滤器相当于数据库中的where子句,比较的方式有

     1)二进制比较 大于、小于。。。。


new BinaryComparator(Bytes.toBytes("xxx"));  

    2)正则比较   等于或不等于


new RegexStringComparator();  

    3)子串比较   等于或不等于

过滤器是将过滤器代码序列化,通过rpc交给服务端处理,服务端处理完成后返回给客户端

1.RowFilter:行过滤,过滤指定的行


RowFilter filter2 = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,new BinaryComparator(Bytes.toBytes("row097")));  

2.FamilayFilter:列族过滤,返回指定的列族

 

3.QualifierFilter:返回指定的列

 

4.ValueFilter:过滤值

当多个过滤器共同作用时,使用FilterList(parm1 :条件的and 或者or)


/** !AND */
MUST_PASS_ALL,
/** !OR */
MUST_PASS_ONE  
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Test;

import java.io.IOException;
import java.util.List;

public class TestFilter {


    @Test
    public void TestFilter1() throws IOException {
        Configuration cong = HBaseConfiguration.create();
        Connection connection = ConnectionFactory.createConnection(cong);
        TableName tableName = TableName.valueOf("test2:t1");

        Table table = connection.getTable(tableName);




        Scan scan = new Scan();
        scan.setBatch(3);//设置批次返回的列数,对于多列的数据是一个很好的优化
        scan.setCaching(10);//设置返回的行数
       //new  FamilyFilter(, )


        FamilyFilter filter = new FamilyFilter(CompareFilter.CompareOp.EQUAL,new RegexStringComparator("f1"));
     RowFilter filter2 = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,new BinaryComparator(Bytes.toBytes("row097")));
        QualifierFilter name = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("name"));
        FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL, filter,filter2);
       FilterList flist= new FilterList(FilterList.Operator.MUST_PASS_ALL);
        flist.addFilter(name);//多个过滤器是定义的Filterlist可以定义多个,也可同时添加过滤器列表
       flist.addFilter(fl);
//  filterList.addFilter(filter);
//  filterList.addFilter(filter2);
       scan.setFilter(flist);
        ResultScanner scanner = table.getScanner(scan);
        Result next =null;
        while (( next=scanner.next())!=null){
            List<Cell> list = next.listCells();
            for (Cell cell : list) {
                String row = Bytes.toString(cell.getRow());
                String fam =Bytes.toString( CellUtil.cloneFamily(cell));
                String qq =Bytes.toString( CellUtil.cloneQualifier(cell));
                String val = Bytes.toString(CellUtil.cloneValue(cell));
                System.out.println(row+"\t"+fam+"\t"+qq+"\t"+val);
            }

        }


    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hbase中Scan数据时的缓存优化以scan 过滤器的使用 的相关文章

  • Hbase-hadoop集成中datanode、regionserver的作用

    根据我的理解 行被插入到 HBase 表中 并作为区域存储在不同的区域服务器中 因此 区域服务器存储数据 类似地 就 Hadoop 而言 数据存储在 hadoop 集群中的数据节点中 假设我在 Hadoop 1 1 1 之上配置了 HBas
  • 如何像 Hive 表分区一样在 Hbase 表中创建分区

    我们计划从 CDH3 迁移到 CDH4 作为迁移的一部分 我们还计划将 HBASE 引入我们的系统 因为它也会更新数据 在 CDH3 中我们使用 Hive 作为仓库 这里我们遇到了迁移的主要问题 Hive 支持表分区 我们的系统有许多不同模
  • Hbase 和 BigTable 有什么区别?

    谁能告诉我 Apache HBase 数据库和 Bigtable 之间有什么区别 或者它们是相同的吗 如果有的话 哪一个支持关系 如果他们是大搜索者 有什么区别 它们很相似 但又不一样 Bigtable 最初于 2005 年发布 但并未发布
  • 设置HBase、hadoop、hive通过hive访问Hbase的正确方法是什么?

    我在配置和安装 hbase hadoop hive 时遇到问题 到目前为止我在 ubuntu 14 04 3 LTS 的虚拟机上做了什么 像这样安装了jdk和版本jdk1 8 0 60 https askubuntu com questio
  • 将 Jar 文件添加到 WEB-INF/lib [重复]

    这个问题在这里已经有答案了 我是 Eclipse Java 和 Linux 的新手 我搜索这个问题 但没有找到答案 我想编写一个操作 HBase 表的程序 所以我有一些与 HBase 相关的 Jar 文件 在普通的 Java 应用程序中 我
  • 我想扫描大量数据(基于范围的查询),在写入数据时我可以做哪些优化以使扫描变得更快?

    I have billion我要扫描的 hbase 行数million一次行 什么是最好的优化技术我可以尽可能快地进行扫描 我们有类似的问题 我们需要通过键扫描数百万行 为此我们使用了映射缩减技术 对此没有标准的解决方案 因此我们编写了一个
  • 当在HBase中反转Scan时,哪个是startKey,哪个是stopKey?

    我使用的是 HBase 0 98 它允许以相反的顺序进行扫描 这是我的代码 scan new Scan eventTimeKey nowKey scan setCaching 1 setting this to 1 since I only
  • 恢复在 HBase 中的工作原理

    我想实际观察 HBase 中的恢复是如何工作的 我使用了以下代码片段 Put p new Put Bytes toBytes name10 p setWriteAheadLog true p add Bytes toBytes cf Byt
  • 将 1GB 数据加载到 hbase 需要 1 小时

    我想将 1GB 1000 万条记录 的 CSV 文件加载到 Hbase 中 我为它编写了 Map Reduce 程序 我的代码运行良好 但需要 1 小时才能完成 最后一个Reducer 花费了半个多小时的时间 有人可以帮我吗 我的代码如下
  • 在 Java 中连接来自 HBase 的两个结果集?

    是否可以连接从 java 中的 hbase 检索的两个或多个结果集 不 不可能加入 JDBC 结果集 但是 您可以获取它们的结果并手动组合它们 如果它们兼容 如果它们属于同一实体 EDIT 如果您只需要组合两个相同类型的列表 您可以这样做
  • 如何在 Hive 中访问 HBase 表,反之亦然?

    作为一名开发人员 我通过使用以下命令从现有 MySQL 表导入数据 为我们的项目创建了 HBase 表 sqoop job 问题是我们的数据分析师团队熟悉MySQL语法 意味着他们可以查询HIVE轻松上桌 对于他们 我需要在 HIVE 中公
  • 使用 Spark 和 Phoenix 将 CSV 文件保存到 hbase 表

    有人可以向我指出使用 Spark 将 csv 文件保存到 Hbase 表的工作示例吗2 2我尝试过但失败的选项 注意 它们都适用于我的 Spark 1 6 凤凰火花 hbase spark it nerdammer bigdata spar
  • 将 protobuf3 与一些依赖于 Java 中的 protobuf2 的库一起使用

    我使用protobuf3来表示我们的数据 虽然我们需要hbase来存储数据 但似乎hbase依赖于protobuf2 当我编写以下行来创建 hbase 表时 admin createTable desc 然后我得到一个例外 NoClassD
  • security.UserGroupInformation:MR 的 PrivilegedgedActionException 错误

    每当我尝试执行映射缩减作业以写入 Hbase 表时 我都会在控制台中收到以下错误 我正在从用户帐户运行 MR 作业 错误 security UserGroupInformation PriviledgedActionException 为
  • 如何在 HBase 中续订过期的 Kerberos 票证?

    我有一个小型 spring 服务 它提供基本功能 例如从 hbase 表中放入 删除 获取 一切似乎都正常 但有一个问题 启动 Tomcat 服务器 10 小时后 我的 kerberos 票证过期 因此我应该更新它 我尝试对 hbase 使
  • Hbase 列族

    Hbase 文档表示 避免创建超过 2 3 个列族 因为 Hbase 不能很好地处理超过 2 3 个列族 其原因在于压缩和刷新 以及 IO 但是 如果我的所有列总是填充 对于每一行 那么我认为这个推理并不那么重要 因此 考虑到我对列的访问是
  • HBase:创建多个表或包含多个列的单个表?

    什么时候创建多个表而不是创建具有大量列的单个表才有意义 据我了解 表通常只有几个列族 1 2 每个列族可以支持 1000 多个列 当 HBase 似乎在单个表中可能存在大量列时表现良好时 什么时候创建单独的表才有意义 在回答问题本身之前 让
  • 如果 HBase 不是运行在分布式环境中,它还有意义吗?

    我正在构建数据索引 这将需要以形式存储大量三元组 document term weight 我将存储多达几百万个这样的行 目前我正在 MySQL 中将其作为一个简单的表来执行 我将文档和术语标识符存储为字符串值 而不是其他表的外键 我正在重
  • 获取行 HBase 的特定列族中的列

    我正在编写一个应用程序 通过 JSP 显示 HBase 中特定表中的数据 我想获取一行的特定列族中的所有列 有什么办法可以做到这一点吗 public String getColumnsInColumnFamily Result r Stri
  • 在 Amazon EMR 上使用 java 中的 hbase 时遇到问题

    因此 我尝试使用作为 MapReduce 步骤启动的自定义 jar 来查询 Amazon ec2 上的 hbase 集群 我的 jar 在地图函数内 我这样调用 Hbase public void map Text key BytesWri

随机推荐