一些概念

【什么是大数据、大数据技术】

大数据,又称巨量资料,指的是所涉及的数据资料量规模巨大到无法在合理时间内通过传统的应用软件工具进行抓取、收集、管理、分析处理。简单来说,大数据就是海量数据的高效处理
大数据技术,从本质上讲是从类型各异、内容庞大的数据中快速获得有价值信息的技术。目前,随着大数据领域被广泛关注,大量新的技术已经开始涌现出来,而这些技术将成为大数据采集、存储、分析、表现的重要工具。
大数据处理的关键技术主要包括:数据采集、数据预处理(数据清理、数据集成、数据变换等)、大数据存储、数据分析和挖掘、数据的呈现与应用(数据可视化、数据安全与隐私等)。

【大数据的4V特征(Volume、Variety、Value、Velocity)】

1、数据体量巨大(Volume)。包括采集、存储和计算的量都非常大。大数据的起始计量单位至少是P(1000个T)、E(100万个T)或Z(10亿个T)。
2、数据类型繁多(Variety)。这种类型的多样性也让数据被分为结构化数据和非结构化数据。相对于以往便于存储的以文本为主的结构化数据,非结构化数据越来越多,包括网络日志、音频、视频、图片、地理位置信息等,这些多类型的数据对数据的处理能力提出了更高要求。
3、价值密度低(Value)。价值密度的高低与数据总量的大小成反比。以视频为例,一部1小时的视频,在连续不间断的监控中,有用数据可能仅有一二秒。如何通过强大的机器算法更迅速地完成数据的价值“提纯”成为目前大数据背景下亟待解决的难题。
4、处理速度快(Velocity)。数据增长速度快,处理速度也快,时效性要求高。比如搜索引擎要求几分钟前的新闻能够被用户查询到,个性化推荐算法尽可能要求实时完成推荐。这是大数据区别于传统数据挖掘的显著特征。

【什么是云计算】

云计算(Cloud Computing)是分布式计算(Distributed Computing)、并行计算(Parallel Computing)、效用计算(Utility Computing)、 网络存储(Network Storage Technologies)、虚拟化(Virtualization)、负载均衡(Load Balance)、热备冗余(High Available)等传统计算机和网络技术发展融合的产物。
云计算中的“云”是指通过 Internet(“云”)交付计算服务器、存储和带宽资源等服务。“云”将计算资源集中起来,并通过专门软件实现自动管理。用户可以动态申请部分资源,支持各种业务的运转,无需自己搭建服务器而从“云”获取计算和存储能力,从而提高效率、降低成本,可以更专注于重要的业务目标以及创新。提供这些计算服务的公司称为云提供商,他们通常基于用户使用对云计算服务进行收费,类似于家用水电的计费方式。
云计算早期,就是简单一点的分布式计算,解决任务分发,将计算结果合并,也叫网格计算。很多大企业早期可能也只是想解决自己的效率与计算问题,到后来这个能力也可以提供给外部使用,所以就出现了公共云(public cloud)计算 ,把计算机的计算能力直接放在网上卖出去。未来的云计算,就像我们使用水电煤气一样,我们从来不会想着去建电厂,也不关心电厂在哪里,只要插上插头,就能用电。简单来说,云计算是硬件资源的虚拟化

【云计算有哪些特点】

1.超大规模
“云”具有相当的规模,Google的云计算拥有100多万台服务器,Amazon、Microsoft、Yahoo等拥有几十万台服务器。所以“云”可以为用户提供超强的计算和存储能力。
2.费用低
“云”就是一个庞大的资源池,用户可以按需购买资源,像水电煤那样计费。无需在购买硬件和软件以及设置和运行现场数据中心(包括服务器机架、用于供电和冷却的全天不间断电力、管理基础结构的 IT 专家)上进行额外的资金投入。
3.高伸缩性
“云”的规模可以动态伸缩,具备弹性扩展能力,以满足应用或者用户增长的需要。例如更多或更少的计算能力、存储空间、带宽。因此通常只需点击几下鼠标,即可在数分钟内调配海量计算资源,赋予企业非常大的灵活性,并消除了容量规划的压力。
4.通用性
“云”不是针对特定的服务,同一片“云”可以支撑各种各样的服务。
5.虚拟化
云计算支持用户在任意位置、使用各种终端获取应用服务。所请求的资源来自“云”,而不是固定的有形的实体。应用在“云”中某处运行,但实际上用户无需了解、也不用担心应用运行的具体位置。只需要一台笔记本或者一个手机,就可以通过网络服务来实现我们需要的一切,甚至包括超级计算这样的任务。
6.可靠性
“云”采用数据多副本容错、计算节点同构可互换等多种手段保障服务可靠性。

【云服务类型:IaaS、PaaS、SaaS】

1、基础结构即服务 (IaaS)
云计算服务的最基本类别。使用 IaaS 时,以即用即付的方式从服务提供商处租用IT基础结构,如服务器和虚拟机(VM)、存储空间、网络和操作系统。
2、平台即服务 (PaaS)
平台即服务 (PaaS) 是指云计算服务,它们可以按需提供开发、测试、交付和管理软件应用程序所需的环境。PaaS 旨在让开发人员能够更轻松地快速创建 Web 或移动应用,而无需考虑对开发所必需的服务器、存储空间、网络和数据库基础结构进行设置或管理。
3、软件即服务 (SaaS)
软件即服务 (SaaS) 是通过 Internet 交付软件应用程序的方法,通常以订阅为基础按需提供。使用 SaaS 时,云提供商托管并管理软件应用程序和基础结构,并负责软件升级和安全修补等维护工作。用户(通常使用电话、平板电脑或 PC 上的 Web 浏览器)通过 Internet 连接到应用程序。

【云部署类型:公共、私有、混合】

1、公有云
公有云为第三方云服务提供商所拥有和运营,他们通过 Internet 提供其计算资源(如服务器和存储空间)。Microsoft Azure 是公有云的一个示例。在公有云中,所有硬件、软件和其他支持性基础结构均为云提供商所拥有和管理。使用 Web 浏览器访问这些服务和帐户管理。
2、私有云
私有云是指专供一个企业或组织使用的云计算资源。私有云可以实际位于公司的现场数据中心之上。私有云对数据保密、数据安全、服务质量都能有效控制,其最大的特点是安全性与私有化,是订制化解决方案的根本,对于对数据安全与稳定有要求的企业来说是非常好的选择。
3、混合云
混合云组合了公有云的方便便捷与私有云的安全稳定的特点,企业出于安全考虑会希望将数据存放在私有云上面,同时又希望能使用公有云的资源,混合云为企业提供更大的灵活性和更多的部署选项。

【云计算的安全如何保证】

公有云的数据安全不是一个孤立的问题,广义的安全,也包括数据的完整性、数据的私密性。
1、网络安全防护:高吞吐量的 DDoS 外网防护更完善的防火墙,入侵检测,WAF更完善的流量清洗规则。
2、数据库安全防护:高可用:主备切换数据零丢失高可靠:同城双活,异地备份安全性:访问控制,IP白名单。
3、存储安全防护:高可靠:超大容量,三份备份,异地同步安全性:访问控制,防盗链。
4、运维安全:数据对运维也是机密的,需要流程保障不断更新的虚拟机和容器镜像建设漏洞不断更新的病毒库

【大数据与云计算的关系】

1、云计算为大数据提供了有力的工具和途径。云计算强大的计算能力和数据存储能力能够为大数据处理分析带来丰富性和多元性,使其能够提供更为便捷的服务。
2、大数据为云计算提供了很有价值的用武之地。大数据本身带来的多元化应用使得云计算具有了强大的实际应用能力。
3、大数据为云计算深入到行业应用提供了强有力的切入点。
4、大数据更靠近应用,比云计算更容易落地,大数据需求明显,处在价值链的上游,可有效利用已大量建设的云计算资源。
云计算作为计算资源的底层,支撑着上层的大数据处理,而大数据的发展趋势是,实时交互式的查询效率和分析能力。云计算和大数据势相辅相成、优势相长的关系,二者结合能够提升对方的实用价值,并在对方的计算发展过程中相互促进,实现了传统信息处理和分析技术无法理解和比拟的功能和优势。

【大数据思维】

1、要分析所有数据,而不是少量的随机数据样本。在大数据时代的第一个转变就是利用所有数据,而不再仅仅依靠一小部分数据。采样分析的精确性随着采样随机性的增加而大幅提高,但与样本数量的增加关系不大。因此样本选择的随机性比样本数量更加重要。大数据的方法不采用随机分析法,而是采用所有数据,即样本=总体。
2、要追求数据的纷繁复杂,而不是精确性。在“小数据”时代,最重要的就是减少测量的错误,因为收集的信息较少,所以必须保证记录尽可能精确,否则细微的错误会被放大。大数据为了扩大数据规模允许不精确。大数据的简单算法比小数据的复杂算法更加有效。大数据要求我们接受纷繁性,放弃对精确性的追求,在大数据时代我们无法获得精确性。
3、要关注事物的相关关系,而不是因果关系。通过监控一个现象的良好的关联物,相关关系可以帮助我们捕捉现在和预测未来。大数据的相关关系分析法更加准确、更快,而且不易受传统思维模式和特定领域里隐含的固有偏见的影响。建立在相关关系分析法上基础上的预测是大数据的核心。

【大数据的数据分类】

1、结构化数据:即行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据。任何一列遵循范式,数据项不可再分,同一列数据具有相同的数据类型。所有的关系数据库中的数据均为结构化数据(如Oracle,DB2,MySQL,SQLServer)
2、非结构化数据:不方便用数据库二维逻辑表来表现的数据,包括所有格式的办公文档、文本、图片、XML、HTML、各类报表、图像和音频/视频信息等,没有固定结构的数据,通常保存为不同类型的文件。
3、半结构化数据:介于完全结构化数据(如关系型数据库、面向对象数据库中的数据)和完全无结构的数据(如声音、图像文件等)之间的数据。每条记录可能会有预定义的规范,但是允许每条记录包含不同的信息、字段数、字段名、字段类型,也允许嵌套格式。HTML文档就属于半结构化数据。它一般是自描述的,数据的结构和内容混在一起,没有明显的区分。

【企业级大数据运营流程】

针对企业内外部的各类数据源,通过数据采集、预处理、数据存储及数据加工处理,为不同应用及使用对象提供多种数据服务。
数据源:整合的业务数据来源于B/O/M三域支撑系统、业务平台等内部系统数据源,以及互联网页,政府数据等外部数据源。
数据采集:将不同来源、不同特征的数据源通过不同的方式进行抽取和收集。
数据处理:通过数处理对采集来的数据进行必要的裁剪、整理、汇总计算。
数据存储:将经过预处理的数据装载到分析平台、并根据处理需要进行数据分层存储。
数据治理:按照不同的数据架构、数据质量规则、安全规则等进行数据治理。
数据挖掘:针对不同的应用场景需求通过挖掘算法建立模型,挖掘数据间的潜在关系与价值。
数据应用:面向不同应用及使用对象,提供接口数据、页面访问等多种数据服务。

【大数据的预处理及存储管理技术】

数据预处理主要完成对已接收数据的辨析、抽取、清洗等操作。
1、抽取:因获取的数据可能具有多种结构和类型,数据抽取过程可以帮助我们将这些复杂的数据转化为单一的或者便于处理的构型,以达到快速分析处理的目的。
2、清洗:对于大数据,并不全是有价值的,有些数据并不是我们所关心的内容,而另一些数据则是完全错误的干扰项,因此要对数据通过过滤“去噪”从而提取出有效数据。
大数据存储与管理要用存储器把采集到的数据存储起来,建立相应的数据库,并进行管理和调用。重点解决复杂结构化、半结构化和非结构化大数据管理与处理技术。其中非关系型数据库主要指的是NOSQL数据,分为键值库,列存储数据库,图数据库以及文档数据库等类型。关系型数据库包含了传统关系数据库系统以及NewSQL数据库。

【大数据的分析及挖掘技术】

数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,提取隐含在其中的、人们事先不知道的、但又是潜在有用的信息和知识的过程。根据挖掘方法分,可粗分为:机器学习方法、统计方法、神经网络方法和数据库方法。机器学习中,可细分为:归纳学习方法(决策树、规则归纳等)、基于范例学习、遗传算法等。统计方法中,可细分为:回归分析(多元回归、自回归等)、判别分析(贝叶斯判别、费歇尔判别、非参数判别等)、聚类分析(系统聚类、动态聚类等)、探索性分析(主元分析法、相关分析法等)等。神经网络方法中,可细分为:前向神经网络(BP算法等)、自组织神经网络(自组织特征映射、竞争学习等)等。数据库方法主要是多维数据分析或OLAP方法,另外还有面向属性的归纳方法。

【批处理与流处理的差异】

批处理与流处理的不同,主要是数据获取的方式不同。流处理的数据,就像流水一样,一直在系统中流动处理。批处理的数据,则是暂存于数据库中的离线数据,后期定时定量的一批一批的处理。
批处理的优点是支持对历史时序数据的处理,实现简单。但是批处理具有查询数据量大,非实时的缺点,因此批处理不适合对处理时间要求较高的场合。流式处理的优点是数据实时计算,无需查询原始数据,无需针对整个数据集执行操作,而是对通过系统传输的每个数据项执行操作。但是流式处理需要特殊处理写入的历史数据,也需要处理运算过程中崩溃的计算单元。流处理很适合用来处理必须对变动或峰值做出响应,并且关注一段时间内变化趋势的数据。

【什么是Hadoop】

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce为海量的数据提供了计算。

【Hadoop的起源】

Hadoop起源于Apache Nutch(一个开源的网络搜索引擎),是Apach Lucene(文本搜索引擎库,创始人Doug Cutting)的一部分。在2002-2004年间谷歌发布了三大论文介绍了其云计算的核心组成部分GFS(Google File System)、MapReduce以及BigTable。谷歌在自身多年的搜索引擎业务中构建了突破性的GFS,从此文件系统进入分布式时代。除此之外,Google在GFS上如何快速分析和处理数据方面开创了MapReduce并行计算框架,让以往的高端服务器计算变为廉价的x86集群计算,也让许多互联网公司能够从IOE(IBM小型机、Oracle数据库以及EMC存储)中解脱出来,Google虽然没有将其核心技术开源,但是这三篇论文已经向开源社区指明了方向。得益于Google的启发,Doug Cutting使用Java语言对Google的云计算核心技术(主要是GFS和MapReduce)做了开源的实现。后来,Apache基金会整合Doug Cutting以及其他IT公司(如Facebook等)的贡献成果,开发并推出了Hadoop生态系统。

【Hadoop的四大特性】

1、 可扩展(Scalable):hadoop的分布式存储和分布式计算是在集群节点完成的,可以方便地扩展到数以千计的节点中。
2、 低成本(Economical):可以通过普通机器组成的服务器群来分发以及处理数据。这些服务器群总计可达数千个节点。而且每个节点都是运行在开源操作系统Linux上面的。
3、 高效率(Efficient):通过分发数据,hadoop可以在数据所在的节点上并行地(parallel)处理它们,这使得数据处理非常的快速。
4、 高可靠性(Reliable):hadoop能自动地维护数据的多份复制,并且在任务失败后能自动地重新部署(redeploy)计算任务。

【Hadoop生态圈主要项目】

Hadoop Common:一组分布式文件系统和通用I/O的组件与接口(序列化、Java RPC和持久化数据结构),用于支持其他Hadoop模块。
MapReduce:并行计算框架,非常适合在大量计算机组成的分布式并行环境里进行数据处理。
HDFS:分布式文件系统,有着高容错性特点,设计用来部署在低廉的硬件上,适合那些有着超大数据集的应用程序。
Zookeeper:一个分布式、高性能的协调服务,提供分布式锁之类的基本服务用于构建分布式应用。
HBase:一个分布式、按列存储数据库,使用HDFS作为底层存储,同时支持MapReduce的批量式计算和点查询(随机读取)。
Pig:一种数据流语言和运行环境,用以检索非常大的数据集,运行在MapReduce和HDFS的集群上。
Hive:数据仓库工具,提供基于SQL的查询语言(运行时翻译成MapReduce作业)用于数据的离线分析。
Mahout:一个在Hadoop上运行的可扩展的机器学习算法和数据挖掘类库。
Avro:一种支持高效、跨语言的RPC以及永久存储数据的序列化系统。
Sqoop:在传统数据库和HDFS之间高效传输数据的工具。

【HDFS 概览】

HDFS是一个Apache Software Foundation项目,是Apache Hadoop项目的一个子项目。HDFS非常适于存储和管理大型数据(GB、TB、PB级),HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。
HDFS的设计思想“一次写入,多次读取(write-once-read-many)”,一个数据集一旦由数据源生成,就会被复制分发到不同的存储节点中,然后响应各种各样的数据分析任务请求。HDFS处理的应用一般是批处理,而不是用户交互式处理,注重的是数据的吞吐量而不是数据的访问速度。
HDFS特点:高容错性、高吞吐量、故障的检测和自动快速恢复、流式的数据访问、大数据集、一次写入,多次读写
HDFS不适用的场景:不适合大量小文件的存储、不适合随机读写、不支持对文件随机修改。

【Hadoop构造模块】

运行Hadoop的意思其实就是运行一组守护进程(daemons),每个进程都有各自的角色,有的仅运行在单个服务器上,有的则运行在集群多个服务器上,包括:
NameNode:整个文件系统的管理节点,负责文件系统名字空间(NameSpace)的管理与维护,同时负责客户端文件操作的控制以及具体存储任务的管理与分配。
Secondary NameNode:负责监控HDFS状态的辅助后台程序,与NameNode通讯,定期保存HDFS元数据快照。
DataNode:提供真实文件数据的存储服务,负责处理文件系统客户端的读写请求。
JobTracker:每个集群只有一个JobTracker守护进程,是用于处理作业的后台程序,决定有哪些文件参与作业处理,分配task执行的节点,监控task并重启失败的task。
TaskTracker:管理各自所在节点上的task,与DataNode进行数据交互负责执行具体的任务。

【HDFS架构】

HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。


HDFS Architecture.png

【HDFS的高可用(HA)机制】

Hadoop2.X版本之前,NameNode是HDFS集群的单点故障点(SPOF)
影响HDFS集群不可用主要包括两种情况:1、类似机器宕机这样的意外情况将导致集群不可用,只有重启NameNode之后才可使用。2、计划内的软件或硬件升级(NameNode节点),将导致集群在短时间范围内不可用
一个典型的HA(High Availability)集群,两个单独的机器配置为NameNode,在任何时候,一个NameNode处于活动状态,另一个处于待机状态,活动NameNode负责处理集群中所有客户端的操作,待机时仅仅作为一个Slave,保持足够的状态,如果有必要提供一个快速的故障转移机制。
为了提供快速的故障转移,必须保证备用节点有最新的集群中块的位置信息,为了达到这一点,DataNode节点需要配置两个NameNode的位置,同时发送块的位置信息和心跳信息到两个NameNode。
同时为了防止"脑裂场景"的出现,必须为共享存储配置至少一个fencing方法。在宕机期间,如果不能确定之间的活动节点已经放弃活动状态,fencing进程负责中断以前的活动节点编辑存储的共享访问,这可以防止任何进一步的修改名字空间,允许新的活动节点安全地进行故障转移。

【HDFS的心跳机制】

主节点和从节点之间的通信是通过心跳机制(HeartBeat)实现的,如NameNode与DataNode之间,JobTracker和TaskTracker之间。所谓“心跳”是一种形象化描述,指的是持续的按照一定频率在运行,类似于心脏在永无休止的跳动。客户端每隔几分钟发送一个固定信息给服务端,服务端收到后回复一个固定信息如果服务端几分钟内没有收到客户端信息则视客户端断开。Namenode周期性地从集群中的每个Datanode接收心跳信号和块状态报告(Blockreport)。接收到心跳信号意味着该Datanode节点工作正常。Tasktracker周期性的向JobTracker发送心跳汇报节点和任务状态信息,及时让Jobtracker获取各个节点上的资源使用情况和任务运行状态。

【HDFS 联邦(Federation)】

HDFS Federation是解决NameNode单点问题的一种水平横向扩展方案。主要解决几个问题:
1、命名空间的扩展。在HDFS Federation的情况下,元数据的管理与存放被分隔开,但真实数据的存储还是共用。随着集群使用时间的加长,HDFS上存放的数据也将会越来越多.这个时候如果还是将所有的数据都往一个NameNode上存放,这个文件系统会显得非常的庞大。这时候可以进行横向扩展,把一些大的目录分离出去,使得每个NameNode下的数据看起来更加的精简。
2、性能提升。当NameNode所持有的数据量达到了一个非常大规模的量级的时候(比如超过1亿个文件),NameNode的处理效率会受到影响,比较容易会陷入繁忙的状态。而整个集群将受限于一个单点NameNode的处理效率,从而影响集群整体的吞吐量。采多NameNode机制可以减轻压力。
3、资源的隔离。通过多个命名空间,将关键数据文件目录移到不同的NameNode上,避免这些关键数据的读写操作受到其他普通文件读写操作的影响,也就是说这些NameNode将会只处理特定的关键的任务所发来的请求,而屏蔽了其他普通任务的文件读写请求,以此做到了资源的隔离。

【HDFS安全模式】

安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略进行必要的复制或者删除部分数据块。
设计安全模式的目的在于:HDFS启动过程中,NameNode还无法获取DataNode上各数据块的状态,无法保证可以正常对外提供数据存储服务。为保护系统安全和数据的完整,在此期间不对外提供服务(不允许对文件修改、删除)。待NameNode完全获知各DataNode上各数据块的状态,并根据策略完成必要的复制或删除数据块后,再退出安全模式,对外开始提供服务。何时退出安全模式?启动过程中,各DataNode向NameNode上报各个数据块的状态(含副本数)。当NameNode检测到达到最小副本数(dfs.replication.min)的数据块比率达到99.9%(可通过参数配置)时,自动退出安全模式。

【Hadoop的三种运行模式】

1、单机(本地)模式
这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统。在单机模式(standalone)中不会存在守护进程,所有东西都运行在一个JVM上。单机模式适用于开发过程中运行MapReduce程序,在单机模式下调试MR程序非常高效方便,这也是最少使用的一个模式。
2、伪分布式模式
这种模式在一台单机上运行,但用不同的Java进程模仿分布式运行中的各类节点,模拟一个小规模的集群。伪分布式适用于开发和测试环境,在这个模式中,所有守护进程都在同一台机器上运行。
3、完全分布式模式
这种模式通常被用于生产环境,使用N台主机组成一个Hadoop集群,Hadoop守护进程运行在各台主机之上。这里会存在Namenode运行的主机,Datanode运行的主机,以及resourcemanager运行的主机等。在分布式环境下,主节点和从节点会分开。

【HDFS元数据】

NameNode在内存中保存着整个文件系统的名字空间和文件数据块映射等元数据。如果NameNode宕机,那么整个集群就瘫痪了,所以需要对这些元数据进行持久化存储。
元数据,正所谓数据的数据,包含有三类重要信息:
第一类是文件和目录自身的属性信息,例如文件名、目录名、父目录信息、文件大小、创建时间、修改时间等。
第二类记录文件内容存储相关信息,例如文件块情况、副本个数、每个副本所在的Data Node 信息等。
第三类用来记录HDFS中所有DataNode信息,用于DataNode管理。
HDFS元数据存储机制:内存中有一份完整的元数据(内存meta data),磁盘有一个“准完整”的元数据镜像(fsimage)文件(在namenode的工作目录中)、以及用于衔接内存metadata和持久化元数据镜像fsimage之间的操作日志(edits文件),当客户 端对hdfs中的文件进行新增或者修改操作,操作记录首先被记入edits日志文件中,当客户端操作成功 后,相应的元数据会更新到内存meta.data中。

【HDFS元数据持久化原理】

上一篇说到HDFS文件系统的命名空间等元数据是由NameNode来存储的,元数据保存着HDFS系统的重要信息。
NameNode用事务日志(EditsLog)来持久化每一个对文件系统的元数据的改变,即对元数据的每一步操作都会被记录到EditsLog中.NameNode在本地文件系统中用一个文件来存储这个EditsLog,完整的文件系统名字空间、文件块的映射和文件系统的配置都存在一个叫Fsimage的文件中,Fsimage也是在NameNode的本地文件系统中。CheckPoint(检查点):当NameNode启动的时候,它会从磁盘中读取Fsimage和EditsLog文件,然后将新的元数据刷新到本地磁盘中,生成一个新的Fsimage文件,至此EditsLog文件已经被处理并持久化的Fsimage中,任何对Fsimage和EditsLog的更新都会同步地更新每一个副本。如果NameNode宕机或是重启,内存中没有元数据,那hdfs重新启动的时候,数据就从fsimage和edits这两个文件中加载,恢复系统之前的状态。

【HDFS读写流程】

HDFS采用master/slave架构。一个HDFS集群是由多个Namenode和一定数目的Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS中的文件是一次性写入的,并且严格要求在任何时候只能有一个写入者。
文件写入过程:1.Client向NameNode发起文件写入的请求。2 .NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。3. Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。
文件读取过程:1. Client向NameNode发起文件读取的请求。2. NameNode返回文件存储的DataNode的信息。3. Client读取文件信息。

【HDFS副本机制】

副本技术即分布式数据复制技术,是分布式计算的一个重要组成部分。该技术允许数据在多个服务器端共享,一个本地服务器可以存取不同物理地点的远程服务器上的数据,也可以使所有的服务器均持有数据的拷贝。副本机制有一下优点:
1、提高系统可靠性,系统不可避免的会产生故障和错误,拥有多个副本的文件系统不会导致无法访问的情况,从而提高了系统的可用性。另外,系统可以通过其他完好的副本对发生错误的副本进行修复,从而提高了系统的容错性。2、负载均衡,副本可以对系统的负载量进行扩展。多个副本存放在不同的服务器上,可有效的分担工作量,从而将较大的工作量有效的分布在不同的站点上。
提高访问效率:将副本创建在访问频度较大的区域,即副本在访问节点的附近,相应减小了其通信开销,从而提高了整体的访问效率。
HDFS中的默认三副本机制(三个以上的随机存储) ,第一副本:如果上传节点是DN,则上传该节点;如果上传节点是NN,则随机选择DN ;第二副本:放置在不同机架的DN上 ;第三副本:放置在与第二副本相同机架的不同DN上

【Hadoop机架感知策略】

在分布式集群下,由于机架的的槽位和交换机网口数量的限制,使得集群上的机器不得不跨越机架,通常一个大型的集群会跨越很多机架。一般情况机架内机器的通讯会快于跨机架机器之间的通讯,并且机架之间机器的网络通信通常受到上层交换机间网络带宽的限制。通过机架感知,可以带来性能和安全性的提升。没有配置机架信息时,所有的机器hadoop都默认在同一个默认的机架下,名为/default-rack,这种情况下,任何一台 datanode机器,不管物理上是否属于同一个机架,都会被认为是在同一个机架下,此时就很容易出现增加机架间网络负载的情况。当配置了机架感知信息以后,hadoop在选择三个datanode时就充分考虑副本机制存放策略,将副本分散在不同机架下,尽量地减少网络带宽资源的消耗。

【MapReduce简介】

MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题。MapReduce的核心,就是对一个需要计算的任务进行拆分,然后并行处理。MapReduce合并了两种经典函数:映射(Mapping)对集合里的每个目标应用同一个操作。化简归约(Reducing)遍历集合中的元素来返回一个综合的结果。首先Client向JobTracker提交一个任务。JobTracker将任务分配到一个或者多个TaskTracker进行处理。不同的TaskTracker上,有的运行的是Map阶段的任务,有的运行是Reduce阶段的任务。对于map阶段,首先对输入的内容进行分割(InputSplit),不同Mapper任务负责各自的分割后的内容的映射。对于Reduce阶段,接受多个Mapper的输出,进行归一后,得到最终的输出。

【MapReduce执行步骤】

  1. map任务处理
    1.1读取输入文件内容,对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。
    1.2写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
    1.3对输出的key、value进行分区。
    1.4对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。
    1.5(可选)分组后的数据进行归约。
    2.reduce任务处理
    2.1对多个map任务的输出,按照不同的分区,通过网络传输到不同的reduce节点。
    2.2对多个map任务的输出进行合并、排序。执行reduce函数的具体数据处理逻辑,对输入的key、value处理,转换成新的key、value输出。
    2.3将reduce的计算结果输出保存到文件中。

【MapReduce的主要设计思想和特征】

1、向“外”横向扩展,而非向“上”纵向扩展(Scale “out", not “up”)
即MapReduce集群的构筑选用价格便宜、易于扩展的大量低端商用服务器,而非价格昂贵、不易扩展的高端服务器。
对于大规模数据处理,由于有大量数据存储需要,基于低端服务器的集群远比基于高端服务器的集群优越。
2、失效被认为是常态(Assume failures are common)
MapReduce集群中使用大量的低端服务器,因此节点硬件失效和软件出错是常态。
MapReduce并行计算软件框架使用了多种有效的机制,如节点自动重启技术,使集群和计算框架具有对付节点失效的健壮性,能有效处理失效节点的检测和恢复。当失效节点恢复后能自动无缝加入集群,不会因为节点失效而影响计算服务的质量。
3、处理向数据迁移(Moving processing to the data)
MapReduce采用了数据/代码互定位的技术方法,计算节点尽量负责计算其本地存储的数据,以发挥数据本地化特点(locality),仅当节点无法处理本地数据时,再采用就近原则寻找其它可用计算节点,并把数据传送到该可用计算节点。
4、顺序处理数据、避免随机访问数据(Process data sequentially and avoid random access)
5、为应用开发者隐藏系统层细节(Hide system-level details from the application developer)
大规模数据处理时程序员需要考虑诸如数据分布存储管理、数据分发、数据通信和同步、计算结果收集等诸多细节问题�。MapReduce提供了一种抽象机制隔离系统层细节,以致力于应用本身的算法设计。

【MapReduce提供的主要功能】

1、任务调度:计算作业(job)被细分为多个计算任务(tasks), 为任务分配计算节点; 同时负责监控节点的执行状态和计算性能优化处理, 如对最慢的计算任务采用多备份执行、选最快完成者作为结果。
2、数据/代码互定位:减少数据通信,本地化数据处理,即一个计算节点尽可能处理其本地磁盘上所分布存储的数据,实现了代码向数据的迁移;当无法进行这种本地化数据处理时,尽可能就近寻找数据以减少通信延迟。
3、出错处理:MapReducer能检测并隔离出错节点,将调度分配新的节点接管出错节点的计算任务
�4、Combiner和Partitioner:为了减少数据通信开销,中间结果数据进入reduce节点前需要进行合并(combine)处理,把具有同样主键的数据合并到一起避免重复传送; 一个reducer节点所处理的数据可能会来自多个map节点。因此, map节点输出的中间结果需使用一定的策略进行适当的划分(partitioner)处理,保证相关数据发送到同一个reducer节点。

【Mapreduce之JobTracker】

JobTracker主要负责资源监控和作业调度。JobTracker监控所有TaskTracker与作业的健康状况,一旦发现失败情况后,其会将相应的任务转移到其它节点。同时,JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务使用这些资源。在Hadoop中,任务调度器是一个可插拔的模块,用户可以根据自己的需要设计相应的调度器。

【Mapreduce之TaskTracker】

TaskTracker会周期性地通过Heartbeat将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker发送过来的命令并执行相应的操作(例如启动新任务、杀死任务等)。TaskTracker使用“slot”等量划分本节点的数量,“slot”代表计算资源(CPU、内存等)。一个Task获取到一个slot后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。Slot分为Map slot和Reduce slot两种,分别提供Map Task和Reduce Task。TaskTracker通过slot数目限定Task的并发度。

【Mapreduce之Task】

Task分为Map Task和Reduce Task两种,均由TaskTracker启动。HDFS以固定大小的block为基本单位存储数据,而对于MapReduce而言,其处理基本单位是分片(split)。split是一个逻辑概念,它只包含一些元数据信息,比如数据起始位置、数据长度、数据所在节点等等。它的划分方法完全由用户自己决定,但是建议split的划分大小与HDFS的block大小一致。但需要注意的是,split的多少决定Map Task的数目,因为每个split会交由一个Map Task处理。因此,合理地设置Job中Tasks数的大小能显著的改善Hadoop执行的性能。增加task的个数会增加系统框架的开销,但同时也会增强负载均衡并降低任务失败的开销。

【经典MapReduce(MRv1)的局限性】

经典MapReduce的最严重的限制主要在于可伸缩性、资源利用和对与MapReduce不同的工作负载的支持。在MapReduce框架中,作业执行受JobTracker和TaskTracker进程控制。大型的Hadoop集群会出现单个JobTracker导致的可伸缩性瓶颈。
此外,较小和较大的Hadoop集群都从未最高效地使用他们的计算资源。在HadoopMapReduce中,每个从属节点上的计算资源由集群管理员分解为固定数量的map和reduceslot,这些slot不可替代。设定mapslot和reduceslot的数量后,节点在任何时刻都不能运行比mapslot更多的map任务,即使没有reduce任务在运行。这影响了集群的利用率,因为在所有mapslot都被使用时,无法再使用任何reduceslot,即使它们可用,反之亦然。并且Hadoop设计为仅运行MapReduce作业。随着替代性的编程模型的出现,除MapReduce外,越来越需要为可通过高效的、公平的方式在同一个集群上运行并共享资源的其他编程模型提供支持。

【YARN:下一代Hadoop计算平台】

YARN(YetAnotherResourceNegotiator)是Hadoop2.0版本为集群引入的一个资源管理层。基本思想是将JobTracker的两个主要功能:资源管理作业调度和监控分离,它将JobTracker守护进程的职责分离了出来。其中资源管理器(ResourceManager,RM)用来代替集群管理器,ApplicationMaster(AM)代替一个专用且短暂的JobTracker,节点管理器(NodeManager,NM)代替TaskTracker,一个分布式应用程序代替一个MapReduce作业。与第一版Hadoop中经典的MapReduce引擎相比,YARN在可伸缩性、效率和灵活性上有着明显的优势。小型和大型Hadoop集群都从YARN中受益匪浅。对于开发人员来说这些更改几乎也是透明的,因此可以使用相同的MapReduceAPI和CLI运行未经修改的MapReduce作业。

【YARN:Container】

Container是YARN中的资源抽象,它封装了某个节点上的多维资源,如CPU、内存、磁盘、网络等。当ApplicationMaster向资源管理器RM申请资源时,RM向AM返回的资源便是用Container表示的。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。Container是一个动态资源划分单位,是根据应用程序的需求自动生成的。目前,YARN仅支持CPU和内存两种资源。既然一个Container指的是具体节点上的计算资源,这就意味着Container中必定含有计算资源的位置信息:计算资源位于哪个机架的哪台机器上。所以应用在请求某个Container时,其实是向某台机器发起请求,请求这台机器上的CPU和内存资源。任何一个job或application必须运行在一个或多个Container中,在Yarn框架中,ResourceManager只负责告诉ApplicationMaster哪些Containers可以用,ApplicationMaster还需要去找NodeManager请求分配具体的Container。

【YARN:ResourceManager(RM)】

RM是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)。(1)调度器(分配Container)根据容量、队列等限制条件,将系统中的资源分配给各个正在运行的应用程序。它不再从事任何与具体应用程序相关的工作,比如不负责监控或者跟踪应用的执行状态等,也不负责重新启动因应用执行失败或者硬件故障而产生的失败任务,这些均交由应用程序相关的ApplicationMaster完成。调度器仅根据各个应用程序的资源需求进行资源分配。此外,该调度器是一个可插拔的组件,用户可根据自己的需要设计新的调度器,YARN提供了多种直接可用的调度器,比如Fair Scheduler和Capacity Scheduler等。(2)应用程序管理器,负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动等。

【YARN:ApplicationMaster(AM)和NodeManager(NM)】

在用户提交一个应用程序时,ApplicationMaster 作为轻量型进程实例会启动来协调应用程序内的所有任务的执行。这包括监视任务,重新启动失败的任务,推测性地运行缓慢的任务,以及计算应用程序计数器值的总和。这些职责以前分配给所有作业的单个 JobTracker。ApplicationMaster 和属于它的应用程序的任务,在受 NodeManager 控制的资源容器中运行。NodeManager(NM)则是每个节点上的资源和任务管理器。一方面,它定时地向RM汇报本节点的资源使用情况和Container运行状态;另一方面,它接受并处理来自AM的Container启动/停止等各种请求。NodeManager没有固定数量的map和reduce slots,它是TaskTracker的一种更加普通和高效的版本。

44. 【数据库 VS 数据仓库】

数据库和数据仓库其实是一样的或者及其相似的,都是通过某个数据库软件,基于某种数据模型来组织、管理数据。数据库通常更关注业务交易处理(OLTP),而数据仓库更关注数据分析层面(OLAP),由此产生的数据库模型上也会有很大的差异。
数据库通常追求交易的速度,交易完整性,数据的一致性等,在数据库模型上主要遵从范式模型,从而尽可能减少数据冗余,保证引用完整性。数据仓库是一个面向主题的(Subject Oriented),集成的(Integrate),相对稳定的(Non-volatile),反映历史变化(Time Variant)的数据集合,用于支持管理决策。主要区别在于:数据库是面向事务的设计,数据仓库是面向主题设计的;数据库一般存储在线交易数据,数据仓库存储的一般是历史数据;数据库设计是尽量避免冗余,数据仓库在设计时有意引入冗余;数据库是为了捕获数据而设计,数据仓库是为了分析数据而设计;

45. 【Hive简介】

Hive是基于Hadoop的一个数据仓库工具。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制,可以将结构化的数据文件映射为一张数据库表。Hive 定义了简单的类SQL查询语言,称为HQL,可以将sql语句转换为MapReduce任务进行运行,它允许熟悉SQL的用户查询数据,其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。同时,这个语言也允许熟悉MapReduce开发者的开发自定义的mapper 和reducer来处理内建的mapper和reducer无法完成的复杂的分析工作。

46. 【Hive体系架构】

Hive是客户端服务器(C/S)模式。
服务端组件:
Driver组件:该组件包括Complier、Optimizer和Executor,它的作用是将我们写的HiveQL(类SQL)语句进行解析、编译优化,生成执行计划,然后调用底层的mapreduce计算框架。
Metastore组件:元数据服务组件,这个组件存储hive的元数据,hive的元数据存储在关系数据库里,hive支持的关系数据库有derby、mysql。元数据对于hive十分重要,因此hive支持把metastore服务独立出来,安装到远程的服务器集群里,从而解耦hive服务和metastore服务,保证hive运行的健壮性。
Thrift服务:thrift是facebook开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,hive集成了该服务,能让不同的编程语言调用hive的接口。
客户端组件:
CLI:command line interface,命令行接口。
Thrift客户端:hive架构的许多客户端接口是建立在thrift客户端之上,包括JDBC和ODBC接口。
WEBGUI:hive客户端提供了一种通过网页的方式访问hive所提供的服务。这个接口对应hive的hwi组件(hive web interface),使用前要启动hwi服务。

47. 【Hive特点】

1、Hive 通过类 SQL 来分析大数据,而避免了写 MapReduce 程序来分析数据,这样使得分析数据更容易
2、将数据映射成数据库和一张张的表,库和表的元数据信息一般存在关系型数据库上(比如 MySQL)
3、本身并不提供数据的存储功能,数据一般都是存储在 HDFS 上的(对数据完整性、格式要求并不严格)
4、容易扩展自己的存储能力和计算能力,这个是继承自 hadoop (适用于大规模的并行计算)
5、Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数
6、良好的容错性,节点出现问题SQL仍可完成执行
7、专为 OLAP(在线分析处理) 设计,不支持事务

48. 【Hive数据模型】

Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织Hive中的表,只需要在创建表的时候告诉
Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。Hive中所有的数据都存储在HDFS中,Hive中包含以下数据模型:表(Table),外部表(ExternalTable),分区(Partition),桶(Bucket)。
表:Hive中的Table和数据库中的Table在概念上是类似的,每一个Table在Hive中都有一个相应的目录存储数据。
外部表:指向已经在HDFS中存在的数据,和Table在元数据的组织上是相同的,但实际数据的存储则有较大的差异。当删除一个外部表时,仅删除元数据,表中的数据不会真正被删。
分区:在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中。方便对表的管理以及提高查询效率。
桶:Buckets对指定列计算hash,根据hash值切分数据,目的是为了并行,每一个Bucket对应一个文件。

49. 【Hive部署方式】

1、内嵌模式:使用内嵌的Derby数据库作为存储元数据,Derby只能接受一个Hive会话的访问,不能用于生产; hive服务、metastore服务、derby服务运行在同一个进程中。
2、本地模式:本地安装mysql,替代derby存储元数据,是一个多用户多客户端的模式,作为公司内部使用Hive;hive服务和metastore服务运行在同一个进程中,mysql数据库则是单独的进程,可以同一台机器,也可以在远程机器上。
3、远程模式(Remote): 远程安装mysql 替代derby存储元数据;Hive服务和metastore在不同的进程内,也可能是不同的机器;

50. 【Hive常用的文件存储格式】

  1. textfile:文本文件
    Hive默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
  2. Sequencefile:二进制文件
    SequenceFile是Hadoop API 提供的一种二进制文件,它将数据(key,value)的形式序列化到文件中。
    这种二进制文件内部使用Hadoop的标准的Writable接口实现序列化和反序列化。它与Hadoop API中的MapFile是互相兼容的。
    Hive中的SequenceFile继承自Hadoop API 的SequenceFile,不过它的key为空,使用value 存放实际的值, 这样是为了避免MR 在运行map阶段的排序过程。
  3. Rcfile:
    RCFile是Hive推出的一种专门面向列的数据格式。 它遵循“先按列划分,再垂直划分”的设计理念。
    当查询过程中,针对它并不关心的列时,它会在IO上跳过这些列。但在读取所有列的情况下,RCFile的性能反而没有SequenceFile高。

51. 【Hive数据类型】

  1. 基础数据类型,与关系型数据库类似:
    TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY,TIMESTAMP,DECIMAL,CHAR,VARCHAR,DATE。
  2. 复杂数据类型:
    包括ARRAY,MAP,STRUCT,UNION,这些复杂类型是由基础类型组成的。
    ARRAY:ARRAY类型是由一系列相同数据类型元素组成的,这些元素可以通过下标来访问。比如有一个ARRAY类型的变量fruits,它是由[‘apple’,’orange’,’mango’]组成,那么可以通过fruits[1]来访问orange;
    MAP:MAP包含key->value键值对,可以通过key来访问元素。比如"userlist"是一个map类型(其中username是key,password是value),那么我们可以通过userlist[‘username’]来得到这个用户对应的password;
    STRUCT:STRUCT可以包含不同数据类型的元素。这些元素可以通过点的方式来得到,比如user是一个STRUCT类型,那么可以通过user.address得到这个用户的地址。

52. 【Hive HQL】

hive中的HQL是一种SQL方言,支持绝大部分SQL-92标准,并对其做了一些扩展。
数据库操作:
创建数据库:hive > CREATE DATABASE IF NOT EXISTS test;
查看某个已存在的数据库:hive> DESCRIBE DATABASE test;
表操作:
CREATE TABLE IF NOT EXISTS test.student(
name STRING COMMENT 'student name',
age INT COMMENT 'student age')
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/user/hive/warehouse/test.db/student';
查看表:hive> DESC FORMATTED student
删除表:hive> DROP TABLE IF EXISTS test
增加表分区:hive> ALTER TABLE test ADD PARTITION(x=x1,y=y2) LOCATION '/USER/TEST/X1/Y1'
删除表分区:hive> ALTER TABLE test DROP PARTITION(x=x1,y=y2)
更多关于HQL详细语法可参考Hive官方使用手册说明:https://cwiki.apache.org/confluence/display/Hive/LanguageManual

53. 【hive大表关联查询数据倾斜解决方案】

倾斜原因:
map输出数据按key Hash的分配到reduce中,由于key分布不均匀、业务数据本身的特性、建表时考虑不周、以及SQL语句编写不当等原因造成的reduce 上的数据量差异过大。
解决方案

  1. 参数调节:
    hive.map.aggr = true
    hive.groupby.skewindata=true
    有数据倾斜的时候进行负载均衡,当选项设定位true,生成的查询计划会有两个MR Job。第一个MR Job中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果按照Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个Reduce中),最后完成最终的聚合操作。
  2. SQL 语句调节:
    1)、选用join key分布最均匀的表作为驱动表。做好列裁剪和filter操作,以达到两表做join 的时候,数据量相对变小的效果。
    2)、大小表Join:
    使用map join让小的维度表(1000 条以下的记录条数)先进内存。在map端完成reduce.
    4)、大表Join大表:
    把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null 值关联不上,处理后并不影响最终结果。
    5)、count distinct大量相同特殊值:
    采用sum() group by的方式来替换count(distinct)完成计算。

【数据库事务四要素】

原子性(Atomicity):一个事务要么全部执行,要么全部不执行。一个事务不可能只执行了一半就停止了。比如一个事情分为两步完成才可以完成,那么这两步必须同时完成,要么一步也不执行,绝不会停留在某一个中间状态。如果事物执行过程中,发生错误,系统会将事物的状态回滚到最开始的状态。
一致性(Consistency):事务的运行并不改变数据库中数据的一致性。无论并发事务有多少个,必须保证数据从一个一致性的状态转换到另一个一致性的状态。例如有 a、b 两个账户,分别都是10。当a增加5时,b也会随着改变,总值20是不会改变的。
隔离性(Isolation):指两个以上的事务不会出现交错执行(可能会导致数据不一致)的状态。如果有多个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
持久性(Durability):事务执行成功以后,该事务对数据库所作的更改永久保存在数据库中,不会无缘无故的回滚。

【行存储和列存储】

行式存储把一行中的数据值串在一起存储起来,然后再存储下一行的数据,以此类推。行存储适合数据存储写入、更新较多的场景,比如OLTP。当数据量很大时,查询性能远不及列存储。像SQLserver,Oracle,mysql等传统数据库属于行式数据库范畴。列式存储把一列中的数据值串在一起存储起来,然后再存储下一列的数据,以此类推。列存储不适合数据频繁写入、更新的场景,主要适合频繁查询的场景,大数据环境下优势更明显,比如分布式实时查询。由于查询中的选择规则是通过列来定义的,因此整个数据库是自动索引化的。按列存储每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量,同字段的数据聚集存储,也容易为这种聚集存储设计更好的压缩、解压算法,降低系统IO。Greenplum、Vertica、Hbase等属于列式数据库。

【HBase 简介】

Apache HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC上搭建起大规模存储集群。
HBase利用Hadoop HDFS作为其文件存储系统,基于行键、列键和时间戳建立索引,是一个可以随机访问存储和检索数据的"NoSQL" 数据库。HBase不限制存储的数据的种类,允许动态的、灵活的数据模型,不用SQL语言,也不强调数据之间的关系。HBase被设计成在一个服务器集群上运行,可以非常方便地横向扩展。
适用场景于场景:存在高并发读写、表结构的列族经常需要调整、存储结构化或半结构化数据、高并发的key-value存储、key随机写入,有序存储、针对每个key对应的值需要多版本保存。

【Hbase 特点】

1、海量存储
Hbase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据。
2、列式存储
数据在表中是按某列的数据聚集存储,数据即索引,只访问查询涉及的列时,可以大量降低系统的I/O
3、易扩展
HBase底层基于HDFS,支持扩展,并且可以随时添加或者减少节点。
4、高可靠:基于zookeeper的协调服务,能够保证服务的高可用行。HBase使用WAL和replication机制,前者保证数据写入时不会因为集群异常而导致写入数据的丢失,后者保证集群出现严重问题时,数据不会发生丢失和损坏。
5、稀疏存储
传统行数存储的数据存在大量NULL的列,也需要占用存储空间,造成存储空间的浪费,在列族中HBase为空的列并不占用空间,因此表可以设计的很稀疏。
6、高性能
底层的LSM数据结构、Region分区、RowKey有序排列、主键索引和缓存机制使得HBase支持高并发用户数的高速读写访问。

【Hbase 表逻辑结构】

表(table):划分数据集合的概念,和传统的db中的表的概念是一样的。
行键(RowKey):一行数据的唯一标示,要想操作(read/write)一条数据,必须通过行键,任何字符串都可以作为行键。表中的行根据行键进行排序存储。
列族(columnFamily):简单的认为是一系列“列”的集合。列族是以单独的文件进行存储。
列限定符(columnQualifier):列族中的数据定位通过列限定符,每个列族可以有一个或多个列成员(ColumnQualifier),列成员不需要在表定义时给出,新的列族成员可以随后按需、动态加入。
单元格(cell):由行键,列族:限定符,时间戳唯一决定,Cell中的数据是没有类型的,全部以字节码形式存贮,主要用来存储数据。
时间戳(Timestamp):每个值都会有一个timestamp,作为该值特定版本的标识符。默认情况下,timestamp代表了当数据被写入的时间,但也可以在把数据放到cell时指定不同的timestamp。

【HBase 相关模块】

HBaseMaster:用于协调多个RegionServer,侦测各个RegionServer之间的状态,并平衡RegionServer之间的负载。负责分配Region给RegionServer。HBase允许多个Master节点共存,但只有一个Master是提供服务的,其他的Master节点处于待命的状态。当正在工作的Master节点宕机时,其他的Master则会接管HBase的集群。
RegionServer:一个RegionServer包括了多个Region。RegionServer的作用只是管理表格,以及实现读写操作。Client直接连接RegionServer获取HBase中的数据。Region是真实存放HBase数据的地方,Region是HBase并行化的基本单元。如果当一个表格很大,并由多个CF组成时,那么表的数据将存放在多个Region,并且在每个Region中会关联多个存储的单元(Store)。
Zookeeper:作为HBaseMaster的HA解决方案。保证了至少有一个HBaseMaster处于运行状态。并且Zookeeper负责Region和RegionServer的注册。

【HBase 使用建议】

首先一点必须谨记:HBase并不适合所有问题,其设计目标并不是替代RDBMS,而是对RDBMS的一个重要补充,尤其是对大数据的场景。首先,要有足够多数据,如有上亿或上千亿行数据,HBase才会是一个很好的备选。其次,需要确保业务上可以不依赖RDBMS的额外特性,例如,列数据类型,二级索引,SQL查询语言等。再而,需要确保有足够硬件规模。比如集群小于5个节点时并不能发挥出应有的性能。一个HBase数据库是否高效,很大程度会和Row-Key的设计有关。因此,如何设计Row-key是使用HBase时一个非常重要的话题。随着数据访问方式的不同,Row-Key的设计也会有所不同。概括起来宗旨只有一个,那就是尽可能使数据均匀的分布在集群中。例如当客户端需要频繁的写一张表,随机的RowKey会获得更好的性能。当客户端需要频繁的读一张表,有序的RowKey则会获得更好的性能。对于时间连续的数据(例如log),有序的RowKey会能方便查询一段时间的数据(Scan操作)。

【HBase与RDBMS的对比】

HBase适合于非结构化数据存储的数据库。与传统数据库主要区别如下:
数据类型:HBase只有简单的字符类型,所有的类型都是交由用户自己处理,它只保存字符串。而关系数据库有丰富的类型和存储方式;
数据操作:HBase只有很简单的插入、查询、删除、清空等操作,表和表之间是分离的,没有复杂的表和表之间的关系,而传统数据库通常有各式各样的函数和连接操作;
存储模式:HBase基于列存储,每个列族由几个文件保存,不同列族的文件是分离的。传统的关系数据库是基于表格结构和行模式保存的;
可伸缩性: HBase能够容易的增加或者减少硬件数量;
数据维护:HBase更新操作时,旧的版本仍然保留,实际上时插入了新数据。传统关系数据库是替换修改。

【HBase表的设计(RowKey的设计)】

Rowkey的设计一般都是根据具体业务需求来的,总的来说,需要根据rowkey的字典序排列,唯一性特性设计出高效读取和负载均衡的rowkey,以下是几个大概的设计原则:
长度原则:越小越好,最长不能超过64kb,一般10-100个字节;
个数原则:指列簇的个数,尽量控制在2个以内;
散列原则:region是根据rowkey划分的,那么rowkey的散列就可以使得数据的负载变得均衡,一般来说可以通过 :
加随机前缀、加hash值、rowkey反转等方法;
rowkey唯一原则:必须在设计上保证其唯一性,rowkey是按照字典顺序排序存储的,因此设计rowkey的时候,要充分利用这个排序的特点,将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。 比如:
我们需要某个时间端的数据进行分析,那么以timestamp-key的形式,我们很容易就可以查询到连续的时间段的数据。

【Hbase表的设计(预分区)】

默认的hbase会有一个region,当数据越来越大,那么这个region管理的数据越来越多,当超过阈值就会发生split操作,而split操作会导致我们的hbase有一段不可用的时间,那么为了尽量规避这个问题,所以我们需要预分区。所谓预分区其实就是预先划分好region,每个region都有一个startkey和一个endkey,这样也就确定了这个region所管理的数据的范围。划分原则:首先需要对数据的分布和数据量的增长有一个预测,根据数据量确定分区数,然后再对数据进行合理的rowkey设计,以一个简单的例子来说明:
假设预测数据会有50G,那么划分为5个分区,分别是:[-∞ - 1),[1 - 2),[2 - 3),[3 - 4),[4 - +∞),
rowkey可以设计成 [0-5)的随机数 + key,这样数据就会均匀的分布在预先设计好的分区上。

推荐阅读更多精彩内容