拿一张比较老的图来说,自己画太费劲了:
谷歌google有三篇论文gfs、mapreduce、bigtable,这三篇论文不是纯讲空话的应付之作,而是确确实实提出来了新的思想,也因为这三篇论文,才对应的有了hdfs、mapreduce、hbase。
数据,海量的数据拿来做什么?首先要考虑如何存储这些海量的数据,hdfs解决了数据的存储,hdfs:hadoop file system。
有了存储,其次才能谈到数据的计算,mapreduce(mr),分布式计算框架,用于离线计算,什么叫离线计算,你可以这样认为,不是实时展现结果的计算就叫离线计算。另外,还有其他的计算框架,比如storm是流式计算框架,适合实时计算。而spark是内存计算框架,适合做快速得到结果的计算。
Pig跟hive差不多,都是用来写sql分析存储里面的数据的,但是hive依然活跃,而pig已经淘汰了。
两个工具:
sqoop用于hdfs和关系型数据库之间数据的互相导入导出,阿里也有个类似的工具叫做datax,跟sqoop实现的功能是差不多,比如可以把oracle数据库的表里面的数据导入到hive的某个表中,只需要简单的配置就能实现。
flume:主要用来做数据收集,多用于离线分析
mahout: 将机器学习做了开源实现,可以通过hive分析,提高了效率
Hbase:hadoop database。大数据分析的数据一般在pb级别以上
Hbase高可靠(数据可以存放在hdfs)、高性能(pb)、面向列(关系型是行式数据库)、实时读写、可伸缩的分布式nosql数据库,利用hdfs存储,利用MapReduce处理hbase中的海量数据,利用zk作为其分布式协同服务。
hive:hive这个东西使不会写mapreduce程序的人使用mapreduce成为了可能,hive可以让你写sql,就像关系型数据库那样写sql,之后这些sql又被翻译成了mapreduce程序,去分析hdfs或者hbase上存储的数据。
大数据对生产环境的配置要求
平常在虚拟机上玩大数据,玩的溜不溜不说,总归是自嗨,在真正的生产环境上可不是跟虚拟机上一个概念,如果别人让你出一套hadoop平台搭建机器要求的最低配置,你难道去说"这个没要求,我1个g的内存,1核的cpu,20g的硬盘"就可以搭建?那真是"无知限制了你的想象力"啊,我就曾这样说自己。下面列一个生产环境下大数据平台的机器硬件配置,以警后来者。
编号 | 配置 |
1 | 8核16G内存1T硬盘 |
2 | 8核16G内存1T硬盘 |
3 | 16核32G内存2T硬盘 |
4 | 16核32G内存2T硬盘 |
5 | 16核32G内存2T硬盘 |
6 | 8核16G内存1T硬盘 |
7 | 8核16G内存1T硬盘 |
每台机器在大数据平台扮演的角色不同,这个看情况自己分配,另外,有些术语也要知道,比如8核16G内存1T硬盘一般写为8C16G1T,C就是机器核数的意思。
前边的文章已经介绍了hdfs和mapreduce以及hive,现在我们再来看看hbase。
HBase简单介绍
-- HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。
高可靠性:HBase集群基于hadoop集群,hadoop平台副本的机制保证了数据的可靠性。
高性能:HBASE采用分布式计算,性能那是没的说
面向列:这是hbase和传统关系型数据库大相庭径的地方,hbase之所以被称为“列式数据库”,也正是基于这个原因
可伸缩:hbase集群中节点个数可以改变,而且hbase的列族个数也可以改变扩展
-- 利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce或者hive来处理HBase中的海量数据,利用Zookeeper作为其分布式协同服务,zookeeper在hbase里面不止是用作高可用,hbase的信息还存放在zk里面,因此少了zk,hbase就无法运行。
-- 主要用来存储非结构化和半结构化的松散数据
--hbase是列式 NoSQL 数据库
hbase的结构
学习hbase的同学都知道下面的这张图:
这张hbase的体系结构图展示了hbase有哪些组成部分以及他们之间的关系。
我们从里往外看。
hfile和storefile
这两者可以视为是同一个东西,之所以有不同的名字是因为站的角度不同,在hbase这个角度来看,叫storefile,在hdfs的角度来看,就叫hfile。顾名思义,他们都是指的确确实实存在于磁盘的文件,存储的东西就是真正的数据。它是怎么来的呢?是有memStore溢写而来。
何为MemStore?
MemStore就是memoryStore,是内存里面存储的数据,当客户端执行命令插入数据的时候,hbase会先写到MemStore里面,而不是直接写入磁盘,这样就减少了与磁盘的io交互,极大的提高了效率。当MemStore达到一定的阈值之后,hbase将启动flushcache进程将MemStore里面的数据写入storefile。因此,MemStore是一个用来缓存写入数据的内存区域。
store的引出
从名字上来看,MemStore和storefile这两个单词里面都有store,果不其然,他们俩还真个store有着不解之缘。你可以把sotre看做一个文件夹,它里面存放着0-n个由MemStore溢写而来的storefile,而这个文件夹的名字是和之后介绍的hbase的列族对应的,文件夹的名字就是列族的名字。一个hbase表里面有n个列族,那么就有n个store文件夹。
要继续介绍先的概念,我还要引入一张图,hbase存储结构示意图:
row key | timestamp | cf1 | cf2 | cf3 |
1 | 4 | cf1:name=zhao | | |
3 | | cf2:friends=a,b,c | cf3:assets=house,car | |
2 | | cf2:friends=a,b | | |
1 | | | cf3:assets=1000块钱 |
hregion是什么?
hregion包含了0-n行,上面的表格里面的数据是几行?答案是一行,hbase里面判断有几行,只有一个标准,那就是row key是否一致。
HBase自动把表水平划分成多个区域(region),每个region会保存一个表里面某段连续的数据;每个表一开始只有一个region,随着数据不断插入表,这一个region不断增大,当增大到一个阀值的时候(table中的行不断增多),region就会尽可能等分出两个新的region(裂变),每个hregion中包含若干行;这里要注意的是一个rowkey肯定只在一个region里面,比如现在总共有101行,可能裂变出2个region,一个是50行,一个是51行,同一个rowkey是不会位于不同的hregion里面的。
hregionserver的概念
hregion因为行的增大而越来越多,hregion是被hregionserver来管理的,所有的请求都要分发到一个hregionserver上,hregionserver的压力是不是很大,是不是会影响性能?因此当hregion越来越多的时候,太多的hregion就被一个名字叫做hmaster的东西分配到若干个HRegionserver上了。概括的说,hregionserver的作用:
1.hRegion server维护region,处理对这些region的IO请求
2.hRegion server负责切分在运行过程中变得过大的region
HMaster的作用
1.为HRegionserver分配region
2.负责HRegionserver的负载均衡
3.发现失效的HRegionserver并重新分配其上的region到其他HRegionserver上
4.管理用户对table的增删改操作
Zookeeper在hbase中的作用
•保证任何时候,集群中只有一个master
•存贮所有HRegion的寻址入口。
•实时监控HRegionserver的上线和下线信息。并实时通知Master
•存储HBase的schema和table元数据
Client
通过rpc协议对HBase进行访问