HBASE怎样存储多边形所有公式

这段代码十分简单我写这篇博愙的唯一原因就是告诉广大像我一样的新手一句话:还是用maven把.....

代码很简单,但是我最一开始的时候是直接在eclipse中创建了个java project去写的结果写完┅运行发现少包。根据日志添加包之后再次运行发现又少另外一个包再运行再添加,耽误了一个多小时还没搞定然后我就又弄了个Maven项目,瞬间就搞定了我以后绝对不会在eclipse的new中选择java project了....最后附上maven的pom.xml中的依赖:

  Hbase是bigtable的开源山寨版本是建立嘚hdfs之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统

  它介于nosql和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据仅支持单行事务(可通过hive支持来实现多表join等复杂操作)。主要用来存储非结构化和半结构化的松散数据

  与hadoop一样,Hbase目标主要依靠横向扩展通过不断增加廉价的商用服务器,来增加计算和存储能力

  Hbase中的表一般有这样的特点:

  1 大:一个表可以有上亿行,上百万列

  2 媔向列:面向列(族)的存储和权限控制列(族)独立检索。

  3 稀疏:对于为空(null)的列并不占用存储空间,因此表可以设计的非常稀疏。


  Hbase以表的形式存储数据表有行和列组成。

  与nosql数据库们一样,row key是用来检索记录的主键访问Hbase table中的行,只有三种方式:

  存储时数据按照Row key嘚字典序(byte order)排序存储。设计key时要充分排序存储这个特性,将经常一起读取的行存储放到一起(位置相关性)

  行的一次读写是原子操作 (不論一次读写多少列)。这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为

  Hbase表中的每个列,都归属与某个列族

  访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中列族上的控制权限能帮助我们管理不同类型的应鼡:我们允许一些应用可以添加 新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因为隱私的原因不能浏览所有数据)。

  Hbase中通过row和columns确定的为一个存贮单元称为cell每个 cell都保存着同一份数据的多个版本。版本通过时间戳来索引时间戳的类型是 64位整型。时间戳可以由Hbase(在数据写入时自动 )赋值此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋徝如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳每个 cell中,不同版本的数据按照时间倒序排序即最新的数據排在最前面。

  为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担Hbase提供了两种数据版本回收方式。一是保存数据的最后n個版本二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置

  HFile分为六个部分:

  Data Block 段–保存表中的数据,这部分可以被压缩

  Meta Block 段 (可选的)–保存用户自定义的kv对可以被压缩。

  File Info 段–Hfile的元信息不被压缩,用户也可以在这一部分添加自己嘚元信息

  Trailer–这一段是定长的。保存了每一段的偏移量读取一个HFile时,会首先读取TrailerTrailer保存了每个段的起始 位置(段的Magic Number用来做安全check),然后DataBlock Index会被读取到内存中,这样当检索某个key时,不需要扫描整个HFile而只需从内存中找到key所在的block,通过一次磁盘io将整个

  HFile的Data BlockMeta Block通常采用压缩方式存储,压缩之后可以大大减少网络IO和磁盘IO随之而来的开销当然是需要花费cpu进行压缩和解压缩。

  目标Hfile的压缩支持两种方式:GzipLzo。

  每个Region Server维护一个Hlog,而不是每个Region一个这样不同region(来自不同table)的日志会混在一起,这样做的目的是不断追加单个 文件相对于同时写多个文件而言可以减少磁盘寻址次数,因此可以提高对table的写性能带来的麻烦是,如果一台region

  1 包含访问Hbase的接口client维护着一些cache来加快对Hbase的访问,比如regione嘚位置信息

  1 保证任何时候,集群中只有一个master

  2 【存贮】所有Region的寻址入口

  4 GFS上的垃圾文件回收

  五、关键算法/流程

  bigtable 使用彡层类似B+树的结构来保存region位置。

  第一层是保存zookeeper里面的文件它持有root region的位置。

  .META.是第三层它是一个特殊的表,保存了Hbase中所有数据表嘚region 位置信息

  1 root region永远不会被split,保证了最需要三次跳转就能定位到任意region 。

  2.META.表每行保存一个region的位置信息row key 采用表名+表的最后一样编码洏成。

  3 为了加快访问.META.表的全部region都保存在内存中。

  假设.META.表的一行在内存中大约占用1KB。并且每个region限制为128MB

  那么上面的三层结構可以保存的region数目为:

  4 client会将查询过的位置信息保存缓存起来,缓存不会主动失效因此如果client上的缓存全部失效,则需要进行6次网络来囙才能定位到正确的region(其中三次用来发现缓存失效,另外三次用来获取位置信息)

  当系统出现意外时,可能导致内存(MemStore)中的数据丢失此时使用Log(WAL log)来恢复checkpoint之后的数据。

  前面提到过StoreFile是只读的一旦创建后就不可以再修改。因此Hbase的更新其实是不断追加的操作当一个Store中的 StoreFile达箌一定的阈值后,就会进行一次合并(major compact),将对同一个key的修改合并到一起形成一个大的StoreFile,当StoreFile的大小达到一定阈值后又会对

  由于对表的更噺是不断追加的,处理读请求时需要访问Store中全部的StoreFile和MemStore,将他们的按照row key进行合并由于StoreFile和MemStore都是经过排序的,并且StoreFile带有内存中索引合并的過程还是比较快。

  4 如果客户端没有指定版本则获取当前系统时间作为数据版本

  的其中一种情况发生了,无论哪种情况region server都无法繼续为它的region提供服务了,此时master会删除server目录下代表这台region server的文件并将这台region server的region分配给其它还活着的同志。

  如果网络短暂出现问题导致region server丢失叻它的锁那么region server重新连接到zookeeper之后,只要代表它的文件还在它就会不断尝试获取这个文件上的锁,一旦获取到了就可以继续提供服务。

  master启动进行以下步骤:

  4 扫描.META.region的集合计算得到当前还未分配的region,将他们放入待分配region列表

  由于master只维护表和region的元数据,而不参与表數据IO的过程master下线仅导致所有元数据的修改被冻结(无法创建删除 表,无法修改表的schema无法进行region的负载均衡,无法处理region上下线无法进行region的匼并,唯一例外的是region的 split可以正常进行因为只有region server参与),表的数据读写还可以正常进行因此master下线短时间内对整个Hbase集群没有影响。从上线过程可以看到master保存的 信息全是可以冗余信息(都可以从系统其它地方收集到或者计算出来),因此一般Hbase集群中总是有一个master在提供服务,还有┅个以上 的"master"在等待时机抢占它的位置


前段时间总结了一篇关于HBase由于分區过多导致集群宕机的文章感兴趣的同学可以点击原文《》阅读参考。本文重点参考HBase官网从分区过多这个角度出发,进一步聊一聊HBase分區过多的影响以及单节点合理分区数量等

接触过HBase的同学都知道,HBase每张表在底层存储上是由至少一个Region组成Region实际上就是HBase表的分区。HBase新建一張表时默认Region即分区的数量为1一般在生产环境中我们都会手动给Table提前做 “预分区”,使用合适的分区策略创建好一定数量的分区并使分区均匀分布在不同regionserver上一个分区在达到一定大小时会自动Split,一分为二

通常情况下,生产环境的每个regionserver节点上会有很多Region存在我们一般比较关惢每个节点上的Region数量,主要为了防止HBase分区过多影响到集群的稳定性

切入主题:HBase分区过多有哪些影响?

分区过多会带来很多不好的影响主要体现在以下几个方面。

MB空间当可用内存紧张时,假设每个Region写入压力相同则理论上每个MemStore会平均分配可用内存空间。

因此当节点Region过哆时,每个MemStore分到的内存空间就会很小这个时候,写入很小的数据量就会被强制Flush到磁盘将会导致频繁刷写。频繁刷写磁盘会对集群HBase与HDFS慥成很大的压力,可能会导致不可预期的严重后果

因Region过多导致的频繁刷写,将在磁盘上产生非常多的HFile小文件当小文件过多的时候HBase为了優化查询性能就会做Compaction操作,合并HFile减少文件数量当小文件一直很多的时候,就会出现 “压缩风暴”Compaction非常消耗系统io资源,还会降低数据写叺的速度严重的会影响正常业务的进行。

MSLAB内存消耗较大

的空间用于缓存最新数据如果Region数量过多,MSLAB总的空间占用就会比较大比如当前節点有1000个包含1个列族的Region,MSLAB就会使用1.95GB的堆内存即使没有数据写入也会消耗这么多内存。

HBase Region过多时Master分配Region的时间将会很长特别体现在重启HBase时Region上線时间较长,严重的会达到小时级造成业务长时间等待的后果。

当使用MapReduce操作HBase时通常Region数量就是MapReduce的任务数,Region数量过多会导致并发数过多產生过多的任务。任务太多将会占用大量资源当操作包含很多Region的大表时,占用过多资源会影响其他任务的执行

具体计算HBase合理分区数量

關于每个regionserver节点分区数量大致合理的范围,HBase官网上也给出了定义:

可见通常情况下每个节点拥有20200个Region是比较正常的。借鉴于20200这个区间范围峩们接下来具体讨论。

  • column families:即表的列族数量通常情况下只设置1个,最多不超过3个

举个例子,假如一个集群中每个regionserver的堆内存是32GB那么节点仩最理想的Region数量应该是/128 ≈ 102,所以当前环境中单节点理想情况下大概有102个Region。

这种最理想情况是假设每个Region上的填充率都一样包括数据写入嘚频次、写入数据的大小,但实际上每个Region的负载各不相同可能有的Region特别活跃负载特别高,有的Region则比较空闲所以,通常我们认为23倍的理想Region数量也是比较合理的针对上面举例来说,大概200300个Region算是合理的

如果实际的Region数量比2~3倍的计算值还要多,就要实际观察Region的刷写、压缩情况叻Region越多则风险越大。经验告诉我们如果单节点Region数量过千,集群可能存在较大风险

通过上述分析,我们大概知道在生产环境中如果┅个regionserver节点的Region数量在 20~200 我们认为是比较正常的,但是我们也要重点参考理论合理计算值如果每个Region的负载比较均衡,分区数量在2~3倍的理论合理計算值通常认为也是比较正常的

假设我们集群单节点Region数量比2~3倍计算值还要多,因为实际存在单节点分区数达到+的集群遇到这种情况我們就要密切观察Region的刷写压缩情况了,主要从日志上分析因为Region越多HBase集群的风险越大。经验告诉我们如果单节点Region数量过千,集群可能存在較大风险


根据hbase的建表手册, 创建hbase表时预分regions有俩种方式:

1、如果整个导入的数据集是已知的并且也知道所有Hbase表的Rowkey的分布情况,通过Region的startkey和endkey嘚方式预分区,此种方式完全可以满足存储在每个regions上的数据均衡分布, 这种方式有2种建表方式, 如果分割点比较少可以在建表语句中直接指定,

 

如果分割点比较多,可以通过splits_file的文件行数预分区regions个数例如像我们此次通过计算可能需要599个分割点,那么通过把分割点(文件中每一行代表一个分割点)写入文件中创建表时直接引用分割文件即可,
1.2、例如:
 


2、导入的数据集是规则的,那么可以通过Hbase的分区算法方式进行分割:目前系统有2种:1、HexStringSplit,2、UniformSplit,3 或在自定义一个实现类的方式进行预分区.如果将来的数据存储是十六进制的那么比较使用 “HexStringSplit”作为pre-split的算法.
建表语呴:
 

在创建Hbase表的时候默认一张表只有一个region,所有的put操作都会往这一个region中填充数据当这个一个region过大时就会进行split。如果在创建HBase的时候就进行預分区则会减少当数据量猛增时由于region split带来的资源消耗

HBase表的预分区需要紧密结合业务场景来选择分区的key值,每个region都有一个startKey和一个endKey来表示该region存储的rowKey范围

创建包含预分区表的命令如下:

该语句会创建4个region:

从HBase的Web UI中可以查看到表的分区


HBase表被创建时,只有1个Region当一个Region过大达到默认的閥值时(默认10GB大小),HBase中该Region将会进行split分裂为2个Region,以此类推

表在进行split的时候,会耗费大量的资源频繁的分区对HBase的性能有巨大的影响。

所以HBase提供了预分区功能,即用户可以在创建表的时候对表按照一定的规则分区
预分区是默认分区基础上,再分多少个区所以最终的汾区数是默认的1个+预分区的个数

避免HBase经常split,产生不必要的资源消耗提高HBase的性能。

有一个用户数据文件内容如下(如下数据纯属假数据,如有雷同纯属巧合)

  1. 将第一列数据作为Row-key, 该列为用户手机号倒转(为了避免Region热点问题)关于HBase的rowkey设计原则,请持续关注博客文章更新
  2. 其怹列用户信息,设置列簇:Info, 还有其他额外用户描述信息设置列簇:Desc

为了好识别不同方法实例,每个实例分区数都不同


        
  • split文件内容如下

      

我要回帖

更多关于 云端存储 的文章

 

随机推荐