hbase笔记1
hbase是什么
hbase是apache hadoop中的一个子项目,hbase依托于hadoop的hdfs作为最基本存储基础单元,通过使用hadoop的DFS工具就可以看到这些数据存储文件夹的结构,还可以通过map/reduce的框架(计算)对hbase进行操作。
为什么采用hbase?
hbase不同于一般的关系数据库,它是一个适合于非结构话数据存储的数据库,所谓非结构化存储就是说hbase是基于列的而不是基于行的模式,这样方便读写你的大数据内容。
hbase是介于map entry(key &value)和db row之间的一种数据存储方式,有点类似于现在流行的memcache,但不仅仅是简单的一个key对应一个value,你很可能需要存储多个属性的数据结构,但没有传统数据库表中那么多的关联关系,这就是所谓的松散数据。
简单来说,你在hbase中的表擦混个就的可以看做是一张很大的表,而这个表的属性可以根据需求去动态增加,在hbase中没有表与表之间关联查询,你只需要告诉你的数据存储到hbase的那个column famillies就可以了,不需要指定它的具体类型:char,varchar,int,text等等,但是你需要注意hbase中不包含事物此类的功能。
apache hbase和google bigtable有非常相似的地方,一个数据行拥有一个可选择的键和任意数量的列,表是疏松的存储的,因此用户可以给行定义各种不同的列,对于这样的功能在大项目中非常实用,可以简化设计和升级的成本。
apache hadoop包含的产品如下:
pig是在mapreduce上构建的查询语言(sql-like),适用于大量并行计算。
chukwa是基于Hadoop集群中监控系统,简单来说就是一个看门狗(watchdog).
hive是datawarehouse和map reduce交集,适用于etl方面的工作。
hbase是一个面向列的分布式数据库。
map reduce是google提出的一种算法,用于超大型数据集的并行运算。
hdfs可以支持级的大型分布式数据库。
zookeeper提供的功能包括:配置维护,名字服务,分布式同步,组服务等,用于分布式系统的可靠协调系统。
avro是一个数据序列化系统,设计用于支持大批量数据交换的应用。
什么是列存储?
列存储不同于传统的关系型数据库,其数据在表中是按行存储的,列方式所带来的重要好处之一就是,由于查询中的选择规则是通过定义列来定义的,因此整个数据库是自动索引化的,按列存储每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读盘的数据量,一个字段的数据聚集存储,那么更容易为这宗聚集存储设计更好的压缩/解压算法,
hbase的一些内部实现原理
hmaster---hbase中仅有的一个master server.
hregionserver-----负责多个hregion使之能向client端提供服务,在hbase cluster中会存在多个hregionserver.
servermanager ----负责管理region server信息,如每个region server的hserverinfo(这个对象保护hserveraddress和startcode),已load region个数,死亡的region server列表。
regionmanager----负责将region分配到region server的具体工作,还监视root和meta这2个系统级的region状态。
rootscannser------定期扫描root region,以发现没有分配的meta region
metascanner--------定期扫描meta region,以发现没有分配的user region.
hbase基本命令
下面我们看看hbase的一些基本操作命令,列几个常用的hbase shell命令,如下:
创建表:create '表名称','列名称1','列名称2','列名称N'
添加记录:put '表名称','行名称','列名称','值'
查看记录:get '表名称','行名称'
查看表中的记录总数:count '表名称'
删除记录:delete '表名','行名称','列名称'
删除一张表: 先要屏蔽该表,才能对该表进行删除,第一步 dsable'表名称' 第二步drop '表名称'
查看所有记录: scan '表名称'
更新记录 :就是重写一遍进行覆盖。
使用Java API对hbase进行交互操作的API
Hbasefiguration cfg=null;
Configuration hbase_config =new Configuration();
hbase_config.set("hbase.zookeeper.quorum",'192.167.2.3");
hbase_config.set("hbase.zookeeper.property.clientPort","2181");
cfg = new HBaseConfiguration(hbase_config);
创建表操作
HBaseAdmin admin = new HBaseAdmin(cfg);
admin.tableExists(tablename);//检查表是否存在
HTableDescriptor tableDesc = new HTableDescriptor(tablename);
tableDesc.addFamily(new HColumnDescriptor("name:"))0=);
admin.createTable(tableDesc);
Hbase运行参数说明,在hbase/conf/hbase-default.xml配置文件中。
hbase.client.write.buffer
描述:这个参数可以设置写入数据缓冲区的大小,当客户端和服务器端传输数据,服务器为了提供系统运行系统内开辟了一个写的缓冲区来处理它,这个参数设置的大了,将会对系统的内存有一定的要求,直接影响系统的性能。
hbase.master.meta.thread.rescanfrequerncy
描述:多长时间HMaster对系统表root和meta扫描一次,这个参数可以设置的长一些,降低系统的能耗。
hbase.regionserver.handler.count
描述:由于hbase/hadoop的server是采用multiplexed,non-blocking I/O方式而设计的,所以它可以透过一个Thread来完成处理,但是由于处理client端所呼叫的方法是Blocking I/O,所以它的设计会将client所传递过来的物件先放置在Query,并在启动server时就先产生一堆handler(Thread),该Handler会透过Polling的方式来取得该物件并执行对应的方法,默认为25,根据实际场景可以设置大一些。
hbase.regionserver.thread.splitcompactcheckfrequency
描述:这个参数是表示多久去RegionServer服务器运行一次split/compaction的时间间隔,当然split之前会先进行一个compact操作,这个compact操作可能是minor compact也可能是major 。compact.compact后,会从所有的store下的所有storeFile文件最大的那个取midkey,这个midkey可能并不处于全部数据的mid中,一个row-key的下面的数据可能会跨不同的HRegion.
hbase.hregion.max.filesize
描述:hregion中的hstorefile最大值,任何表中的列族一旦超过这个大小将会被切分,而hstorefile的默认大小是256M.
hfile.block.cache.size
描述:指定hfile/storefile缓存在JVM堆中分配的百分比,默认值是0.2,意思就是20%,而如果你设置成0,就表示屏蔽该项。
hbase.zookeeper.property.maxClientCnxns
描述:这项配置的选项就是从zookeeper中来的,表示Zookeeper客户端同时访问的并发连接数,Zookeeper对于HBase来说就是一个入口,这个参数的值可以适当放大些。
hbase.regionserver.global.memstore.upperLimit
描述:在Region Server中所有memstores占用堆的大小参数配置,默认值是0.4,表示40%,如果设置为0,就是对该项屏蔽。
hbase中log4j的日志
HBase中日志输出等级默认状态下是把debug,info级别的日志打开的,可以根据自己的需要调整log级别,HBase的log4j日志配置文件在hbase/conf/log4j.properties目录下。
在HBase中创建的一张表可以分布在多个Hregion,也就说一张表可以被拆分成多块,每一块称为一个Hregion,每个Hregion会保存在一个表里面某些连续的数据,用户创建的那个大表中的每个Hregion块是由Hregion服务器维护,访问Hregion快要通过Hregion服务器,而一个Hregion快对应一个Hregion服务器,一张完整的表可以保存在多个Hregion上,HRegion Server与Region的对应关系是一对多的关系,每一个Hregion在物理上会被分为三个部分,Hmemcache(缓冲),Hlog(日志),HStore(持久层)。
HBase读数据
HBase读取数据有限读取HMemcache中的内容,如果未取到再去读取HStore中的数据,提高数据读取的性能。
HBase写数据
HBase写入数据会写到HMemcache和Hlog中,HMemcache建立缓冲,Hlog同步Hmencache和Hstore的事物日志,发起Flush Cache时,数据持久化到Hstore中,并清空HMemecache。
客户端访问这些数据的时候通过Hmaster,每个Hregion服务器都会和Hmaster服务器保持一个长连接,Hmaster是HBase分布式系统中的管理者,他的主要任务就是告诉每个Hregion服务器它要维护哪些Hregion,用户的这些数据都可以保存在hadoop分布式文件系统上。
HBase主要部件
1,HBaseMaster
2,HRegionServer
3,HBase Client
4,HBase Thrift Server
5,HBase REST Server
HBaseMaster
HMaster负责给HRegionServer分配区域,并且负责对集群环境中的HReginServer进行负载均衡,HMaster还负责监控集群环境中的HRegionServer的运行状态,如果某一台HRegionServer down机,HBaseMaster将会把不可用的HReginServer来提供服务的hlog和表进行重新分配转交给其他HReginServer来提供, HBaseMaster还负责对数据和表进行管理,处理表结构和表中数据的变更,因为在META系统表中存储了所有的相关表信息,并且HMaster实现了Zookeeper的Watcher接口可以和zookeeper集群交互。
HRegionServer
HReginServer负责处理用户的读和写的操作,HReginServer通过与HBaseMaster通信获取自己需要服务的数据表。并向HMaster反馈自己的运行状态,当一个写的请求到来的时候,它首先会写到一个叫做HLog的writer-ahead log中。HLog 被缓冲在内存中,称为Memcache.每一个HStore只有有一个Memcache,当Memcache到达配置的大小以后,就会创建一个MapFile,将其写到磁盘中去,这将减少HReginServer的内存压力,当一起读取的请求到来的时候,HReginServer会先在Memcache中寻找该数据,当找不到的时候,才会去MapFile中寻找。
HBase Client
HBase Client负责寻找提供需求数据的HRegionServer,在这个过程中,HBase Client将首先与HMaster通信,找到ROOT区域,这个操作是Client和Master直接仅有的通信操作,一旦Root域被找到以后,Client就可以通过扫描ROOT区域找到相应的META区域去定位实际提供数据的HReginServer.当定位到提供数据的HReginServer以后,Client就可以通过这个HReginServer找到需要的数据了,这些信息将会被Client缓冲起来,当下次请求的时候,就不需要走上面的这个流程了。
HBase服务接口
HBase ThriftServer和HBase REST Server是通过非Java程序对HBase进行访问的一种途径。