HBase知识体系探究与整理

来源:互联网 发布:网络扫描仪怎么设置 编辑:程序博客网 时间:2024/06/08 06:38

Web架构

业务日志一般由Tomcat或Nginx生成(Tomcat业务日志带sessionid,Nginx不带),而中大型互联网公司的web架构一般由LVS(Linux虚拟服务器)+Keepalived+Nginx+Tomcat组成。由Nginx单独挂载Tomcat,用Keepalived做主备,用户基数多的还会在前面挂智能CDN。Nginx理论上可以并发连接五万条请求,但实际上只有三万左右。此时假如有五万零一个或三万零一个连接请求,我得等第一个连接响应完毕,于是就催生了LVS的需求,它相当于一个漏斗,默认也是五万条,但它可以不断的增加连接池,使负载加大。比如天猫商城在做活动、双十一等都会用到LVS技术。

这里写图片描述
LVS提供虚拟服务,nginx作为反向代理服务器实现负载均衡,keepalived实现主从热备,检查RealServer的健康状态及主备机之间的失效转移。
VIP(Virtual IP)为192.168.0.16,用户只需要访问这个IP地址即可获得网页服务:
负载均衡主机+备机->keepalived与Web服务器->realserver+nginx+tomcat


简介

一般数据分析项目整体流程为:web架构->平台->数据库->BI(报表)
根据BI来观察PV(page view)页面浏览量,进一步判断做完推广是否有成效,怎样调整更有意义,一般前期较为简单,后续运维比较难。我们的平台把统计结果存入数据库(关系型|NoSQL型),前端再做报表展示。

  • HBase就是一种NoSQL,Google Bigtable的开源实现,提供高可靠性(有主备)、高性能(机器多)、面向列、可伸缩(可以动态增删节点)的分布式存储系统。它可以提供存储和处理服务,即存+计算,MapReduce运行在HBase(底层基于HDFS)上。
  • eg.Google Bigtable用GFS作为其文件存储系统,它用Hadoop HDFS作为其文件存储系统;
    Google运行MapReduce处理Bigtable的海量数据,它用Hadoop MapReduce处理HBase中的海量数据;
    Google Bigtable用Chubby作为协同服务,它用Zookeeper作对应。
    注:Spark代码简单,性能远超MapReduce。在大数据行业,技术更新换代非常快。

与传统数据库的对比
传统数据库遇到的问题:
①数据量很大时无法存储;②无很好的备份机制;③数据达到一定量开始缓慢,数据很大时基本无法支撑。
HBase优势:
①线性扩展,随数据量增多可扩展节点;②数据存储在HDFS上,备份机制健全;③通过zookeeper协调查找数据,访问速度快。
HBase集群中的角色:①HMaster,一个或多个主节点;②HRegionServer,多个从节点。

解析
我们通过my.ini文件的datadir属性找到MySQL表文件的路径,进入查看可发现数据库就是文件夹,表就是文件,底层是Windows或Linux文件系统,MySQL无非就是做了解析和执行的软件。HDFS是嵌在本地环境下的的分布式文件系统,说白了就是把底下众多硬盘串在一块的软件,和MySQL思想差不多。
而HBase列式思想,则把行式数据库的列转换成了行,同时如果列存储了很多数据,它会帮我们做分块并做索引,告诉我们从第0-5万条记录在哪一块,从第5万零一到十万条记录在哪一块。
HBase类比MySQL,HDFS类比MySQL底下的文件系统。列式的不能做多表关联,它只适合存海量数据。

我们再来探究下为何催生了基于HDFS的HBase数据库?
HDFS(分布式文件系统)存文件时会追加到一个文件的尾部,只能保存整个文件。假如一个文件夹下有一百万个小文件,每个小文件都是1KB,到底层存储时(DataNode)不会占用128M空间,但NameNode会被撑爆,元数据受不了。和HDFS差不多,它的架构也是主从,主HMaster、从HRegionServer。当一条条数据进来时,先缓存到HRegionServer的内存,达到128M时将整块写到HDFS,这样一块元数据只有一条。HDFS不能做数据存储,只能做文件存储,所以Hbase出现了。故当有一条条数据进来的场景时,就不要写到HDFS了,而是写到HBase集群里面。大表HBase+缓存层,同时元数据存到zookeeper,不存在master。
要注意master是不存元数据的(不存任何数据),它只是管理者,只管理几个HRegionServer挂掉之后数据迁移和表的信息,不管数据信息。所以当集群正常运行了,HMaster挂了没影响,但NameNode挂了就不行。最后说下Hadoop1和2的区别:第一代产品有1个NameNode+多个DataNode,第二代产品有多个NameNode以解决Hadoop1的单点问题。NameNode 主备之间还有DFSZKFailoverController做管理。


HBase安装

①确保用户是hadoop,将安装包上传到/home/hadoop下;
②解压:su – hadooptar –zxvf 安装包
③重命名:mv hbase-version hbase;

安装软件为什么要重命名:升级新版本,环境变量不用重新配置

④修改环境变量:master:su – rootvim /etc/profile
添加内容:export HBASE_HOME=/home/hadoop/hbaseexport PATH=$PATH:$HBASE_HOME/bin
执行命令:source /etc/profilesu – hadoop
在其他机器上执行上述操作。
⑤修改配置文件:su – hadoop
将配置文件上传到/home/hadoop/hbase/conf文件夹下。
配置文件的配置元素很多,没配就用默认的。每个文件的解释如下:

hbase-env.shexport JAVA_HOME=/usr/jdk   //jdk安装目录export HBASE_CLASSPATH=/home/hadoop/hadoop/conf   //hadoop配置文件的位置export HBASE_MANAGES_ZK=true   #如果使用独立安装的zookeeper这个地方就是falsehbase-site.xml<configuration>  <property>  <name>hbase.master</name>     #hbasemaster的主机和端口  <value>master1:60000</value>  </property>  <property>  <name>hbase.master.maxclockskew</name>    #时间同步允许的时间差  <value>180000</value>  </property>  <property>  <name>hbase.rootdir</name>  <value>HDFS:// hadoop-cluster1/hbase</value>#hbase共享目录,持久化hbase数据  </property>  <property>  <name>hbase.cluster.distributed</name>  #是否分布式运行,false即为单机  <value>true</value>  </property>  <property>  <name>hbase.zookeeper.quorum</name>#zookeeper地址  <value>slave1, slave2,slave3</value>  </property>  <property>  <name>hbase.zookeeper.property.dataDir</name>#zookeeper配置信息快照的位置  <value>/home/hadoop/hbase/tmp/zookeeper</value>  </property></configuration>Regionservers    //是从机器的域名slave1slave2slave3

⑥.把hadoop的HDFS-site.xml和core-site.xml 放到hbase/conf下
cp /home/hadoop/hadoop/etc/hadoop/HDFS-site.xml /home/hadoop/hbase/conf
cp /home/hadoop/hadoop/etc/hadoop/core-site.xml /home/hadoop/hbase/conf
⑦发送到其他机器
su - hadoop
scp –r /home/hadoop/hbase hadoop@slave1:/home/hadoop
scp –r /home/hadoop/hbase hadoop@slave2:/home/hadoop
scp –r /home/hadoop/hbase hadoop@slave3:/home/hadoop
⑧启动:su – hadoopstart-hbase.sh
⑨查看
进程:jps
进入hbase shell:hbase shell
退出hbase shell:quit
页面:http://master:60010/


HBase原理

这里写图片描述
简单来说,HRegionServer、HRegion、HLog、Store、MemStore、StoreFile、HFile都是类。
比如MemStore可能是类里面的某个Map或List集合,故用内存存储数据;StoreFile是Stream装好的路径,拥有input流;HRegion相当于类中有个路径,文件系统路径(HLog)+内存版的集合(MemStore)+文件版的路径(StoreFile)。HRegionServer通过HDFS API将文件写到DataNode。

HBase读慢写快,读是相对于写的,还是比MySQL快。表分区,便于查询,读取速度快,多台机器的IO得到充分利用。HRegionServer对数据有管理权限,表数据被封装到HRegion上,HRegion让表可以分布在n个机器上,HLog只能追加不能修改,写完之后,再写到MemStore,若机器宕机了,内存数据会丢失,此时HLog日志的作用就出来了,可防止数据丢失问题。当MemStore达到阈值,将数据写到StoreFile,再写到HFile,HFile用于存储在HDFS,进行了序列化。

数据有版本号,对同一id数据进行插入,若HLog有冗余数据(eg.有些数据被删除),不会被合并。HLog一定会同步到HDFS,什么时候写,隔多长时间写。如果在还没同步到HDFS,硬盘挂了,那数据会丢失。查数据会帮我们把数据绑在一起,返回最新版本给用户,当合并之后才会查不到版本。很久以前的数据没有版本,最近的数据有版本,就在于分块是否被合并。

假如0到一万条数据被分为好几个分块到不同的DataNode管理,当出现四个分块(每块64MB)且对文件日志做了追加后,数据冗余因为有一些删除数据,读完文件将所有数据进行一次合并,合并的过程中对增删改查进行冗余数据处理,并保留最近版本。合并后数据必然<256MB,当块数据<256MB将原封不动写回HDFS。继续处理0到一万条数据,当又有三个分块达到64MB时,和原来的大块(<256MB)进行合并(后>256MB),然后再分为两个块(都>168MB),再分布到不同的DataNode。
读相对慢

HMaser分配数据管理权限,假如0到10万被拆成两块,一块五万条
表拆分和合并,Region拆分合并
合:数据变小,且数据准确;
拆:数据越来越大,读起来会变慢,拆成两人管,数据读起来变快。

Hmaster直接到HDFS API,当不涉及到表管理、表合并拆分时,HMaste挂掉没事。 HRegionServer用来管理分区,一张表由多个Server管理,eg.A Server管理user表的前半部分,B Server管理了user表的后半部分,A Server又管理了admin表的前半部分,B Server管理admin表的后半部分。
数据拆分合并由数据大小触发,运算量不大且不占用HRegion的IO和网络请求,它直接连到HRegionServer,把数据块拆分给两个DataNode管后,只要修改.META表的索引列表。eg.table1从a到k归哪台机器管,从k到n又归哪台机器管。查数据直接找ip,这个过程不影响HRegionServer性能,因为他们之间没有联系。
提升数据读取和添加的性能:将垃圾数据清除+数据块分给其他人管理
如果Server挂了,该.META表的IP,会把管理权限给别人。再把HLog交给别人。
一个HRegionServer的HRegion的类有多个,每个HRegion管理表的一部分,HRegion0管理user0,HRegion管理user1,…
Store类也有多个StoreFile和HFile,把n个小文件合并成大文件,最终写入HDFS,写的过程麻烦。

ZooKeeper–> -ROOT-(单Region)–> .META.–> 用户表
-ROOT-
包含.META.表所在的Region列表,该表只会有一个Region;
Zookeeper中记录了-ROOT-表的location。
.META.
包含所有的用户空间Region列表,以及RegionServer的服务器地址。
这里写图片描述

这里写图片描述

写数据时,通过zookeeper去找-ROOT-表,-ROOT-表(分表,数据(内存或文件))在某台HRegionServer上。-ROOT-表里边,找到META表N,然后到META表里,可以找到tableN再到具体的server的ip,client直接定位IP,连接查数据。所有的-ROOT-表和.META.表都在内存,读的时候相对较慢,所以才要合并拆分,读的数据块小,读的时候就比较快。通过算法实现常查询的数据缓存到内存,就更快了。


总结

数据写流程:
①client通过Zookeeper定位该写到哪台HRegionServer;
②再向HRegionServer发送写请求;
③HRegionServer将数据写到HLog(write ahead log)——数据的持久化和恢复;
④写完HLog之后,HRegionServer再将数据写到内存MemStore;
⑤反馈client写成功。
数据Flush过程:
①当MemStore数据达到阈值(默认是64M),将数据刷到硬盘,将内存中的数据删除,同时删除HLog中的历史数据;
②将数据存储到HDFS中;
③在HLog中做标记点。
数据合并过程:
①当数据块达到4块,HMaster将数据块加载到本地,进行合并;
②当合并的数据>256MB,进行拆分,将拆分后的Region分配给不同的HRegionServer管理;
③当HRegionServer宕机后,将HRegionServer上的HLog拆分,然后分配给不同的HRegionServer加载,修改.META.;
④注意:HLog同步到HDFS。
HBase的读流程:
①通过zookeeper和-ROOT-、.META.表定位HRegionServer;
②数据从内存和硬盘合并后返回给client;
③数据块会缓存。
HMaster的职责:
①管理用户对Table的增、删、改、查操作;
②记录Region在哪台HregionServer上;
③在Region Split后,负责新Region的分配;
④新机器加入时,管理HRegionServer的负载均衡,调整Region分布;
⑤在HRegionServer宕机后,负责失效HRegionServer 上的Regions迁移。
HRegionServer的职责:
①主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块;
②管理了很多table的分区(Region)。
client职责:
HBase的Client使用HBase的RPC机制与HMaster和RegionServer进行通信。
管理类操作:Client与HMaster进行RPC;
数据读写类操作:Client与HRegionServer进行RPC。