zoukankan      html  css  js  c++  java
  • HBase基础知识摘要

    HBASE

    列式存储,设计思想参考BigTable

    文档:http://hbase.apache.org/book.html

    • hive适合数据分析,离线任务
    • hbase大数据实时查询
    • 避免显式锁,提供行原子性操作
    • 每行数据只有一台服务器服务,因此有强一致性

    存储层使用HDFS

    • 按照CF存储,按照Row-key进行关联

    MasterRegion Server

    高可用 容灾

    • Master协调Region Server,负载均衡,分配Region给Region Server
    • Region Server包括多个Region。Client直接连接Region Server
    • Zookeeper 高可用,负责Region和Region Server注册(依赖列表特性)
    
        客户端有上亿条数据时使用
        - rowKey设计很重要,选一个rowKey,使你的数据均匀的分布在集群中 
        - 客户端频繁写一张表时,随机RowKey性能更好
        - 客户端需要频繁读一张表时,有序RowKey性能更好
        - 时间连续的数据,有序RowKey更好
        - Column Family一般不会超过2-3个CF,一般一个就够了
          ,它聚合同一特性的数据
    
    

    安装

    windows环境需要cgyWin,太麻烦了,cgywin挺大的,下载老慢。

    • download stabe hbase version

    • 修改conf/hbase-env.cmd/sh的JAVA_HOME配置

    • 编辑conf/hbase-site.xml配置(本机文件系统,非hdfs系统)

      hbase.rootdir file:///home/testuser/hbase hbase.zookeeper.property.dataDir /home/testuser/zookeeper
    • 启动bin/start-hbase.cmd/sh
    
        create a table:
          create 'test','cf'
        list information:
          list 'test'
        put data:
          put 'test','row1','cf:a','value1'  
        scan table
          scan 'test' 
        get a row:
          get 'test','row1'
    
    

    版本相关

    Hbase 2.0仅支持JDK 8, Hbase 1.x不再支持jAVA 6

    Habase可能会同一时刻打开大量文件,ulimit -n 检查值,使用ulimit -u 确保系统至少配置为10,240

    通过预写日志WAL文件来恢复未flush到磁盘的数据,建议配置足够的WAL文件数,使足够多的数据可以被存储

    自动切分HRegion

    Namespace

    Namespace可以用来管理一组table,功能上类似于RDBS的数据库

    Column Family

    有相同前缀的列,用冒号分隔,如course:historycourse:math都是course列族的

    Data Model Operations

    Get

    
    		public static final byte[] CF = "cf".getBytes();
    		public static final byte[] ATTR = "attr".getBytes();
    		...
    		Get get = new Get(Bytes.toBytes("row1"));
    		Result r = table.get(get);
    		byte[] b = r.getValue(CF, ATTR); 
    

    查询带Version的GET

    
    	public static final byte[] CF = "cf".getBytes();
    	public static final byte[] ATTR = "attr".getBytes();
    	...
    	Get get = new Get(Bytes.toBytes("row1"));
    	get.setMaxVersions(3);  // will return last 3 versions of row
    	Result r = table.get(get);
    	byte[] b = r.getValue(CF, ATTR);  // returns current version of value
    	List<KeyValue> kv = r.getColumn(CF, ATTR);  // returns all versions of this column
    
    
    

    获取某一行Row

    Put

    add new rows或者更新已存在的row,有点像upsert

    
     	隐式version
    	public static final byte[] CF = "cf".getBytes();
    	public static final byte[] ATTR = "attr".getBytes();
    	...
    	Put put = new Put(Bytes.toBytes(row));
    	put.add(CF, ATTR, Bytes.toBytes( data));
    	table.put(put);	
    
    
    	显式version
    	public static final byte[] CF = "cf".getBytes();
    	public static final byte[] ATTR = "attr".getBytes();
    	...
    	Put put = new Put( Bytes.toBytes(row));
    	long explicitTimeInMs = 555;  // just an example
    	put.add(CF, ATTR, explicitTimeInMs, Bytes.toBytes(data));
    	table.put(put);
    
    
    

    Scans

    查询多行row

    
    		//rowKey的规则可以是复合的,相对于rdbms,可以是几个字段合在一起
    		byte[] startRow = Bytes.add(规则1.getBytes(), 规则2.getBytes(), Bytes.toBytes(startTime.getTime()));
     		Scan scan = new Scan();
    		scan.setStartRow(startRow);
    		scan.setStopRow(endRow);
    		scan.addFamily(family);
    		ResultScanner rs = table.getScanner(scan);
    

    Delete

    删除行,并不立即删除数据,而是记标记,等Master来整理时被处理
    http://hadoop-hbase.blogspot.hk/2012/01/scanning-in-hbase.html

    Versions

    A {row, column, version} tuple exactly specifies a cell in HBase
    row和column相同的数据可能有很多,但是他们的version一定不同
    version维度的数据是逆序存储的,所以能更快的找到最新的一条数据

    • Hbase允许多次写操作的对象为同一version,只有最后的那次写可以被获取
    • 写数据时可以不按version的顺序进行写
    • api可以操作获取的versions个数,如Get.setMaxVersions()

    Hbase number of column families

    目前并不能很好的处理列族为2或3的情况,因此尽量保持只有1个列族,除非数据操作总是针对列的,也就是说查询一个列族或另一个列族,但不同时查询两个列族
    原因:

    • 刷新、整理是在一个Region上的,一个列族在刷新时,相邻的列族也会被刷新,即使它们的数据量很少,所以多个列族会存在着很多无效I/O的问题
    • 当CFa有1百万条数据,CFb有10亿条数据时,CFa的数据会被分布在很多,很多的Region上,会导致CFa的查询非常低效

    RowKey设计

    • 在Hbase中,rows是按字典顺序排序的,这样可以优化查询效率,因为相关的rows是挨着的。
    • 拙劣的设计会使Hbase读写存在热点问题,即绝大多数请求指向同一个node或少量的nodes,甚至导致这台region server上的其他region的操作受影响,因为服务器可能过载了(解决办法和ConcurrentHashMap的设计理念相似,分而治之,类似hashcode再rehash)

    解决热点问题

    • salting 通过一定规则产生随机前缀,达到数据更易均匀分布
    • hashing
    • 逆序
    • 综合多个属性
  • 相关阅读:
    常用模块——time模块,datetime模块
    开发目录的规范

    模块
    day17作业
    面向过程编程
    函数递归
    谈谈作为一个菜B的培训感受
    絮叨机房精密空调的制冷剂
    接入机房产生冷凝水
  • 原文地址:https://www.cnblogs.com/windliu/p/8142914.html
Copyright © 2011-2022 走看看