企业级大数据平台构建:架构与实现(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-28 05:39:15

点击下载

作者:朱凯

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

企业级大数据平台构建:架构与实现

企业级大数据平台构建:架构与实现试读:

前言

为什么要写这本书

近年来,大数据这个概念越来越火爆,特别是在国家层面,大数据被提升到了国家战略的高度。在这样的背景下,很多传统企业开始涉足大数据领域并研发自己的大数据技术平台。在这股技术升级与转型的浪潮中,传统领域的程序员纷纷转型投向大数据的怀抱。目前大数据技术开源领域以Hadoop生态构建的技术体系为主。现在市面上有很多与Hadoop体系相关的技术书籍,Hadoop、Spark这类火爆的技术已经有大量优秀的专业书籍进行讲解。但我发现这类书籍多是以纵向的视角去讲解某一类具体的技术,而大数据领域涉及的知识繁多,在构建大数据平台的过程中我们不仅需要精通单个技术组件的知识,还需要拥有横向整合拉通Hadoop体系技术栈的能力。而这类横向拉通Hadoop体系技术栈的书籍并不多见。所以我将自己在构建大数据平台上的一些经验和实践进行了整理,分享给各位读者。希望本书能够为各位读者构建大数据平台或解决方案提供一定的帮助。读者对象

·想了解大数据技术,想进入大数据领域的工程师:作为一个想进入大数据领域的“新人”,你可以通过本书从宏观的视角迅速对大数据的基础设施和技术栈有一个全面的认识和了解。本书可以作为你的入门指南和技术栈索引目录。

·大数据领域的中高级工程师:作为一个大数据领域的中高级工程师,对Hadoop生态体系的技术应该早已运用自如。通过本书的学习,相信你对大数据领域多种技术栈的整合会有一个更深刻的认识。同时本书中的一些平台级方案也会帮助你提升在平台架构方面的造诣。

·平台架构师:作为一个平台架构师,本书中的一些解决方案和设计思路可以作为你进行系统架构的参考资料。本书主要内容

本书从企业的实际需求出发,完整地介绍了构建一个真实可用、安全可靠的企业级大数据平台所需要运用的知识体系,并详细地描述了构建企业级大数据平台的设计方案和实施步骤。

本书逻辑上可分为3大部分,共8章,每个章节循序渐进:

·第一部分(第1、2章)描述了企业级大数据平台的需求和能力。

·第二部分(第3~5章)着重讲述了如何去搭建并配置一个大数据平台,以及如何构建非常重要的平台安全方案。

·第三部分(第6~8章)以实战的形式讲解如何以Java编码的方式实现平台的基础管理功能,以提升其易用性与可用性。

具体各章内容如下:

第1章 阐述企业级大数据平台的重要性,并解释了为什么需要构建一个统一的企业级大数据平台。接着介绍作为一个企业级大数据平台应当具备的能力,并解释其原因。

第2章 介绍通过Hadoop生态体系去构建一个企业级大数据平台可以使用的技术栈,如HDFS、HBase、Spark等,并一一介绍了它们的核心概念。

第3章 介绍集群管理工具Ambari,并站在集群服务器的角度分类解释如何去设计一个Hadoop集群,详细描述了如何使用Ambari来安装、管理和监控一个Hadoop集群。

第4章 介绍企业级大数据平台中非常重要的安全部分。首先阐述了企业级大数据平台面临的一些安全隐患,接着展示了一套初级解决方案并介绍了如何使用Knox和Ranger解决访问控制和数据授权与管理的问题。

第5章 着重介绍Hadoop服务的安全方案,并说明如何通过Kerberos协议等一系列措施来保障Hadoop集群的安全。

第6章 阐述大数据平台在易用性上的一些遗留问题,接着介绍如何通过CAS实现平台的单点登录功能,最后描述如何使用Java程序实现统一的用户管理服务。

第7章 简单阐述服务化的重要性以及如何将大数据平台管理端的功能封装成RESTful服务。首先介绍了如何使用Spring-Boot快速搭建一套RESTful服务的程序框架,接着详细描述如何实现Kerberos用户查询、Hive数据仓库查询和元数据查询等一系列RESTful服务。

第8章 介绍如何使用Java程序实现Spark的任务提交与任务调度功能。首先着重介绍使用Java程序实现Spark任务提交到YARN的三种方式,接着描述如何通过Quartz实现任务调度功能。如何阅读本书

本书内容会涉及大数据领域相关的技术知识,所以假定读者已具有一定的编程经验,了解分布式、多线程、集群等概念。本书部分内容涉及集群服务的实战安装示例,所以需要准备至少两台用于搭建测试环境的Linux服务器或虚拟机。勘误和支持

由于水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。为此,我特意创建了一个提供在线支持与应急方案的站点https://github.com/nauu/bigdatabook。你可以将书中的错误发布在Bug勘误表页面中,如果你遇到任何问题,也可以访问Q&A页面,我将尽量在线上为读者提供最满意的解答。如果你有更多的宝贵意见,也欢迎发送邮件至邮箱yawface@gmail.com或者访问新浪微博http://weibo.com/boness,期待能够得到你们的真挚反馈。致谢

感谢我的家人,如果没有你们的悉心照顾和鼓励,我不可能完成本书。

感谢我的公司远光软件,为我提供了学习和成长的环境,本书中的很多知识都来自工作中的实践。

感谢我的挚友李根,为本书提出了许多宝贵的建议。

感谢我的同事兼伙伴们——解来甲、张琛、杨柯、潘登、胡艺、李国威、陈世宾、陈泽华,以及名单之外的更多朋友,感谢你们在工作中的照顾和支持,十分荣幸能够与你们在这个富有激情和活力的团队共事。

感谢机械工业出版社华章公司的编辑杨福川老师、孙海亮老师,在这一年多的时间中始终支持我的写作,你们的鼓励和帮助引导我顺利地完成全部书稿。朱凯第1章浅谈企业级大数据平台的重要性

不论你愿不愿意承认,大数据时代已经来临了。大数据潮流引领的技术变革正在悄无声息地改变着各行各业。虽说“大数据”是近些年才火热起来的词汇,但可以说“大数据”其实一直存在,只是由于技术的局限性使得人们在很长的一段时间里没有办法能够使用全量数据。但是随着技术的发展与革新,现在人们可以使用大数据技术来处理海量的数据了,这使得很多之前只能停留在理论研究层面的算法和思想现在能够付诸行动,比如现在很火爆的深度学习。与此同时,大数据技术这一新兴的工具也让人们拥有了一种新的思维模式,即大数据思维。

大数据思维注重全量样本数据而不是局部数据,注重相关性而不是因果关系。通过分析和挖掘数据将其转化为知识,再由知识提炼成智慧以获取洞察。大数据思维在很多行业都有用武之地,比如在银行行业,基于大数据的风险控制体系就是一个很好的例子。通过大数据技术重构的机器学习算法不仅可以在全量样本数据上进行训练,还能引入更多的维度参与学习,从而构建一个比传统技术更高效、更准确的信用征信评分体系。同样,在电商行业也有很多大数据应用的例子。比如电商企业通过对手中大量的用户行为数据进行分析挖掘,可以得知用户的喜好并绘制出完善的用户画像。这使得电商企业能够更加了解自己的客户,从而对他们进行精准营销和相关商品推荐。

类似的例子数不胜数,这些案例的背后大数据技术功不可没。作为这个时代的参与者,我们的企业理应做好充足向大数据领域转型的技术准备,以免在这个时代落伍。

在这个转型的过程中最为重要的环节之一便是技术平台的建设。1.1 缺乏统一大数据平台的问题

大数据思维需要依托大数据技术的支撑才能得以实现,所以隐藏在背后的支撑平台非常重要。正所谓下层基础决定上层建筑,没有一个牢固的地基是建不成摩天大楼的。我们不妨设想一下作为一个投身于大数据领域的企业,如果没有一个统一的大数据平台会出现什么问题。1.1.1 资源浪费

通常在一个企业的内部会有多个不同的技术团队和业务团队。如果每个团队都搭建一套自己的大数据集群,那么宝贵的服务器资源就这样被随意地分割成了若干个小块,没有办法使出合力,服务器资源的整体利用率也无法得到保证。这种做法无疑是对企业资源的一种浪费。

其次大数据集群涉及的技术繁杂,其搭建和运维也是需要学习和运营成本的。这种重复的建设费时费力且没有意义,只会造成无谓的资源浪费。1.1.2 数据孤岛

如果企业内部存在多个分散的小集群,那么首先各种业务数据从物理上便会被孤立地存储于各自的小集群之中,我们就没有办法对数据进行全量的整合使用,数据便失去了关联的能力,大数据技术使用全量数据进行分析的优势也丧失了。

其次,在这种情况下也很难实现对业务数据进行统一的模型定义与存储,一些相同的数据被不同的部门赋予了不同的含义,同一份数据就这样以不同的模型定义重复地存储到了多个集群之中,不仅造成了不必要的存储资源浪费,还造成不同部门之间沟通成本的增长。1.1.3 服务孤岛

企业内部各自为政的小集群的首要任务是支撑团队或项目组自身的业务场景来满足自身的需求,所以在实现功能的时候不会以面向服务的思维来抽象提炼服务,很可能都没有可以暴露出来供小集群外部使用的服务。退一步讲就算这些小集群有提供出来的服务,那么它们也缺乏统一的顶层设计,在做服务设计的时候没有统一的规则,导致提供的服务参差不齐,其访问入口也很有可能不统一。同时这些服务被分散在不同的集群之中,应用程序不能跨越多个集群使用所有的服务。1.1.4 安全存疑

企业内部各项目组或团队自身维护的小集群通常都是只为支撑自身业务而实现的,不会同时面对多个用户。企业通过一些行政管理手段可以在一定程度上保障集群的安全。但是当团队人员扩充、集群规模扩大或是大数据集群的服务同时面向多个技术团队和业务部门的时候,很多问题就会显露出来。首当其冲的便是需要面对多用户的问题,集群不再只有一个用户,而是需要面对多个不同的用户。这就自然而然地引出一系列需要切实面对和解决的问题,比如用户的管理、用户的访问控制、服务的安全控制和数据的授权等。小集群通常都处于“裸奔状态”,基本没有什么安全防护的能力。集群安全涉及方方面面,是一个非常复杂的系统工程,不是轻易能够实现的。1.1.5 缺乏可维护性和可扩展性

大数据领域的技术发展日新月异,其本身正处于一个高速的发展期,我们的集群服务会时不时需要进行更新以获得新的能力,或是需要安装补丁以修复Bug。在这种情况下对多个小集群进行维护就会变得非常麻烦。同时当某个小集群性能达到瓶颈的时候也没有办法很容易地做到横向扩容。1.1.6 缺乏可复制性

各自为政的小集群缺乏统一的技术路线,导致大数据集群的运维工作会缺乏可复制性。因为一个部门或者团队与其他部门使用的技术组件可能完全不一样,这样一个集群的安装、维护和调试等经验就没有办法快速复制和推广到其他团队或部门。同时在大数据应用研发方面也会存在同样的问题,正常来讲当我们做过的项目越多,从项目中获得的经验也就越多,我们能从这个过程中提炼、抽象和总结一些经验、规则或是开发框架来帮助我们加速今后的应用研发。但是技术路线的不统一很可能导致这些先验经验丧失后续的指导意义。1.2 构建统一大数据平台的优势

如果我们能够化零为整,在企业内部从宏观、整体的角度设计和实现一个统一的大数据平台,引入单一集群、单一存储、统一服务和统一安全的架构思想就能较好地解决上述的种种问题。

1.资源共享

使用单一集群架构,可以实现通过一个大集群来整合所有可用的服务器资源,通过一个大集群对外提供所有的能力。这样将所有服务器资源进行统一整合之后,能够更加合理地规划和使用整个集群的资源,并且能够实现细粒度的资源调度机制,从而使其整体的资源利用率更加高效。同时集群的存储能力和计算能力也能够突破小集群的极限。

不仅如此,因为只使用了一个大集群,所以我们现在只需要部署和维护一个集群,不需要重复投入人力资源进行集群的学习和维护。

2.数据共享

使用单一存储架构,可以实现将企业内部的所有数据集中存储在一个集群之内,方便进行各种业务数据的整合使用。这样我们便能够结合业务实际场景对数据进行关联使用,从而充分利用大数据技术全量数据分析的优势。同时,在这种单一存储架构之下,各种业务数据也可以进行统一的定义和存储,自然的也就不会存在数据重复存储和沟通成本增长的问题了。

3.服务共享

通过统一服务架构,我们可以站在宏观服务化设计的角度来考虑问题,可将一套统一服务设计规则应用到所有的服务实现之上,同时也能统一服务的访问入口与访问规则。

除此之外,因为所有的服务是由一个统一的大集群提供的,这便意味着这些服务不存在孤岛问题,可以进行整合使用。

4.安全保障

通过统一安全架构,可以从平台层面出发,设计并实现一套整体的安全保证方案。在单一集群架构的基础之上,可以实现细粒度的资源隔离;在单一存储架构的基础之上可以实现细粒度的数据授权;在单一服务架构的基础之上可以实现细粒度的访问控制;如此等等。

5.统一规则

由于统一的大集群实现了技术路线的统一,这使得我们在后续应用开发的过程中有很多施展拳脚的空间。比如我们可以通过在大数据应用的开发过程中得到的一些经验总结,将这些经验整理为方法论和模型,再基于这些理论和模型实现一套大数据平台开发的SDK。最终通过这套SDK,可以很方便地将这些经验快速复制推广到整个企业内部。

6.易于使用

在开发一款大数据产品或者业务的时候,我们应当将主要的精力放在业务的梳理和实现之上,而不应该过多地关注平台底层细节,如集群服务的安装、维护和监控等。

比较理想的方式是直接将应用构建在一个大数据平台之上,通过面向平台服务的方式进行应用开发,或是借助平台工具直接以交互的方式进行数据分析。通过平台服务和工具的形式暴露平台能力,屏蔽平台底层细节。应用开发者直接使用平台服务接口进行应用开发,数据科学家、数据分析人员直接使用平台提供的工具进行交互式数据查询与分析。1.3 企业级大数据平台需要具备的基本能力

既然化零为整的大数据平台有这么多的优势,那么这个平台落到实处应该长什么样子呢?我们不妨更进一步来探讨一下这个问题。还记得之前我们谈到过大数据思维重视的是全量样本数据而不是局部数据,在企业运营过程中产生的海量数据是企业珍贵的财产,从这些数据中可以挖掘出宝藏。对于大数据平台的一切能力需求可以说都是由这些“大数据”的特性产生的。

那么这些大数据是从何来而的呢?这得益于IT技术的迅猛发展,ERP、CRM这类IT系统在多个行业均得以实施。同时随着移动互联网、智能穿戴设备和物联网等领域的迅猛发展,企业在运营的过程中会接收到大量的数据,这些数据可能是来自于生产系统产出的数据,也可能是终端设备的用户数据或是来自于机器产生的日志数据。面对海量的数据,我们会遇到一个又一个接踵而至的问题。

为了支撑一个与数据量“体积相当”的存储和计算平台,其集群规模必定不会小。所以我们首先会面临如何管理一个单体大集群的问题。其次,当数据接入之后,我们又会面临如何高效地存储和查询这些数据的问题。接着还会面临如何管理这些数据、如何保障数据安全等一系列问题。

这些现实的问题直接刻画出一个企业级大数据平台需要具备的基本能力。接下来我们具体看一看这些能力。1.3.1 集群管理与监控

大数据的相关服务之所以能够处理与存储海量数据,其根本原因是采用了分而治之的设计思想。一台服务器的存储容量达到了瓶颈就分成多台服务器进行分布式存储;一台服务器的计算能力达到了瓶颈就使用多台服务器进行分布式运算。再考虑到服务的高可用、负载均衡等要求,自然而然地又会产生一些主备和负载的方案出来。讲到这里,我们已经可以看出,大数据的服务背后是由一系列分布式集群服务组成的。这意味着对于大数据平台的运维团队而言,需要面对很多的服务器以及在这些服务器部署的很多的组件与服务。

如果没有对整个集群进行统筹的管理与监控的能力,那么运维团队在做集群运维的时候将无从下手。所以大数据平台需要集群能够统筹地管理与监控。1.3.2 数据接入

现在我们知道在大数据应用领域,数据是核心资源,这些数据是企业的宝贵财富,我们对业务模型的建立、分析和挖掘都需要建立在这些原始数据之上,而这些数据通常具有以下几个特点;

1)来源多:这些原始数据可能来源于各种地方,比如来自本地文件或是关系型数据库中的表,或是通过网络爬虫获取到的HTML页面,或是通过通信协议接受到的机器报文,等等。

2)类型杂:这些原始数据拥有不同数据类型,比如文件属于非结构化的数据,关系型数据库中表属于结构化数据,而HTML页面属于半结构化数据。

3)体量大:这些原始数据可能非常多,因为现如今企业内部存储的数据量正在急剧增长。特别是一些互联网企业,其每天的数据增长可能就达到TB级。

由此我们可以得知大数据平台需要能够对接各种来源和各种类型的海量数据。1.3.3 数据存储与查询

在数据接入大数据平台之后,就需要考虑如何存储这些海量数据的问题了。根据业务场景和应用类型的不同我们会有不同的存储需求。

1.关系型数据模型

试想一下数据仓库的场景。数据仓库的定位主要是应用于联机分析处理(OLAP),它不需要支持事务性的操作,只用专注于分析场景。它需要能够提供秒级到分钟级的海量数据查询能力。

在这种基于大数据技术的数据仓库背后,就是由一套支持关系型数据模型的分布式存储和查询引擎支撑的。为了支撑关系型数据模型,需要在分布式文件系统之上附加元数据管理的能力和SQL查询引擎的支持。又因为对查询的时效性要求很高并且数据量特别巨大,所以还需要使用高效的压缩与存储结构来进行数据的存储。

2.非关系型数据模型

试想一下这样的场景,在一些实时数据计算的场景中,会有大量数据通过消息管道进入大数据平台,这些数据在实时计算的同时也需要存储下来;或是在分布式计算的场景中,各个服务器进程之间需要一个第三方扩展存储来共享一些中间计算结果。

这些场景通常都会采用非关系数据模型进行存储,并且要求毫秒到秒级的查询能力。所以需要存储服务在分布式文件系统之上建立索引结构,同时充分利用内存的能力进行性能提速。

3.文档数据模型

Google的搜索服务改变了人们使用互联网的方式,它背后的核心武器便是搜索引擎。同样的,企业级搜索引擎的出现也改变了企业内部查找数据的方式。这些海量的数据会以文档数据模型的方式进行存储,并且要求毫秒级的查询能力。

由此我们可以得知大数据平台需要能够提供不同的存储模型和查询手段以满足不同的业务场景和需求。1.3.4 数据计算

在数据接入并存储下来之后,就需要考虑如何使用这些数据了。比如对数据进行加工、转换、映射、查询,进行业务处理或者进行数据挖掘,等等。根据业务场景的不同会有不同的计算需求。

1.离线批处理

大数据具有体量大和价值密度低的特性,这意味着这些数据通常并不能直接拿来使用,在真正使用之前可能需要清洗加工。在数据量非常大但是对时效性要求不高的场景下,可以使用离线批处理的方式来执行。

比如在机器学习场景下,在使用数据之前通常需要做数据清洗、转换映射、归一化等一系列预处理动作;或是在搜索引擎场景下,需要将已获取的数据转换成索引文件。这些场景都很适合使用分布式离线批处理来执行。

2.实时计算

在一些对时效性要求很高的场景中,通常在数据接入的同时就需要实时地对数据进行业务逻辑处理并输出结果。比如在一些预警类型的应用中,需要根据实时接收的数据即刻做出预警判断;或是在一些风险控制类型的应用中需要实时地计算出用户的风险评级。这些场景都需要非常高的实时响应性,传统的离线批处理手段此时就显得有些力不从心了。也正因为如此,催生出了很多分布式实时计算的解决方案。

3.机器学习

从某种程度来说,大数据技术使得机器学习这门从20世纪50年代便已存在的“古老学科”焕发了青春。因为通过大数据技术,机器学习的算法可以直接使用全量数据进行模型的训练,而不是使用局部的样本数据,同时还能利用分布式技术进行高效的模型训练并得到结果。机器学习对我们的应用十分重要,因为我们的预测、预警和分析类应用底层都需要在机器学习的众多算法上实现。

4.多维分析

得益于IT技术的迅猛发展,ERP、CRM这类IT系统在电力、金融等多个行业均得以实施。这些系统在提升企业运营效率的同时也记录了大量原始的明细数据。利用这些原始数据可以进行一些分析或产出报表来辅助企业决策。比如我们销售的商品最近几个月是增长了还是降低了?喜欢我们产品的消费群体是什么年龄段的?这类功能就可以使用多维分析来实现。

5.全文搜索

如何在茫茫的数据海洋之中迅速查找到自己想要的信息呢?这就是搜索引擎大显身手的时候了。不同于传统数据库的模糊匹配查询,全文搜索是基于自然语义进行查询条件输入的。通过搜索引擎提供的全文搜索能力,我们可以实现一步直达数据。这项能力在企业级知识库、智库这类应用场景中非常有用,并且数据量越大越能体现出它的优势。

不仅如此,由于全文搜索能够快速检索的特性使得它能够在非常快的速度下选取和查询条件相关的数据集,所以其他的分析系统可以借用搜索的特性进行结合。基于搜索引擎的多维分析设计就基于这样的思路诞生的,通过全文搜索筛选数据然后使用计算引擎执行计算。

由此我们可以得知大数据平台需要能够提供多个领域、多种途径的数据处理和计算手段。1.3.5 平台安全与管理

作为一个企业级大数据平台产品,企业内部的大数据产品都会构建在这个平台之上,安全问题自然不容小视,我们至少会面对如下这些问题:

1.用户管理

作为一个面向多个技术团队和业务团队的大数据平台,多用户机制自然必不可少。用户是我们平台资源分配对象的基本单元,诸如数据授权和服务访问授权这类资源的分配最终就需要和用户进行绑定。不仅如此,在整个平台之中还会涉及多方用户。诸如Linux系统本地用户、管理系统的用户和集群用户等。这些用户如何集成和统一也是一个问题。

所以我们必须拥有一套行之有效的用户集成方案来解决这些问题。

2.数据隔离与访问授权

作为一个统一存储的大数据平台,自然会存储不同业务和团队的各种数据。这些数据不应该对所有人可见。不同的应用之间应该拥有独立的数据存储空间,不同的用户应该只能使用被授权访问的数据。

所以我们需要一套行之有效的数据隔离和授权机制。

3.访问控制

大数据平台提供了许多基于HTTP协议的WEB UI控制台和Restful API接口服务。管理员通过这些WEB UI控制台可以了解平台的运行状况,应用程序可以通过Restful API接口服务查询数据。为了保障平台服务安全,必须对这些资源进行访问控制,很显然应该只有管理员才能够访问这些控制台,应用程序也应该只能访问到属于自己的那部分接口服务。

通过硬件防火墙的方式来进行防护虽然可以解决部分问题,但是这样控制的粒度过于粗犷。所以在软件层面,我们必须拥有一套行之有效的基于用户粒度的访问控制机制。

4.集群服务安全

大数据平台底层是由一组分布式集群服务所组成的,这意味着会有很多不同的服务器进行协同工作,各个服务器上的程序进程之间会进行大量消息通信和数据传输。同时这些服务也提供了许多命令行脚本工具用以执行各种操作。

为了保障这些集群间消息通信和数据传输的安全可信,以及防止命令行脚本工具被恶意执行,我们必须拥有一套安全可靠的认证协议并在此协议之上构建出一套集群服务间的认证通信方案。1.4 平台辅助工具

大数据平台作为一个技术支撑平台,它面向的用户群体至少包括应用开发、平台运维和数据分析这三类用户群体。这三类用户因为自身的工作职责不同导致其关注平台的视角也会不同。应用开发的职责是基于技术平台开发应用,基于平台编写程序,所以他们更关注的是开发SDK、程序调试跟踪的方式;平台运维的职责是保障大数据平台的正常稳定运行,所以他们关注的是平台的各种监控指标。而数据分析的职责是基于平台数据做数据分析,所以他们关注的是如何使用机器学习相关算法,用最快的速度验证自己的想法并得出反馈。

通过前面的介绍,我们可以知道大数据平台的基本能力从底层技术角度已经覆盖了这三类用户的需求,但是这样将赤裸裸的底层技术直接拿出来给用户使用,对于用户来说体验真是太糟糕了。所以大数据平台需要一层纽带将原始的底层技术能力和终端活生生的人联系起来。这层纽带便是由众多辅助平台使用的工具所组成的,它们可以大幅度降低大数据平台的使用门槛,并增强平台的易用性和友好性。

1.开发套件

相比于传统的软件编程方式,大数据领域的程序开发会复杂很多。为了迎合分治思想,同时能够使程序以最大的并行度执行,我们的程序都会以多线程的方式分布式地运行在多台服务器之上,这就使程序的开发和调试难度陡增。除此之外,在程序的设计思路上,大数据领域也和传统领域有着显著的不同,例如大数据领域的存储技术可以突破传统关系型数据库的诸多限制,使得一张单表拥有上千列和数亿行成为可能。这就使得我们可以使用与以往软件完全不同的设计思路去实现一些功能。

所以大数据平台应该拥有与之适配的一套SDK开发套件,将底层的复杂逻辑进行封装从而对上层应用屏蔽,同时提供一套简单易用的开发接口和一系列辅助开发和调试的工具。

2.任务管理与调度

得益于单一集群架构,集群内的所有服务器资源现在可以由一个统一的资源调度系统进行整合使用。因此,我们开发的数据导入、离线计算等程序都需要以任务的形式提交到调度系统。于是便有了对各种任务进行提交、状态跟踪、日志查询和执行周期性调度等需求。

所以大数据平台应该能提供一个可视化的任务管理与系统对内部对所有应用任务进行控制和监管。

3.自助式数据探索分析

数据分析、数据挖掘可以说是一个循环往复的过程。不断地通过抛出假设、建立模型、验证假设、修正模型这样一个循环过程渐进明细。这些步骤通常需要专业的大数据开发工程师以代码编程的形式进行实现。然而,我们必须面对这样一个不幸的事实,专业的程序开发工程师通常不善于数据分析的理论和算法,而专业的数据科学家又不精通程序开发。能够同时精通数据分析和程序开发的人可谓是凤毛麟角。

所以大数据平台应该能够提供一个可视化的数据分析系统,可以让数据科学家使用类似SQL这样简单易学的方式进行自助式的数据分析,从而可以在不需要编写任何程序的情况下直接进行多种方式的数据探索与分析。1.5 本章小结

通过本章的介绍,我们了解到了在一个企业之中,如果缺乏统一的大数据平台会出现的诸多问题,例如资源浪费、数据孤岛、服务孤岛和安全隐患等。那么,如果能够化零为整,在企业内部从宏观、整体的角度设计和实现一个统一的大数据平台,通过引入单一集群架构的概念去整合资源与服务,就能解决上述的种种问题,从而能够体现诸如资源共享、数据共享和服务共享的优势。

为了落实这样一个统一的大数据平台,我提出了一些平台应该具备的最基本的能力需求。

数据接入:在大数据的应用领域,自始至终都是围绕着数据在做文章。所以首先需要面对的是如何把海量数据接入到平台的问题。结合大数据来源多、类型杂、体量大的特征,可以得知大数据平台需要能够对接各种来源和各种类型的海量数据。

数据存储与查询:在数据接入进来之后,就需要开始考虑如何将数据持久化存储并提供数据查询能力的问题了。为了应对不同的业务场景,平台需要提供多种不同的存储媒介以满足千奇百怪的存储与查询需求,所以平台需要提供诸如关系型模型、非关系型模型以及文档模型的存储系统。

数据计算:在数据接入并存储下来之后,还需对数据进行进一步的加工、分析和挖掘,这就是数据计算的范畴了。这里包括离线批处理、实时计算、机器学习、多维分析和全文搜索等场景。

平台安全与管理:作为一个企业级大数据平台产品,安全问题自然不容小视。平台需要解决诸如用户管理、数据隔离与访问授权、访问控制和集群服务安全等问题。

平台辅助工具:大数据领域相比传统的企业及应用,在平台运维和程序研发等方面都显得更为复杂和困难。所以为了提高平台的易用性并降低平台的使用门槛,这里还需要提供一些平台的辅助工具,诸如程序开发套件、任务管理与调度系统、自助式数据探索分析系统等。

在下一章中,我们会了解到基于Hadoop生态体系去搭建一个具备上述能力的企业级大数据平台所需要用到的技术栈。第2章企业级大数据平台技术栈介绍

让我们将时间的指针拨回到2002年,那时候还没有“大数据”一词,处理海量数据的技术还不为众人所知。Doug Cutting在创建了开源的全文搜索函数库Lucene之后想进一步提升,在Lucene上加入网络爬虫和一些Web服务。于是在2002年10月,Doug Cutting和Mike Cafarella一起创建了开源的网络搜索引擎Nutch。实现一个分布式的搜索引擎并不容易,在分布式环境中如何实现一个可靠的高可用系统一直都是个难题。2003年10月,Google发表了著名的《Google File System》论文,描述了Google内部使用的高可用的分布式文件系统GFS。这篇论文给了Doug Cutting和Mike Cafarella很大的灵感,于是在2004年7月,他们在Nutch中实现了类似GFS的功能NDFS(Nutch Distributed File System)。Nutch面对的另一个问题是如何将海量的数据转化成索文件。2004年10月,Google发表了著名的论文《MapReduce》,描述了Google内部使用的一种基于MapReduce模型的分布式计算框架。2005年12月,Mike Cafarella在Nutch中实现了MapReduce的首个开源版本。2006年1月Doug Cutting加入Yahoo,创建了Hadoop项目,试图将开源的MapReduce和DFS发展成一个真实可用的系统。

2006年2月,Apache Hadoop项目正式启动以支持MapReduce和HDFS的独立发展。开源的大数据技术逐步进入了人们的视野。

如果在十年前,我们能够使用的开源技术可能仅仅只有Hadoop的HDFS和Map-Reduce。经过这么多年的发展,现如今当我们提到Hadoop的时候早已不再单单指Hadoop这个开源项目本身了。Hadoop一词已经成为大数据开源技术生态的代名词。Hadoop的生态体系已经发展得非常丰富了,基于Hadoop生态催生出了各式各样的技术框架。我想其根本原因是因为人们对大数据的诉求已经从当年的“吃得饱”转变为现在的“吃得好”了。人们不单要求能够存储和计算海量数据,还想越来越廉价地存储海量数据,越来越快地计算数据。不仅如此,大数据涉足的领域也越来越广泛,像批处理、流计算、机器学习、人工智能和物联网等领域都能看到一些技术框架的身影。与此同时Hadoop生态体系也变得更为多元化了,出现了像基础设施、管理和服务等多种细分领域。

接下来会开始介绍基于Hadoop开源技术路线去实现一个企业级大数据平台会使用到的一些重要技术栈(更多的技术栈介绍请参见附录B)。因为本书的定位不是对某个专项技术进行深入介绍的书籍,所以只会挑选一些我认为比较重要的组件进行介绍,目的是完善本书的上下文。如果读者想更加深入地了解每项技术,可以阅读相应组件的专项介绍书籍。2.1 HDFS2.1.1 概述

HDFS是Hadoop分布式文件系统(Hadoop Distributed File System)的简称,它是一个被设计成适合运行在廉价机器上的分布式文件系统,是Google分布式文件系统(GFS)的开源实现。HDFS能提供高吞吐量的数据访问,非常适合在大规模数据集上应用。同时也是一个具备高度容错性的系统。

把HDFS放在首位来介绍是因为它是如此的重要,称它为平台的基石也不为过。这是为什么呢?因为文件系统在软件系统架构中永远都是处于最为重要的基础部分。在传统的单机系统架构中,文件系统通常是由操作系统的文件系统直接支撑的,而HDFS在分布式系统架构中扮演着底层文件系统的角色,是其他分布式系统的基石。

如果想要实现一个分布式架构的系统,必然需要面对解决分布式存储的问题。因为作为一个健壮的、可扩展的分布式系统,自然而然地会有一些状态和数据需要进行持久化保存,这就会涉及分布式存储。如果一个分布式系统其底层的文件系统不是分布式的,那么它的存储就会存在单点问题,不能称为一个健壮的系统。2.1.2 RAID技术

在正式介绍HDFS的设计之前,我想先带大家回忆一下传统的RAID(独立冗余磁盘阵列)技术。

RAID技术是由加州大学伯克利分校在1987年提出的,最初是为了组合多个小的廉价磁盘来代替大的昂贵磁盘,同时希望磁盘损坏时不会使数据的访问受损而开发出的一种数据保护技术。RAID可以提升硬盘速度和增大硬盘容量,并且提供容错功能以确保数据安全性。它易于管理的优点使得在任何一块硬盘出现问题的情况下都可以继续工作,应用程序不会受到损坏硬盘的影响。

1.RAID0

RAID0的思路简单来说是将每个文件拆分成多个数据块,然后将各个数据块分别存储到多块不同的磁盘之上。在读写文件的时候可以采用异步并行的方式同时操作多个数据块,以此来提升文件的读写性能。其次通过这种方法也能突破单块磁盘的存储限制从而提升存储容量,如图2-1所示。

文件以数据块为单位被平均存储在不同的磁盘之上,两块磁盘之上不会存在相同的数据块。

2.RAID1

RAID1的思路简单来说是将每个文件分成多个数据块,然后同时将一个数块冗余存储到多块不同磁盘之上。那么在一块磁盘损坏的情况下不会造成数据的丢失,如图2-2所示。图2-1 由两块磁盘组成的RAID0示意图图2-2 由两块磁盘组成的RAID1示意图

文件以数据块为单位同时存储在多块磁盘之上,两块磁盘之上会存在相同的数据块。

3.HDFS与RAID

现在我们再回到HDFS这儿来。通过刚才对RAID技术的简单回顾我们不难发现,从某种角度来看HDFS最根本的设计思路其实和RAID技术是一样的,只是HDFS是从软件层面来实现的RAID。

HDFS首先以数据块作为文件的最基本单元,然后通过分块存储的方式增强数据的读写性能并突破单机的物理存储瓶颈(RAID0)。接着使用数据块多份冗余存储的方式实现数据的可靠性,保证数据不会丢失(RAID1)。

接下来我们介绍一下HDFS的一些重要特性。2.1.3 核心设计目标

1.硬件错误

在HDFS的运行环境中,硬件错误是常态而不是异常。因为HDFS集群可能是由成百上千的服务器所组成的,每个服务器上存储着文件系统的部分数据。这些服务器可能是廉价的通用硬件,这意味着它们不够稳定,随时可能损坏。因此错误检测和快速、自动恢复是HDFS最核心的架构目标。

2.流式数据访问

运行在HDFS上的应用需要以流的方式访问它们的数据集,在这一点上它和普通的应用有所不同。HDFS的设计中更多考虑是数据的批处理场景,而不是用户交互式处理。HDFS更关注于数据访问的高吞吐量。

3.大规模数据集

运行在HDFS上的应用具有很大的数据集。HDFS上的一个典型文件大小通常都在GB级至TB级之间。因此,HDFS被调试成支持大文件存储。它应该能提供整体上高的数据传输带宽,能在一个集群里扩展到数百个节点。一个单一的HDFS实例应该能支撑数以千万计的文件。

4.简单的一致性模型

HDFS应用需要一个“一次写入多次读取”的文件访问模型。一个文件经过创建、写入和关闭之后就不需要改变。这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。

5.移动计算比移动数据更划算

一个应用请求的计算,距离它操作的数据越近就越高效,在数据达到海量级别的时候更是如此。因为这样就能降低网络阻塞的影响,提高系统数据的吞吐量。将计算移动到数据附近,比将数据移动到应用所在之处显然更好。HDFS提供了将应用移动到数据附近的接口的功能。2.1.4 命名空间

HDFS支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。这种设计使得我们在使用HDFS的时候会感觉和使用本地文件系统毫无差异。

Namenode负责维护文件系统命名空间的元数据和操作日志。其中,元数据由fsimage镜像文件保存,它等同于HDFS命名空间的一个快照文件,保存了所有文件的地址、描述和创建时间等信息。Namenode在启动的时候会将fsimage中的信息载入内存以供客户端访问。而操作日志则由edites文件保存,任何对文件系统命名空间或属性的修改都将被写入edites文件并被记录下来,当edites文件的大小增长达到阈值的时候,HDFS会将fsimage文件和edites文件进行合并,生成新的fsimage快照。

应用程序可以设置HDFS保存的文件的副本数目,这个信息也是由Namenode保存的。默认情况下文件的副本系数是3,HDFS默认的存放策略是将一个副本放在本地机架的节点上,一个副本放在同一机架的另外一个节点上,最后一个副本放在不同机架的节点上。2.1.5 数据模型

与很多其他的文件系统类似,HDFS也使用了数据块来作为它的最小数据存储单元。正如同在RAID技术小节里介绍的那样,HDFS通过将底层物理的文件系统抽象成逻辑数据块,从而突破了单机磁盘的物理存储极限(类似RAID0),同时也提升了读写性能(类似RAID1),实现了冗余存储。

但与其他文件系统不同的是,在HDFS中一个典型的数据块大小是128MB(HDFS2.7版本将默认的64MB升到了128MB),HDFS中的每个文件都会被按照128MB切分成不同的数据块,每个数据块会按照设置的副本策略分布到不同的Datanode中。HDFS中数据块的大小远远大于其他文件系统,这主要是针对大规模的流式数据访问而做的优化。更大的数据块意味着更多的文件顺序读写和更小的数据块管理开销。2.1.6 Namenode和Datanode

HDFS从设计上看是一个Master/Slave架构的服务,如图2-3所示。一个HDFS集群是由一个Namenode和一定数目的Datanode组成。Namenode是一个中心服务器,负责管理文件系统的命名空间以及客户端对文件的访问。集群中的Namenode负责管理它所在节点上的存储。HDFS暴露了文件系统的命名空间,用户能够以类似Linux文件系统的形式在上面存储数据。Namenode执行文件系统的命名空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。图2-3 HDFS逻辑架构图

客户端发送创建文件请求的时候这个请求其实并没有立即发送给Namenode,HDFS客户端首先会将文件数据缓存到本地的一个临时文件中去。直到这个临时文件的大小累积到了一个数据块的大小时,客户端才会联系Namenode。Namenode会记录这个文件的元数据并分配一个Datanode的数据块给它。之后客户端将本地临时文件传到指定的Datanode上。假设该文件的副本系数是3,则当第一个Datanode接收到一小部分数据之后就将这部分数据写入本地仓库,并同时传输该部分到第二个Datanode。第二个Datanode同样也会将接收到的小部分数据写入本地仓库,同时将该数据传输给第三个Datanode。第三个Datanode收到数据之后将数据写入本地仓库。2.1.7 使用场景

在所有的软件架构中,底层文件系统永远都是最为重要的基础设施之一。HDFS作为Hadoop生态主要的分布式文件系统,可以说是一切其他系统的基石。

1.文件服务器

因为HDFS具有分布式存储、高可用和友好的文件系统接口等特性,所以其可作为分布式文件服务器使用,用来存储海量的大型文件或附件。

2.作为文件系统构造其他大数据产品

在实现一些大型分布式存储或分析系统的时候,我们必然会面临分布式文件存储的需求,而重新实现一套安全可靠、性能优异的文件系统谈何容易。这时便可以直接使用HDFS作为底层的分布式文件系统,在其上构造其他存储或分析系统。HDFS移动计算的设计思想非常契合分布式计算系统。2.2 Zookeeper2.2.1 概述

Zookeeper是一款分布式协同管理框架,是Google Chubby的开源实现,主要用来解决分布式应用中经常会遇到的一些问题。在很多场合交流的过程中,我发现大家对Zookeeper会有很多疑问。虽然我们在很多分布式系统中经常能够看到Zookeeper的身影,但是却说不出它到底是干什么的,它在分布式系统中扮演着什么样的角色。在很多Zookeeper的介绍中提到它是进行分布式系统协同管理的,那么分布式协同管理又到底是在管理些什么呢?

要回答上述的这些问题,我们首先要聊一聊实现一个分布式系统时会遇到的一些难题。既然是分布式系统,我们的程序进程自然会在多台服务器上协同进行工作,那么我们要解决的第一个问题是配置同步的问题。当配置文件有更新的时候,如何快速地将运行在多台服务器上的程序配置进行同步更新?Master/Slave架构是分布式系统中常见的一种集群模式,即通过一个Master节点统一管理协调多个Slave节点。那么这里就会面临第二个问题,Master节点如何感知Slave的存在?比如现在有多少个Slave连接到Master了?它们的状态是健康的还是异常的?当Master节点不可用的时候,通常需要从Slave节点中选举一个新的Master保持服务的正常运作,那么这个选举过程如何实现?

你看,我们只是随便聊了一会就列举出了这么多个令人头疼的问题。可想而知如果从零开始构建一个分布式的集群服务是多么困难。Zookeeper的作用就是帮助我们来解决这些琐碎的令人头疼的事情。

如图2-4所示,Zookeeper自身拥有高度的可靠性、可扩展性和容错性,能提供统一命名服务、分布式锁、分布式队列、选举、配置同步、心跳检查等功能。有了Zookeeper的帮助,开发实现一个分布式系统就会显得容易很多。像HBase、Kafka、SolrColud等众多知名框架都是使用Zookeeper实现分布式协同管理的。图2-4 Zookeeper的逻辑架构图

Zoo keepr的逻辑架构也是一个典型的主从架构,它从众多Server服务中通过选举产生一个主控节点。2.2.2 核心特性

Zookeeper的目标是基于自身去构建更为复杂的分布式应用场景,例如分布式数据库、分布式消息系统和分布式搜索引擎这类实时性要求很高的系统,所以它自身被设计得非常快速、非常简单。同时,为了能够支撑分布式场景下事务的一致性,Zookeeper提供了一些核心特性:

·顺序一致性:客户端发送的更新请求将按照发送的顺序进行执行。

·原子性:更新操作只会有更新成功或失败两种状态,不会存在其他状态。

·单一系统视图:客户端连接到任意的服务器都将看到相同的数据视图。

·可靠性:一旦一个更新动作被执行,所有的服务器都将执行这个更新动作。

·及时性:客户端看到的视图在一定时间内保证是最新的。2.2.3 命名空间

Zookeeper允许分布式进程通过共享一个分层的命名空间来相互协同,这有点类似Linux文件系统的树形目录结构。这种结构在Zookeeper的术语中称为Znodes。但与Linux文件系统不同的地方在于,它没有目录和文件之分,所有节点均被称为Znode。

并且Znode可以直接挂载数据,Znode也可以嵌套Znode。与Linux文件系统类似,名称是以斜杠(/)分隔的路径元素序列,其中每个节点都有路径标识,如图2-5所示。图2-5 Zookeeper命名空间结构2.2.4 数据模型

Zookeeper将Znode的数据保存在内存中,这是它能实现高吞吐量和低延迟性能的重要原因。为了增强可靠性,Zookeeper会同时将这些数据以操作日志和快照的形式持久化到磁盘之上,以免进程重启的时候数据丢失。

Znode节点分为三种类型,它们分别是:

·Persistent Nodes:Persistent Nodes是永久有效的节点,除非client显式地删除它,否则它会一直存在。

·Ephemeral Nodes:Ephemeral Nodes是临时的节点,仅在创建该节点client与服务器保持会话期间有效,一旦会话失效,Zookeeper便会自动删除该节点。同时Ephemeral Nodes节点不能含有子节点。

·Sequence Nodes:Sequence Nodes是顺序的节点,这类节点在创建的时候,Zoo-keeper会自动在节点路径末尾添加递增序号。同时在创建的时候client也能设置它的生命周期是永久有效的还是会话绑定的。2.2.5 节点状态监听

简单来说,Zookeeper在Znode上设计了多种监听事件,例如创建一个子节点、修改节点、删除节点等。我们的客户端程序可以在这些监听事件中注册自己的回调函数,当某个事件发生的时候,就会自动触发其相应的回调函数。注意,在Zookeeper中回调函数是一次性的,这意味着一旦函数被触发,它就会被移出监听列表。如果程序需要永久的监听事件,就需要持续的进行回调函数注册动作。

Zookeeper的节点监听机制是一项非常有意思的能力,利用这项能力可以在Zookeeper的基础上实现很多炫酷的功能。例如:

1.服务发现

微服务架构是现在很热门的一种服务架构模式,其中的服务发现功能就可以通过Zookeeper实现。只需要在一个指定Znode上注册并创建子节点的监听事件,例如/service节点。当有新的服务上线之后便在/service节点下创建一个代表相应服务的子Znode,这时就会触发相应的回调事件,我们的主程序就能知晓新上线的服务信息了。

2.配置同步

在分布式系统中,当服务的配置发生变动时,如何快速及时地将配置变化更新到各个服务器,一直都是一个十分头疼的问题,借助Zookeeper的事件监听机制便能轻松实现。

首先,在Zookeeper上创建一个指定的Znode用于存储配置信息,例如/app/config节点。接着,让分布式系统中所有的服务进程监听/app/config节点的数据修改事件。当配置发生变化的时候,各个服务进程便会触发配置修改的回调函数,这样便能实现快速、可靠的配置同步功能了。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载