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
    • 逆序
    • 综合多个属性
  • 相关阅读:
    target runtime apache v6.0 not defined解决
    java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;
    The valid characters are defined in RFC 7230 and RFC 3986问题
    invalid END header解决方法
    You have more than one version of ‘org.apache.commons.logging.Log’ visible, which is not allowed问题解决
    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    在eclipse中import java web项目时遇到的一些问题并将该项目通过tomcat发布
    java byte转string 涉及到字节流中有中文
    spring+mybatis框架搭建时遇到Mapped Statements collection does not contain value for...的错误
    试试看读一下Zepto源码
  • 原文地址:https://www.cnblogs.com/windliu/p/8142914.html
Copyright © 2011-2022 走看看