移动做绩效的网站,网站不要了该如何处理,成品网站管理系统源码,建设工程主管部门网站1.概述 HBase的存储结构和关系型数据库不一样#xff0c;HBase面向半结构化数据进行存储。所以#xff0c;对于结构化的SQL语言查询#xff0c;HBase自身并没有接口支持。在大数据应用中#xff0c;虽然也有SQL查询引擎可以查询HBase#xff0c;比如Phoenix、Drill这类。但… 1.概述 HBase的存储结构和关系型数据库不一样HBase面向半结构化数据进行存储。所以对于结构化的SQL语言查询HBase自身并没有接口支持。在大数据应用中虽然也有SQL查询引擎可以查询HBase比如Phoenix、Drill这类。但是阅读这类SQL查询引擎的底层实现依然是调用了HBase的Java API来实现查询写入等操作。这类查询引擎在业务层创建Schema来映射HBase表结构然后通过解析SQL语法数最后底层在调用HBase的Java API实现。 本篇内容笔者并不是给大家来介绍HBase的SQL引擎我们来关注HBase更低层的东西那就是HBase的存储实现。以及跨集群的HBase集群数据迁移。 2.内容 HBase数据库是唯一索引就是RowKey所有的数据分布和查询均依赖RowKey。所以HBase数据库在表的设计上会有很严格的要求从存储架构上来看HBase是基于分布式来实现的通过Zookeeper集群来管理HBase元数据信息比如表名就存放在Zookeeper的/hbase/table目录下。如下图所示 2.1 Architecture HBase是一个分布式存储系统底层数据存储依赖Hadoop的分布式存储系统HDFS。HBase架构分三部分来组成它们分别是ZooKeeper、HMaster和HRegionServer。 ZooKeeperHBase的元数据信息、HMaster进程的地址、Master和RegionServer的监控维护节点之间的心跳判断节点是否下线等内容均需要依赖ZooKeeper来完成。是HBase集群中不可缺少的核心之一。HMasterHMaster进程在HBase中承担Master的责任负责一些管理操作比如给表分配Region、和数据节点的心跳维持等。一般客户端的读写数据的请求操作不会经过Master所以在分配JVM内存的适合一般32GB大小即可。HRegionServerHRegionServer进程在HBase中承担RegionServer的责任负责数据的存储。每个RegionServer由多个Region组成一个Region维护一定区间的RowKey的数据。如下图所示 图中Regiondn2:16030维护的RowKey范围为00010002。HBase集群的存储结构如下图所示 Zookeeper通常由奇数个组成便于分布式选举可参考《分布式系统选举算法剖析》一文了解这里不多赘述细节。HBase为了保证高可用性HA一般都会部署两个Master节点其中一个作为主另一个作为Backup节点。这里谁是主谁是Backup取决于那个HMaster进程能从Zookeeper上对应的Master目录中竞争到Lock持有该目录Lock的HMaster进程为主Master而另外一个为Backup当主Master发生意外或者宕机时Backup的Master会立刻竞争到Master目录下的Lock从而接管服务成为主Master对外提供服务保证HBase集群的高可用性。 2.2 RegionServer HBase负责数据存储的就是RegionServer简称RS。在HBase集群中如果只有一份副本时整个HBase集群中的数据都是唯一的没有冗余的数据存在也就是说HBase集群中的每个RegionServer节点上保存的数据都是不一样的这种模式由于副本数只有一份即是配置多个RegionServer组成集群也并不是高可用的。这样的RegionServer是存在单点问题的。虽然HBase集群内部数据有Region存储和Region迁移机制RegionServer服务的单点问题可能花费很小的代价可以恢复但是一旦停止RegionServre上含有ROOT或者META表的Region那这个问题就严重由于数据节点RegionServer停止该节点的数据将在短期内无法访问需要等待该节点的HRegionServer进程重新启动才能访问其数据。这样HBase的数据读写请求如果恰好指向该节点将会收到影响比如抛出连接异常、RegionServer不可用等异常。 3.日志信息 HBase在实现WAL方式时会产生日志信息即HLog。每一个RegionServer节点上都有一个HLog所有该RegionServer节点上的Region写入数据均会被记录到该HLog中。HLog的主要职责就是当遇到RegionServer异常时能够尽量的恢复数据。 在HBase运行的过程当中HLog的容量会随着数据的写入越来越大HBase会通过HLog过期策略来进行定期清理HLog每个RegionServer内部均有一个HLog的监控线程。HLog数据从MemStore Flush到底层存储HDFS上后说明该时间段的HLog已经不需要了就会被移到“oldlogs”这个目录中HLog监控线程监控该目录下的HLog当该文件夹中的HLog达到“hbase.master.logcleaner.ttl”单位是毫秒属性所配置的阀值后监控线程会立即删除过期的HLog数据。 4.数据存储 HBase通过MemStore来缓存Region数据大小可以通过“hbase.hregion.memstore.flush.size”单位byte属性来进行设置。RegionServer在写完HLog后数据会接着写入到Region的MemStore。由于MemStore的存在HBase的数据写入并非是同步的不需要立刻响应客户端。由于是异步操作具有高性能和高资源利用率等优秀的特性。数据在写入到MemStore中的数据后都是预先按照RowKey的值来进行排序的这样便于查询的时候查找数据。 5.Region分割 在HBase存储中通过把数据分配到一定数量的Region来达到负载均衡。一个HBase表会被分配到一个或者多个Region这些Region会被分配到一个或者多个RegionServer中。在自动分割策略中当一个Region中的数据量达到阀值就会被自动分割成两个Region。HBase的表中的Region按照RowKey来进行排序并且一个RowKey所对应的Region只有一个保证了HBase的一致性。 一个Region中由一个或者多个Store组成每个Store对应一个列族。一个Store中包含一个MemStore和多个Store Files每个列族是分开存放以及分开访问的。自动分割有三种策略分别是 ConstantSizeRegionSplitPolicy在HBase-0.94版本之前是默认和唯一的分割策略。当某一个Store的大小超过阀值时hbase.hregion.max.filesize默认时10GRegion会自动分割。IncreasingToUpperBoundRegionSplitPolicy在HBase-0.94中这个策略分割大小和表的RegionServer中的Region有关系。分割计算公式为Min(R*R*hbase.hregion.memstore.flush.size,hbase.hregion.max.filesize)其中R表示RegionServer中的Region数。比如hbase.hregion.memstore.flush.size256MBhbase.hregion.max.filesize20GB那么第一次分割的大小为Min(1*1*256,20GB)256MB也就是在第一次大到256MB会分割成2个Region后续以此公式类推计算。KeyPrefixRegionSplitPolicy可以保证相同前缀的RowKey存放在同一个Region中可以通过hbase.regionserver.region.split.policy属性来指定分割策略。6.磁盘合理规划 部署HBase集群时磁盘和内存的规划是有计算公式的。随意分配可能造成集群资源利用率不高导致存在浪费的情况。公式如下 # 通过磁盘维度的Region数和Java Heap维度的Region数来推导
Disk Size/(RegionSize*ReplicationFactor)Java Heap*HeapFractionForMemstore/(MemstoreSize/2) 公式中对应的hbase-site.xml文件中的属性中见下表 KeyPropertyDisk Size磁盘容量大小一般一台服务器有多块磁盘RegionSizehbase.hregion.max.filesize默认10G推荐范围在10GB30GBReplicationFactordfs.replication默认为3Java Heap分配给HBase JVM的内存大小HeapFractionForMemstorehbase.regionserver.global.memstore.lowerLimit默认为0.4MemstoreSizehbase.hregion.memstore.flush.size默认为128M 在实际使用中MemstoreSize空间打下只使用了一半1/2的容量。 举个例子一个RegionServer的副本数配置为3RegionSize为10GHBase的JVM内存分配45GHBase的MemstoreSize为128M那此时根据公式计算得出理想的磁盘容量为45G*1024*0.4*2*10G*1024*3/128M8.5T左右磁盘空间。如果此时分配一个节点中挂载10个可用盘共27T。那将有两倍的磁盘空间不匹配造成浪费。 为了提升磁盘匹配度可以将RegionSize值提升至30G磁盘空间计算得出25.5T基本和27T磁盘容量匹配。 7.数据迁移 对HBase集群做跨集群数据迁移时可以使用Distcp方案来进行迁移。该方案需要依赖MapReduce任务来完成所以在执行迁移命令之前确保新集群的ResourceManager、NodeManager进程已启动。同时为了查看迁移进度推荐开启proxyserver进程和historyserver进程开启这2个进程可以方便在ResourceManager业务查看MapReduce任务进行的进度。 迁移的步骤并不复杂在新集群中执行distcp命令即可。具体操作命令如下所示 # 在新集群的NameNode节点执行命令
[hadoopnna ~]$ hadoop distcp -Dmapreduce.job.queue.namequeue_0001_01 -update -skipcrccheck -m 100 hdfs://old_hbase:9000/hbase/data/tabname /hbase/data/tabname 为了迁移方便可以将上述命令封装成一个Shell脚本。具体实现如下所示 #! /bin/bash
for i in cat /home/hadoop/hbase/tbl
do
echo $i
hadoop distcp -Dmapreduce.job.queue.namequeue_0001_01 -update -skipcrccheck -m 100 hdfs://old_hbase:9000/hbase/data/$i /hbase/data/$i
done
hbase hbck -repairHoles 将待迁移的表名记录在/home/hadoop/hbase/tbl文件中一行代表一个表。内容如下所示 hadoopnna ~]$ vi /home/hadoop/hbase/tbl# 表名列表
tbl1
tbl2
tbl3
tbl4 最后在循环迭代迁移完成后执行HBase命令“hbase hbck -repairHoles”来修复HBase表的元数据如表名、表结构等内容会从新注册到新集群的Zookeeper中。 8.总结 HBase集群中如果RegionServer上的Region数量很大可以适当调整“hbase.hregion.max.filesize”属性值的大小来减少Region分割的次数。在执行HBase跨集群数据迁移时使用Distcp方案来进行需要保证HBase集群中的表是静态数据换言之需要停止业务表的写入。如果在执行HBase表中数据迁移时表持续有数据写入导致迁移异常抛出某些文件找不到。 9.结束语 这篇博客就和大家分享到这里如果大家在研究学习的过程当中有什么问题可以加群进行讨论或发送邮件给我我会尽我所能为您解答与君共勉。 联系方式 邮箱smartloli.orggmail.com Twitterhttps://twitter.com/smartloli QQ群Hadoop - 交流社区1424769183 温馨提示请大家加群的时候写上加群理由姓名公司/学校方便管理员审核谢谢 热爱生活享受编程与君共勉 本文转自哥不是小萝莉博客园博客原文链接http://www.cnblogs.com/smartloli/如需转载请自行联系原作者