Hbase常见问题

1、Hbase热点(数据倾斜)问题,读写请求会集中到某一个RegionServer上

产生热点问题的原因:

1、hbase的中的数据是按照字典序排序的,当大量连续的rowkey集中写在个别的region,各个region之间数据分布不均衡;

2、创建表时没有提前预分区,创建的表默认只有一个region,大量的数据写入当前region

3、创建表已经提前预分区,但是设计的rowkey没有规律可循

解决方案:row三大设计原则

2、Hbase中flush、compact、spilt的用途是什么

Flush(阈值128M)

        当MemStore达到阈值,将Memstore中的数据FlushStorefile

Compact(当数据块达到3块,HMaster触发合并操作)

        compact机制则是flush出来的小文件合并成大的Storefile文件。

        合并文件;清除删除、过期、多余版本的数据;提高读写数据的效率

spilt

        当Region达到阈值(256M),会把过大的Region一分为二(不是均分)。(middleKey

3、Hbase的regionserver挂了如何恢复数据

4、hbase优化

内存优化:垃圾回收优化:CMS, G1(Region);JVM启动:-Xms(1/64) –Xmx(1/4)

Region优化:预分区;禁用major合并,手动合并

客户端优化:批处理

5、Hbase,hive和redis的区别

Hive基于MR程序,将HQL转换为MR执行。效率比较低,不适合实时数据访问

Hbase基于Hadoop数据存储,存储海量数据,而且拥有自己的查询操作

Redis分布式缓存,强调缓存,基于内存,支持数据持久化,支持事务操作

Redis和Hbase都是基于Key-Value存储的

应用场景:

Hive适用于离线的数据分析和清洗,延迟较高。

Hbase延迟较低,接入在线业务使用,提供了高效的数据访问速度。

6、描述Hbase的scan和get功能以及实现的异同

scan扫描数据

/**
     * 通过scan查询数据
     */
    public static void getDataByScanFilter(String tableName) throws IOException {
        Connection conn = connHolder.get();
        Table table = conn.getTable(TableName.valueOf(tableName));

        //创建用于扫描region的对象
        Scan scan = new Scan();

        //设置Filter(较慢)
        //字节数组比较器
        BinaryComparator bc = new BinaryComparator(Bytes.toBytes("1001"));
        //正则表达式比较器
        RegexStringComparator rc = new RegexStringComparator("^\\d{3}$");

        Filter f1 = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,bc);
        Filter f2 = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,rc);
        //设置单个filter
        //scan.setFilter(f1);

        //设置多个fiter
        /**
         *  多个filter之间的逻辑关系,相当于java中的与和或
         *  (AND)
         *  MUST_PASS_ALL,
         *  (OR)
         *  MUST_PASS_ONE
          */

        FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
        filterList.addFilter(f1);
        filterList.addFilter(f2);

        ResultScanner scanner = table.getScanner(scan);

        for (Result result : scanner) {
            for (Cell cell : result.rawCells()) {
                //得到rowkey
                System.out.println("行键:" + Bytes.toString(CellUtil.cloneRow(cell)));
                //得到列族
                System.out.println("列族" + Bytes.toString(CellUtil.cloneFamily(cell)));
                System.out.println("列:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
                System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell)));
            }
        }
        
    }

get获取数据

/**
     * 获取一行数据
     */
    public static void getRow(String tableName, String rowKey) throws IOException{
        Connection conn = connHolder.get();
        Table table = conn.getTable(TableName.valueOf(tableName));
        Get get = new Get(Bytes.toBytes(rowKey));
        //get.setMaxVersions();显示所有版本
        //get.setTimeStamp();显示指定时间戳的版本
        Result result = table.get(get);
        for(Cell cell : result.rawCells()){
            System.out.println("行键:" + Bytes.toString(result.getRow()));
            System.out.println("列族" + Bytes.toString(CellUtil.cloneFamily(cell)));
            System.out.println("列:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
            System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell)));
            System.out.println("时间戳:" + cell.getTimestamp());
        }
    }

7、HBase集群中可以启动多个HMaster吗?这些HMaster可以并行运行吗?

可以同时启动多个Hmaster运行,(高可用状态下可以启动两个Hmaster,但是只能运行一个Hmaster,即只有一个处于活跃状态)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yongfeicao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值